버퍼 오버플로우에 관련된 문제인것같다.

64비트 프로그램 하나를 줬다. 흐름을 알아봐야겠다.

함수들을 살펴보다가 camllmemaybe라는 함수가 있었다. 이 함수는 무슨함수일까?

오 쉘을 실행시키는 함수인것 같다. 이 함수를 불러와야하는게 목적인것 같다.

__isoc99_scanf라는 함수가 눈에 띈다. 이 함수는 scanf와 거의 동일하지만 %a와 같은 서식 지정자를 못쓴다고 했다.(따라서 got overwrite는 못쓸것같다.) 단, scanf_s처럼 길이 제한을 하는 기능은 없기 때문에 버퍼 오버플로우를 할 수는 있어보인다.
그 다음으로는 입력한 문자열의 길이를 strlen을 통해 측정한다음, printf를 통해 "Hello %s" 형태로 출력한다.
scanf 부분에서 버퍼 오버플로우를 발생시켜서 어딘가를 덮어씌워야할것 같은데... printf 함수 전 스택의 모습을 한번 봐야겠다.


여기에서 변조시킬만한것은 return address정도밖에 보이지 않는다.
return address를 변조시켜서 main함수가 끝나면 callmemaybe 함수로 돌아가도록 해야겠다.
%s를 통해 입력을 받는 s 주소의 상대 위치는 -0x110이고, return address의 시작 위치는 0x08이다.

스택의 구조가 이러하므로 1byte문자 280개 + callmamaybe 의 주소로 입력값을 넣어주면 쉘이 실행될것 같다.

실행으로 옮겨봐야겠다.
<code>
from pwn import *
p = remote('ctf.j0n9hyun.xyz', 3004)
print(p.recv(timeout=1).decode())
data = b"A"*280
data += p64(0x0000000000400606)
p.sendline(data)
#p.interactive() 생략
<결과>

생각보다 수월하게 해결됬던것 같다.
return address와 버퍼오버플로우 개념을 64비트 버전으로 응용할 수 있으면 풀 수 있었던 문제인것 같다.
'정보보안' 카테고리의 다른 글
| [정보보안] Simple_Overflow_ver_2 해결과정 (0) | 2022.01.16 |
|---|---|
| [문제해결] x64 Simple_size_BOF 해결과정 (0) | 2022.01.14 |
| [문제해결] HackCTF 내 버퍼가 흘러넘친다!!! 해결과정 (0) | 2022.01.13 |
| [문제해결] HackCTF Basic_FSB 해결과정 (0) | 2022.01.09 |
| [어셈블리어 분석 도전] Hello World 프로그램 분석해보기 (0) | 2022.01.08 |