# ARMv5でのPCの振る舞いについて ###### tags: `arm` @6H8pvZw8SZGVQ5E4AmpM_A ARMv5でCTFをしていたときに、armのお気持ちが分からなくて泣いていたんですが、解決したので備忘録として載せておきます。 今回は、Rop Emporiumの[split](https://ropemporium.com/binary/split_armv5.zip)を解いていました。 ## 問題のアセンブリ usefulFunction()を動かして覗いてみるとsystem('/bin/ls')を実行している。 ```105dc:e59f0008 ldr r0, [pc, #8]```の命令を見てみると、どう見ても```.word 0x000106c8```に飛んでいない。 (なぜならpcから```.word 0x000106c8```までは16byte離れているはずだから。) ``` ✦ ❯ rabin2 -z split_armv5 [Strings] nth paddr vaddr len size section type string ――――――――――――――――――――――――――――――――――――――――――――――――――――――― 0 0x00000660 0x00010660 21 22 .rodata ascii split by ROP Emporium 1 0x00000678 0x00010678 6 7 .rodata ascii ARMv5\n 2 0x00000680 0x00010680 8 9 .rodata ascii \nExiting 3 0x0000068c 0x0001068c 43 44 .rodata ascii Contriving a reason to ask user for data... 4 0x000006bc 0x000106bc 10 11 .rodata ascii Thank you! 5 0x000006c8 0x000106c8 7 8 .rodata ascii /bin/ls 0 0x0000103c 0x0002103c 17 18 .data ascii /bin/cat flag.txt ``` ``` 000105d4 <usefulFunction>: 105d4: e92d4800 push {fp, lr} 105d8: e28db004 add fp, sp, #4 105dc: e59f0008 ldr r0, [pc, #8] ; 105ec <usefulFunction+0x18> 105e0: ebffff81 bl 103ec <system@plt> 105e4: e1a00000 nop ; (mov r0, r0) 105e8: e8bd8800 pop {fp, pc} 105ec: 000106c8 .word 0x000106c8 ``` ## 原因はなんだったのか https://stackoverflow.com/questions/24115899/arm-ldr-instruction-on-pc-register に以下のような記述があります。 ![](https://i.imgur.com/2vp9qUw.png) 本当かどうか実際に [ARM Instruction Set](https://iitd-plos.github.io/col718/ref/arm-instructionset.pdf) を覗いてみると,こんな感じに書いてありました。 ![](https://i.imgur.com/BNQb1J6.png) どうやらpcからの下駄(8byte)+即値をldrでは読み取るらしいです。 お気持ちとしてはpc+4はまぁいつもやっていて、pcからの範囲の値を読み取るときに+8からしか読み取らないだろうと思ってこういう挙動にしているのかもしれないです。(予測です。) ## まとめ 分からなすぎて助けを求めたときに一緒に探してくれた方々(神様たち)に感謝を申し上げます。特にstack-overflowでいい感じの記事を見つけてくださったじぶりん君に感謝!!