【逆向】第九章 堆栈图
发布日期:2021-05-28 19:13:29 浏览次数:32 分类:精选文章

本文共 731 字,大约阅读时间需要 2 分钟。

案例

打开OD,点option,debuging options,选中winmain,打开

找指令

选中一条,鼠标左键点一下,ctrl+G,把地址输入进去,点OK。然后就可以定位了,这时候不能按F8,因为CPU还没有跑到这一行。用鼠标左键点一下,F2下断点,CPU还在程序打开OD那,点播放键到这个断点位。

堆栈画法

这个时候画堆栈图要关注ESP和EBP。画出初始的堆栈图,如下图所示,黄色代表的是初始堆栈,而ESP和EBP之间还有很多内存地址,这里用一块来表示。

按下F8。此时栈底没有变化,但是栈顶变化了,如图为执行push 2后的堆栈图。再往下F8,执行了push 1,而ESP减4。这个时候不能按下F8,,按下以后程序就执行完了。然后按下F7。

call指令

call指令相当于mov dword ptr ds:[esp-4],[eip + 当前call指令字节数]。执行后如下:jmp指令不影响堆栈图,直接按下enter。然后pop edi,pop esi ,pop ebx ,这三个寄存器的值都在栈顶,把他们依次打出来,刚好保存到对应的寄存器:恢复现场。

此时堆栈图无变化。然后mov ebp,esp,之后pop ebp,最后RETN:相当于pop,eip。

函数

传参数不一定通过堆栈,也可以通过寄存器返回值我们可以存入寄存器,也可以通过内存,eax值叫做返回值,一个函数可以没有参数也没有返回值。

3性质

堆栈作用是用来存储程序执行过程中的临时数据,函数调用、函数返回等操作都会在堆栈上进行。函数的起始执行位置和返回点需要通过堆栈来标记,确保程序的正确执行。调用一个函数之前和调用一个函数之后,堆栈应该保持平衡,堆栈顶和堆栈底的指针位置不会变化。

上一篇:【逆向】第十章 C语言函数格式及反汇编
下一篇:【逆向】第八章 JCC

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月18日 10时43分31秒