本文作者:Wu J (二进制逆向星球学员)
C语言中的函数
三个关键点:局部变量、参数、函数返回值
下面是示例程序:
#include "stdafx.h"
int Plus(int x, int y)
{
int z = 2;
return x+y+z; }
int main(int argc, char* argv[])
{
int r = Plus(3, 4);
return 0;
}
3. call指令
一般的mov等指令无法改变eip的值,但是call可以call 00401005: a.将eip的值改为函数所在的地址0x00401005 b.将函数的ret address 压入堆栈保存
4.进入函数后,保留现场,划分堆栈
5.PUSH EBP
保留原栈底位置
6.提升堆栈,创建缓冲区
7.填充缓冲区
LEA EDI,DWORD PTR SS : [EBP - 44] (EDI中存放缓冲区的最顶地址)MOV ECX ,11 MOV EAX , CCCCCCCCREP STOS DWORD PTR ES : [EDI]
8.定义局部变量
一般情况下:ebp - n 是局部变量 ebp +n 是参数 EBP + 4 是返回地址(因此凡是想修改 ebp + 4 的指令都必须小心)
9.执行加法
EAX存放函数返回值
10.恢复堆栈
MOV ESP,EBP
POP EBP 恢复栈底
11.ret指令
将堆栈中函数的返回地址pop到eip中
ADD ESP,8 平衡堆栈
扫描下方二维码加入Web安全攻防星球学习
加入后会邀请你进入内部微信群,内部微信群永久有效!
本文始发于微信公众号(Ms08067安全实验室):二进制逆向学习笔记:堆栈图解析汇编中函数调用的过程
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论