---
# System prepended metadata

title: ARMv5でのPCの振る舞いについて
tags: [arm]

---

# 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でいい感じの記事を見つけてくださったじぶりん君に感謝！！



