泰皇娱乐逆向学习之画堆栈图一_HUC惠仲娱乐

泰皇娱乐

  • 一. 程序以及要求

    从0x401168开始       工具:DTDebug       调试程序: helloword.exe       见附件下载
  • 二. 开始打开程序找到0x401168

    1. 双击打开DTDebug

    2. 接着将helloword.exe程序拖入DTDebug,或者F3打开helloword程序

    3. 现实是77开头的,修改成00开头的,如下图设置,然后重启

    4. 用control+g 找到对应的位置

    5. 在开始的位置按下F2下断点,可以看到背景变成了红色

    6. 点这个箭头,让程序走到下断点的地方,背景变成了黑色

  • 三,开始画堆栈图

    1. 首先画现在的栈即此时ESB和EBP的值

    2. 按两次F8
      执行

      PUSH 2  PUSH 1

      堆栈图

      验证图

    3. 按下F7进入函数,如果按F8会走到0x00401171
      执行

      按下F7会把0x00401171押入栈里,EIP的值变成0040100A
      堆栈图

      验证图

      jmp指令不影响堆栈,按回车继续操作,来到继续画堆栈图的地方

    4. 接上图继续画堆栈图
      执行

      PUSH EBP

      堆栈图

      验证图

    5. 接着画
      执行

      MOV EBP,ESP

      堆栈图

      验证图

    6. 接着上面的接着画
      执行

      SUB ESP,40

      堆栈图

      验证图

    7. 接下来画下条指令的堆栈图
      执行(下面这三条指令是保存现场)

      PUSH EBX  PUSH ESI  PUSH EDI

      堆栈图

      验证图

    8. 继续画接下来的指令
      执行

      LEA EDI,DWORD PTR SS:[EBP-40] ; 取[EBP-40]地址编号放到EDI里,堆栈不变,EDI里的值0x0018FEAC

      堆栈图

      验证图

    9. 接着画接下来的三条指令
      执行(REP受ECX的影响,ECX是几就执行几次,这里是执行16次,因为10是十六进制的)

      MOV ECX,10  MOV EAX,CCCCCCCC  REP STOS DWORD PTR ES:[EDI]

      堆栈图

      验证图

    10. 接下来的两条指令
      执行(栈顶和栈底不变,执行mov时EAX变成1,执行ADD时EAX变成3)

      MOV EAX,DWORD PTR SS:[EBP+8] ADD EAX,DWORD PTR SS:[EBP+C]

      堆栈图

      验证图

    11. 接下来的三条pop指令
      执行(恢复现场)

      POP EDI POP ESI POP EBX

      堆栈图

      验证图

    12. 接下来一条mov指令
      执行

      MOV ESP,EBP

      堆栈图

      验证图

    13. 继续
      执行

      POP EBP ;pop带有赋值

      堆栈图

      验证图

    14. 倒数第二步
      执行(RETN的本质是POP EIP)

      RETN

      堆栈图

      EIP的值变成0x00401171
      验证图

    15. 最后一步
      执行(这一步是堆栈平衡)

      ADD ESP,8

      堆栈图

  • 四,总结
    1. 想要学好逆向,必须得了解堆栈是什么   2. 画堆栈图是个耐心活,画之前需要了解汇编语言。   3. 函数调用前后堆栈平衡