32位
32位的栈帧是这样的
栈溢出基本思路是覆盖掉返回地址和参数,执行system()函数从而/bin/sh拿到flag
64位
64位的栈帧也是这样的
但是在 Linux 上,前六个参数通过 RDI 、 RSI 、 RDX 、 RCX 、 R8 和 R9 传递;
而在 Windows 中,前四个参数通过 RCX 、 RDX 、 R8 和 R9 来传递
而第七个(windows下第五个)参数才push进参数的地方
所以我们要做的首先还是找到system()
传参的时候则是找到指令为
pop rdi
ret
的地方
使用scp命令把文件从本机传到虚拟机桌面
scp local_file remote_username@remote_ip:remote_folder
remote_folder那里写绝对路径 eg:/home/username/Desktop
//利用ROPgadget寻找
//ROPgadget --binary morton.dms --only 'pop|ret' | grep rdi
//binary(Specify a binary filename to analyze 指定要分析的二进制文件名
//morton.dms 文件名
//only(Only show specific instructions 仅显示特地指令
//grep 查找符合条件的字符串(外部指令
pop rdi目的是可以通过溢出自由地改动rdi的值(即参数值
ret等价于pop rip
目的是让我们跳转到目的函数(system
然后就可以得到flag了