type
status
date
slug
summary
tags
category
icon
password
😀
为啥要开个这个专题,一方面是为了巩固自己在逆向基础的知识,另一方面是为了给以后的学弟指一条明路吧,以前的时候太依赖IDA的F5了,这次学习从另一个角度重新学习逆向

📝 函数

notion image

函数

汇编眼中的函数

由于现在编译器的发展,使得我们的代码得到了极大的优化,这使我们编译出的代码并不是那么适合调试,因此笔者选择VC++ 6.0 进行编写
notion image
notion image
然后将生成的exe拖到x32dbg里面,定位到main函数 ,我们此时断在的这个点就是我们要调用的函数,这里我们选择堆栈图来进行描述
首先进行call test.401005
call 其实也是一种push的操作,相当于把下一个指令的地址压入栈中
notion image
这个时候我们发现EIP的值发生了变化,eip的值就是下一个指令的地址
至于开头这个jmp,是编译器搞的,可以不用去理解这个
之后就是push操作,我们不再一步一步分析,直接画出堆栈图,然后再一一对比
notion image
notion image
我们发现最后堆栈是平衡的。

裸函数

notion image
然后我们运行之后发现会报错,然后我们可以看一下反汇编
notion image
之后就会发现这个跟我之前再x32dbg里面调的不一样,这个里面全都是int3 中断
那么如何让这个程序正常运行起来呢,我们可以采用内联汇编的方式

局部变量的体现

notion image
notion image
这里就不像上一个有过多的文字描述了,看堆栈图即可

裸函数(局部变量定义)

我们要学会举一反三

返回值的传递

notion image
我们经过堆栈图的分析之后
notion image
发现跟之前那个一模一样
call 完函数之后,eax是我们最后return的值,但是这里的[ebp - 4]是 恢复堆栈平衡之后的地址,这里其实是main函数里面的局部变量

裸函数(返回值的传递)

这里做个小练习
对比之后发现是一模一样

参数的传递

示例

裸函数(参数的传递)

嵌套调用分析

分析堆栈图
notion image
这是第一层函数的内部,第一层函数的堆栈图如下
notion image
notion image
notion image

调用约定

调用约定
参数压栈顺序
平衡堆栈
__cdecl
从右至左入栈
调用者清理栈
__stdcall
从右至左入栈
自身清理堆栈
__fastcall
ECX/EDX 传送前两个 剩下:从右至左入栈
自身清理堆栈
💡
有关学习上的问题,欢迎您在底部评论区留言,一起交流~
2024春秋联赛-夏季赛关于爆破迷宫路径的一系列思考
Loading...
5m10v3
5m10v3
目前主攻方向为Re
Announcement
🎉5m10v3のBlog已经上线啦🎉
-- 感谢各位师傅的支持 ---
👏欢迎师傅们前来交流👏