xiaoxiaoY520 发表于 2024-1-30 16:15

ida反汇编堆栈不平衡导致无法分析如何手动修复堆栈平衡

起因:想了解smc是什么,找了个2020的ctf题jocker,看了网上的资料,搜到一篇比较顺眼的博客(https://blog.csdn.net/CSNN2019/article/details/115328038),大致看了一下后准备自己看看,PE文件拖进ida后并没有他文中所说的跳错误,ida分析堆栈不平衡的错误倒是存在,但偏移有点区别,照他文中进行修复貌似不对,偏移量不同,不知是否是ida版本不同导致,我是ida7.7的。


问题:网上搜了很多文章都是说alt+k修改ret最近的call,直到ret的sp偏移为0,但是行不通,我觉得并没有从原理上讲如何修复,纯粹是某种情况适用(也可能是我没有理解,见识少,刚遇到这个问题)。显示出ida的栈偏移值,有一块地方不是很理解,如下图:

这一块不是对齐后创建新栈帧吗,此时esp和ebp不是在同一个地方,然后.text:00401733 004 51   push    ecx才是sp-4?为什么在text:00401731 004 89 E5   mov   ebp, esp处他就已经偏移4了,是我的ida有问题还是我理解错了,望解答。

飘零星夜 发表于 2024-1-30 16:48

本帖最后由 飘零星夜 于 2024-1-30 16:53 编辑

我手动改,在 return 的前一条语句用 IDC 命令 add_auto_stkpnt:
add_auto_stkpnt

Add automatical SP register change point
   func_ea- function start
   ea       - linear address where SP changes
                usually this is the end of the instruction which
                modifies the stack pointer (cmd.ea+cmd.size)
   delta    - difference between old and new values of SP
returns: 1-ok, 0-failed

success add_auto_stkpnt(func_ea, ea, sval_t delta);

================================================================
你的图2. 前面显示的是 当前指令执行之前,sp的压栈情况:
push 就是 压栈, -4了,所以下一条就是4, //但是此时显示的是还没执行指令的sp。 所以是 000
后面又来一次 push ,然后 push的下一条 前面就是8.

xiaoxiaoY520 发表于 2024-1-31 10:08

飘零星夜 发表于 2024-1-30 16:48
我手动改,在 return 的前一条语句用 IDC 命令 add_auto_stkpnt:
add_auto_stkpnt



了解了,这边显示的是新栈帧的相对偏移。昨天晚上我试了一下,应该是我ida也有问题,换了其他ida偏移就正常了。
页: [1]
查看完整版本: ida反汇编堆栈不平衡导致无法分析如何手动修复堆栈平衡