
【逆向】第九章 堆栈图
发布日期: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性质
堆栈作用是用来存储程序执行过程中的临时数据,函数调用、函数返回等操作都会在堆栈上进行。函数的起始执行位置和返回点需要通过堆栈来标记,确保程序的正确执行。调用一个函数之前和调用一个函数之后,堆栈应该保持平衡,堆栈顶和堆栈底的指针位置不会变化。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月18日 10时43分31秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Lepus搭建企业级数据库全方位监控系统
2025-04-05
LESS 中的变量有什么作用?如何声明和使用变量?
2025-04-05
Less 日常用法
2025-04-05
Lettuce 移动框架 for Romantic
2025-04-05
let、const、var的四点区别( 代码示例 )
2025-04-05
LexPredict法律词典项目教程
2025-04-05
LF.73.Combinations Of Coins
2025-04-05
LFS最终幻想
2025-04-05
lftp命令详解
2025-04-05
lib/libstdc++.so.6: version `GLIBCXX_3.4.30‘ not found (required by /lib/x86_64-linux-gnu/libLLVM-15
2025-04-05
libcurl 发送邮件_C++ 邮件推送 (smtp+libcurl+openssl)
2025-04-05
Libevent 事件管理和添加事件
2025-04-05
libevent-简单的定时器
2025-04-05
libevent在windows下使用步骤详解
2025-04-05
Libevent源码分析(一):最小堆
2025-04-05
libgdx的菜单配置,以及json文件的结构
2025-04-05
libiconv字符集转换库在C#中的使用
2025-04-05
liblognorm编译
2025-04-05
libmpg123 解码库用法
2025-04-05