본문 바로가기

wargame/hackCTF

[hackCTF]pwnable Basic_BOF #1

Basic_BOF #1

파일을 다운받을 수 있는 링크와 원격 접속 포트를 알 수 있다.
문제를 풀어 얻은 flag 값을 제출하는 형식이다.


wget 명령어로 파일을 다운로드 받는다. chmod 명령어로 실행 권한을 주면 준비가 끝난다.


gdb를 이용해 어셈블리 코드를 확인하는 방법도 있지만 그냥 아이다로 편하게 확인하자.
(F5를 눌러 수도코드로 확인하자)

왼쪽 Functions window를 확인하면 main 함수 이외에는 딱히 생성한 함수는 없는 것 같다.
fgets함수를 이용해 stdin으로부터 45바이트를 받아 s에 저장하는데 v5가 0xDEADBEEF이면 쉘을 딸 수 있다.
쉘에서 플래그를 탈취할 수 있다.


NX가 enabled 되어 있으므로 쉘코드를 삽입하여 문제를 해결할 수 없다.
그러니 v5의 값을 바꿔 문제를 해결하자.

fgets가 45바이트를 받기 때문에 다행히도 s로부터 28바이트(0x34-0xC) 떨어진 곳에 위치한 v5를 바꿀 수 있다.
payload를 아무 값이나 0x28 + 0xDEADBEEF(v5에 넣고 싶은 값) 을 주면 된다.
(아무 값 40byte + v5에 넣을 값 4byte + fgets 끝에 넣는 null 1byte = 45byte)

다음 내용을 바탕으로 exploit.py를 작성했다.

(p32 함수는 인수를 주소 형식으로 변환해준다)

우선은 local의 bof_basic을 실행시켜 확인해보자.


실행권한을 주고 실행해보면 문제를 해결했음을 확인할 수 있다.

이제 원격으로 실행시키자.


flag를 발견했다.

문제해결

참고
https://stackoverflow.com/questions/1660228/does-fgets-always-terminate-the-char-buffer-with-0

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

[hackCTF]pwnable x64 Buffer Overflow  (0) 2019.11.27
[hackCTF]pwnable 내 버퍼가 흘러넘친다!!  (0) 2019.11.27
[hackCTF]pwnable Baisc_BOF #2  (0) 2019.11.27