이번에 풀이할 문제는 HackCTF의 x64 Buffer Overflow다. 지금까지는 32bit 문제에서 exploit을 진행했지만, 문제 명으로도 알 수 있듯이 이번 문제는 64bit 문제에서 exploit을 진행한다.
file 명령어로 문제 파일의 정보를 확인해보면 64bit라는 것을 알 수 있다.
실행해보면 첫 줄에 입력을 받는데, 이 입력한 값을 바탕으로 두 번째 줄에서 Hello <입력 값>으로 문구를 출력해준다.
일단 ida로 문제 파일을 열어봤다.
char형 변수(배열로 추정) s, int형 변수 v5를 선언하고 scanf 변수를 통해 문자열을 입력 받은 후, v5는 s의 문자열 길이를 담고, printf 함수를 사용해 Hello <s의 문자열> 형식으로 출력해준다.
bof를 일으킬 수 있는 취약한 함수인 scanf를 사용하기 때문에 bof를 통한 쉘 코드 삽입 및 ret overwrite 등을 생각할 수 있다.
일단 gdb으로 문제 파일을 열고 info func 명령어를 통해 함수 목록을 확인해 봤다.
main 함수 외로도 callMeMaybe라는 함수가 존재하는 것을 볼 수 있다.
해당 함수를 ida로 확인해보면 /bin/dash 쉘을 얻게해주는 함수인 것을 볼 수 있다.
쉘 코드를 쓸 필요없이 ret를 조작해 이 함수가 실행되게끔 구현하면 되겠다.
일단 여러번 gdb로 열어봤지만 주소가 안바뀌는 것을 보아 aslr을 걸려있지 않다. callMeMaybe 함수의 주소인 0x0000000000400606을 bof를 통해 ret에 넣어주면 되겠다.
from pwn import *
payload = b"A" * 280 + p64(0x0000000000400606) # payload
p = remote("ctf.j0n9hyun.xyz", 3004) # CTF 서버 접속
# p = process("./64bof_basic") local
p.sendline(payload) # payload 전송
p.interactive()
s 변수에서 ret까지 거리가 268(11c - 10, s와 v5의 거리) + 4(v5의 크기 int) + 8(sfp, 64bit 환경이므로 8byte다.) = 280이다. 따라서 280만큼 더미 값으로 채워주고 callMeMaybe 함수의 주소인 0x0000000000400606를 p64 함수로 64bit 리틀 엔디안으로 패킹해서 payload를 생성한 후 sendline을 통해 전송하면 된다.
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] Basic_FSB (2) | 2021.05.05 |
---|---|
[HackCTF] x64 Simple_size_BOF (0) | 2021.04.28 |
[HackCTF] 내 버퍼가 흘러넘친다!!! (0) | 2021.03.18 |
[HackCTF] Basic_BOF #2 (0) | 2021.03.16 |
[HackCTF] Basic_BOF #1 (0) | 2021.03.15 |