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

可以看到这是一个32-bit的文件,NX保护开启
将文件拖入ida,按F5将汇编代码转换成c语言代码,得到

read(0, &s, 0x100u)可以输入0x100字节的内容s;
sprintf(&format, "Repeater:%s\n", &s) sprintf 把用户输入s拼接到Repeater:后面再加换行存入 format 缓冲区;
printf(&format)存在格式化字符串漏洞
这个题没有system函数,没有/bin/sh,只有printf(&format)格式化字符串漏洞。所以我们考虑用这个漏洞泄露puts@got中存储的puts函数的真实地址,用于获得system函数的真实地址,然后再次利用这个漏洞将printf@got中存储的地址改成system函数的真实地址,最后写入我们的/bin/sh,达到system("/bin/sh")的效果,所以我们三次循环达成目的。
返回虚拟机
gdb pwn动态调试

可以看到我们输入的AAAA,在第七个参数里有一个A,在八个参数里有三个,被分开了,所以我们输入五个A,看一下

所以我们需要先输入一个A,再输入我们的地址(放在了第八个参数)
nano exp.py 开始写攻击脚本

payload:泄露puts@got里存储的puts函数的真实地址,进而得到system函数的真实地址;
payload2:改写printf@got里存储的地址为system函数的真实地址 ;
fmtstr_payload(8,{printf_got:system_addr},write_size='byte',numbwritten=0xa)
8:格式化字符串漏洞偏移,栈上第 8 个参数指向我们可控输入缓冲区{printf_got:system_addr}:要把printf_got地址改写为system_addrwrite_size='byte':用%hhn按单字节分次写入,适配 32 位numbwritten=0xa:printf 在遇到第一个%前,已经输出了10 字节 (Repeater:A),工具要基于这个已输出字节数计算%c填充量。
最后发送b";/bin/sh\x00":";" 是 shell 命令分隔符,执行前面无效字符串后直接执行后面的/bin/sh。
#在这里我尝试了用LibcSearcher,但是给出的libc没有一个可以打通。根据题目里给出的这是一个Ubuntu 16,猜测我们需要的是Ubuntu16.04 libc‑2.23‑0ubuntu11 i386这个libc库,询问AI,就得到了固定偏移
puts 0x05f140
system 0x03a940
保存退出
python3 exp.py
cat flag

此题完