zoukankan      html  css  js  c++  java
  • 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:指出查看的内存起始位置
    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

  • 相关阅读:
    一、Dapper基本操作
    Javascript基础--函数(Function对象)
    【Selenium专题】FAQ_浏览器_ChromeDriver版本导致报错
    mvn install 报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2 错误: 找不到符号
    Eclipse中mvn install 报错error in opening zip file
    Maven项目编译时报错缺少tools.jar
    maven-compiler-plugin 版本错误解决方法
    【QTP专题-优化】VBS脚本启动QTP并运行测试
    QTP 场景恢复– 函数调用
    达梦数据库(DaMeng)如何删除IDENTITY自增属性字段
  • 原文地址:https://www.cnblogs.com/Lnju/p/5281038.html
Copyright © 2011-2022 走看看