IOS逆向【5】GDB调试helloworld

1. gdb载入待调试程序

Administratormato-iPhone:~ root# gdb ./hello

2. 查看程序入口点

(gdb) info file
Symbols from "/private/var/root/hello".
Mac OS X executable:
    /private/var/root/hello, file type mach-o-le.
    Entry point: 0x0000be44
 ```

###3. 断在程序的入口点

(gdb) b *0x0000be44
Breakpoint 1 at 0xbe44
(gdb) r
Starting program: /private/var/root/hello
Reading symbols for shared libraries ....................................... done

Breakpoint 1, 0x0000be44 in start ()


###4. 查看汇编代码

x /20i $pc



###x命令

**x**是GDB查看内存的指令,用法:

>x/<n/f/u> <addr>


>addr:指出查看的内存起始位置
>n: 给出一个数,指出查看几个单元的内存,单元的字节数由u来定,缺省值:1
>u: 给出一个[bhwg]之一,分别表示单字节,双字节,四字节,八字节,缺省值:w,四字节
>f: 给出显示的格式


| f可选格式 | |
| -- | -- |
| x | 十六进制 |
| d | 十进制 |
| u | 十六进制unsigned int|
| o | 八进制 |
| c | 字符 |



### 查看寄存器

> (gdb) i r 查看所有寄存器
> 
> (gdb) i r a   # 查看所有寄存器(包括浮点、多媒体)
> 
> (gdb) i r lr pc #查看单个寄存器


### 修改寄存器

(gdb) i r r0
r0 0xbe44 48708
(gdb) set $r0 = 0x44be
(gdb) i r r0
r0 0x44be 17598

### 函数调用约定

__text:0000BE68                 BLX             _main

blx由bl+bx的组合命令

**bl **:把本指令的下一条指令地址给lr(r14)寄存器暂存,然后跳转到 _main地址去执行。

**bx **:带状态切换的跳转指令。会判断_main地址的位[0]是否等于1,等于1则置位CPSR寄存器的T标志,同时跳转到main开始的指令当做thumb指令执行;相反如果_main地址的位[0]等于0,则main开始的指令当做arm指令执行。

这里_main的地址是0000BE70,最低位是0,所以还是thumb指令。**最低位是0也就是一个偶数的地址所以指令都是thumb地址。**

bx就是把这2个指令结合使用。


对比x86的子函数调用指令call而言,blx指令把返回地址不是放在栈上,而是给了寄存器lr。

到了main函数

__text:0000BE70 PUSH {R7,LR}
__text:0000BE72 MOV R7, SP
__text:0000BE74 SUB SP, SP, #0x20

push指令,从右到左push进栈。备份返回地址,r7.
sp指令暂存到r7。
sp减,给出局部变量空间。

程序末尾:

__text:0000BF4E ADD SP, SP, #0x20
__text:0000BF50 POP {R7,PC}
```
sp恢复
恢复r7,pc

GDB调试需要重定向的程序

gdb ./test
r < data.in

你可能感兴趣的:(IOS逆向【5】GDB调试helloworld)