1.首先打开靶机,下载所需pwn文件,并将其载入虚拟机中。
2.在虚拟机中打开终端,输入checksec pwn1 对文件进行检查分析。
3.发现是64位的ELF文件,用ida进行反编译。出现汇编代码,按F5键转变为C语言代码。
4.发现gets函数,其存在栈溢出漏洞,利用其特性可以编写攻击脚本进行远程操控,找到我们想要的flag文件。在此之前,需要找到gets函数的覆盖内容大小,其大小包括gets函数本身范围加上return之上的ebp大小,所以接下来,找到ida反编译的C语言代码中,双击gets函数的地址&s,出现下图。
5.从图中可以看出,r对应的字节数为8,及ebp的的大小;两个s之间从1到F这个距离是gets函数的范围大小,为F。因为是在十六进制下,所以上面所说的gets函数覆盖范围大小为0x8+0xF。
6.然后我们寻找返回值return函数的地址,在脚本中编写为我们想修改的代码。就要在ida中点击fun函数,找到下方括号里的401186(同样也是十六进制下)。
7.创建攻击脚本。打开终端,输入vim XXX.py。回车按i键插入随意内容,再按ctrl+c,回车再按:wq保存并退出。创建了XXX.py的脚本文件。
8.编写攻击脚本。
from pwn import*:导入pwn库;
r=remote:连接远程端口,及输入靶机上的端口信息;
getflag:输入所编写的我们想得到的返回值return;
payload:构建攻击载荷,由之前得到的gets函数覆盖范围大小和return函数的地址相加最后加上p64下的getflag+1(由于栈平衡要统一数据大小方便寄存器读取数据);
io.sendline:发送所求数据并回车;
io.interactive():交互数据并获得io控制权。
8.打开终端,输入python3 创建的文件名.py,回车,再按ls,交互成功,输入cat flag,得到flag文件。输入回靶机即可。