返回地址如果能覆盖为我们的代码地址,就可以执行自己的代码。

 

1. 刚进入函数时,栈顶是0019FF44,返回地址00401234

python 栈溢出 栈溢出 shellcode_调用函数

 


 

2. 调用fscanf完成后,返回地址己被覆盖,如果能覆盖为有效的代码地址,就能执行想要的代码。

python 栈溢出 栈溢出 shellcode_python 栈溢出_02

 


 

3. 返回地址具体覆盖为什么值,不能写死,否则通用性差,例如开了随机基址时写死的值无法使用。如果程序中能找到jmp esp,再把此代码的地址覆盖到返回地址,就能实现目的。此代码称为跳板,机器码为FFE4。通用跳板地址:7FFA4512

python 栈溢出 栈溢出 shellcode_python 栈溢出_03

 

 

4. 栈空间可能不够,我们准备两份文件。第一份文件的shellcode加载后先提升栈顶,再调用函数读取第二份shellcode文件。第二份shellcode文件可以做实际要做的事。

 

 

5. 第一份shellcode文件代码如下:

python 栈溢出 栈溢出 shellcode_python 栈溢出_04

 


 

6. 第二份shellcode文件是实际工作的代码,可弹出MessageBox