gdbを読む
-
gdb 7.12.1
- include/gdb/callback.h
- host_callbackとCB_SYSCALLの定義
#define CB_SYS_write 5
(4ではない)
- sim/common/callback.c
- sim/common/syscall.c
- cb_syscall()
- switch-caseでCB_SYS_writeを処理
- cb_syscall()
- sim/arm/armos.c
- ARMulator
- デバッグモニタ
- ブートローダ強化版みたいな
- 独自のシステムコール番号←Linuxのそれと異なる
- Demon
/* This file contains a model of Demon,
- Angel
- ADP (Angel Debug Protocol)
- 引数のデータの先頭のアドレスをr1に入れる方式
- ADP (Angel Debug Protocol)
- RedBoot
- ARMul_OSHandleSWI(state, number)
- numberが以下のどれかのときwriteする→
swi #0
に対応する処理がない- Demon: SWI_Write(=0x69)←Demon
- RedBoot: 0x180001かつ r0が5
-
Angel: AngelSWI_(ARM→0x123456 Thumb→0xab) かつ r0がAngelSWI_Reason_Write(=5)
- ADP_Stopped_ApplicationExit←デバッグ用
- numberが以下のどれかのときwriteする→
- sim/README-HACKING
- なんかいろいろ書いてある
- システムコール発行時にはcb_syscall()が呼ばれる
実機とgdb
- 実機のDebian/ARMではうごくのにgdbのシミュレータでは動かないアセンブラ←なぜ?
- https://sechack365.backlog.jp/view/SECHACK365_TRAINEE2018-55
- eABIで、r7にwrite(=4)をセットしたあと
swi 0
する
.data
msg: .asciz "hi system call\n"
.set len, . - msg
.text
.global _start
_start:
mov r0, #0
ldr r1, msgaddr
mov r2, #len
mov r7, #4
swi #0
mov r7, #1
swi #0
.align 4
msgaddr: .long msg
- Debian/ARMサーバのほうはeABIっぽい
user@debian-armel:~$ gcc -dumpmachine arm-linux-gnueabi
- gdbなどのtoolchainのパッケージは他のABI(oABI?)がデフォルトで、eABIのを使うには-eabiとついたものを入れる必要がある…?
- grepしてみてもPowerPCのeABIしか出てこない…w
- gcc-arm-none-eabiのソースコードにはsim/(シミュレータ)が含まれていない…どこにあるんだろう?
- 以下のように書き換えたら動いた
swi #0x69
- 逆にeABIなDebian/ARM上でこれを動かすと出力されない
.data
msg:
.ascii "hi system call\n"
len = . - msg
.text
.globl main
main:
mov r2, #len
ldr r1, msgaddr
mov r0, #1
swi #0x69
.align 4
msgaddr:
.long msg
Backlinks
SecHack365
SecHack365は学生(と社会人)が、1年間指導を受けながらセキュリティに関連したり関連しなかったりするテーマで何かをつくる長期ハッカソン。無料で、交通費も全部出る。筆者は2018年度に、「ライブラリ・リンカ・ローダ・コンパイラetcを連携させたセキュリティ機能の開発」というテーマで参加した。