type
status
date
slug
summary
tags
category
icon
password
为啥要开个这个专题,一方面是为了巩固自己在逆向基础的知识,另一方面是为了给以后的学弟指一条明路吧,以前的时候太依赖IDA的F5了,这次学习从另一个角度重新学习逆向
📝 函数
函数
汇编眼中的函数
由于现在编译器的发展,使得我们的代码得到了极大的优化,这使我们编译出的代码并不是那么适合调试,因此笔者选择VC++ 6.0 进行编写
然后将生成的exe拖到x32dbg里面,定位到main函数 ,我们此时断在的这个点就是我们要调用的函数,这里我们选择堆栈图来进行描述
首先进行call test.401005
call 其实也是一种push的操作,相当于把下一个指令的地址压入栈中
这个时候我们发现EIP的值发生了变化,eip的值就是下一个指令的地址
至于开头这个jmp,是编译器搞的,可以不用去理解这个
之后就是push操作,我们不再一步一步分析,直接画出堆栈图,然后再一一对比
我们发现最后堆栈是平衡的。
裸函数
然后我们运行之后发现会报错,然后我们可以看一下反汇编
之后就会发现这个跟我之前再x32dbg里面调的不一样,这个里面全都是int3 中断
那么如何让这个程序正常运行起来呢,我们可以采用内联汇编的方式
局部变量的体现
这里就不像上一个有过多的文字描述了,看堆栈图即可
裸函数(局部变量定义)
我们要学会举一反三
返回值的传递
我们经过堆栈图的分析之后
发现跟之前那个一模一样
call 完函数之后,eax是我们最后return的值,但是这里的[ebp - 4]是 恢复堆栈平衡之后的地址,这里其实是main函数里面的局部变量
裸函数(返回值的传递)
这里做个小练习
对比之后发现是一模一样
参数的传递
示例
裸函数(参数的传递)
嵌套调用分析
分析堆栈图
这是第一层函数的内部,第一层函数的堆栈图如下
调用约定
调用约定 | 参数压栈顺序 | 平衡堆栈 |
__cdecl | 从右至左入栈 | 调用者清理栈 |
__stdcall | 从右至左入栈 | 自身清理堆栈 |
__fastcall | ECX/EDX 传送前两个 剩下:从右至左入栈 | 自身清理堆栈 |
有关学习上的问题,欢迎您在底部评论区留言,一起交流~
- Author:5m10v3
- URL:https://5m10v3.top/article/4173339e-99c3-457d-b3d9-13f211f76b1e
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!