本人也是在自学过程,主要目的也是记录学习过程,有些地方做的不太好,都是按照自己理解进行讲解的(不专业),欢迎大家指出问题
此处我将文件命名为inndy_rop
file inndy_rop

可以看到这是一个32-bit的文件,并且是statically linked
checksec inndy_rop查看一下保护机制

可以看到只有NX保护开启了
将文件拖入ida,按F5,将汇编代码转换成c语言代码,得到

可以看到明显的gets栈溢出,需要输入0xc+4的垃圾数据直到return address
按shift+F12,再按ctrl+F,搜索/bin/sh发现没有,而且这是一个静态链接,没有system函数,所以这个题需要我们自己手动输入/bin/sh,并拼接execve("/bin/sh")
我们需要找一块空闲的bss缓冲区,用来填写我们的/bin/sh
按shift+F7,双击.bss那一行,得到

我们往下滑,找一段空闲区域,比如我接下来要用到的bss_addr = 0x80eafd0
回到虚拟机
ROPgadget –binary inndy_rop –only "pop|ret" | grep eax

得到pop_eax_ret = 0x80b8016
ROPgadget –binary inndy_rop –only "pop|ret" | grep ebx

得到pop_edx_ecx_ebx_ret = 0x806ed00
ropper –file inndy_rop –search "int 0x80"(在这里用ROPgadget,找不到int 0x80;ret)

得到int_80_ret = 0x806f430
nano exp.py 开始写攻击脚本

其中,第一行payload用于调用read函数,写入/bin/sh,第二行的payload用于调用execve,拼接execve("/bin/sh")
补充:

保存退出
python3 exp.py
cat flag

得到flag
CTF2{4f3bc1f1-25ea-4c18-ae8c-d50dbe6a295a}
此题完
网硕互联帮助中心
评论前必须登录!
注册