二进制逆向学习笔记:堆栈图解析汇编中函数调用的过程

admin 2021年6月6日00:00:50评论114 views字数 839阅读2分47秒阅读模式

本文作者: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; }

画堆栈图:

esp:栈顶

ebp:栈底

对于函数调用,先压入参数,再执行call

对于参数,从右向左依次压入堆栈(stdcall模式) 因此,本程式先压入4,再压入3

1.调用前的堆栈

二进制逆向学习笔记:堆栈图解析汇编中函数调用的过程


二进制逆向学习笔记:堆栈图解析汇编中函数调用的过程


2.PUSH 4 PUSH 3 向栈内压入4,esp -4,eip向下一条向栈内压入3,esp-4,eip向下一条

二进制逆向学习笔记:堆栈图解析汇编中函数调用的过程


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安全攻防星球学习

加入后会邀请你进入内部微信群,内部微信群永久有效!

二进制逆向学习笔记:堆栈图解析汇编中函数调用的过程

目前20000+人已关注加入我们

二进制逆向学习笔记:堆栈图解析汇编中函数调用的过程




本文始发于微信公众号(Ms08067安全实验室):二进制逆向学习笔记:堆栈图解析汇编中函数调用的过程

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年6月6日00:00:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   二进制逆向学习笔记:堆栈图解析汇编中函数调用的过程http://cn-sec.com/archives/292955.html

发表评论

匿名网友 填写信息