워게임/CTFlearn

[CTFlearn] Leak me - 포너블 / 포맷스트링

SecurityMan 2023. 9. 7. 11:00

 

CTFlearn에서 제공하는 

 

Easy 난이도의 포너블 문제

 

반응형

 

문제설명에 format tag 라고 적혀있는걸 보니

 

포맷 스트링과 관련된 문제이다.

 

얼마전에 Root Me에 나온 문제와 그냥 동일한 문제이다.

(https://hackingstudypad.tistory.com/613)

 

 

문제는 서버 주소와 소스코드가 주어진다.

 

위는 소스코드 내용인데

 

./flag.txt 파일의 내용을 읽은 뒤 *f 에 저장한다.

 

그런다음 fgets 로 buffer 에 해당 값을 담아준 뒤

 

printf 로 사용자로부터 입력받은 값을 출력해준다.

 

printf 부분에서 문제가 발생할 수 있다.

 

사용자에게 입력을 받아 결과를 출력할 때 포맷 스트링이라는 것을 사용하는데 

 

기호로 다음과 같이 표시된다.

 

%d : 정수형 10진수 상수
%f : 실수형 상수
%c : 문자
%s : 문자 스트링
%u : 양의 정수(10진수)
%o : 양의 정수(8진수)
%x : 양의 정수(16진수)
%p : 포인터

 

main 함수에 있는 printf 함수의 경우

 

위와 같은 형식 지시자를 사용하지 않기 때문에

 

printf(buffer) 에 있는 buffer는 문자열로 해석되는 것이 아니라

 

형식 지시자를 포함한 포맷스트링으로 인식된다.

 

 

문제 서버에 원격으로 접속해본다.

 

What is your favorite format tag? 라고 물어보면서 입력을 받는다

 

1이라고 입력하면 

 

입력한 값이 그대로 출력된다.

 

 

만약 포인터를 의미하는 %p 를 입력한다면

 

16진수 값이 출력되는데

 

이게 %p가 문자열로 해석되지 않고 포맷 스트링으로 해석되었기 때문에

 

포인터 주소가 출력되고 있는 것이다.

 

 

%p를 많이 입력할 수록

 

그 뒤에 있는 값들이 줄줄이 이어서 출력된다.

 

*f 도 뒤에 나오게 된다.

 

 

CyberChef(https://gchq.github.io/CyberChef)에서

 

해당 값을 디코딩하면 플래그를 찾을 수 있다.

 

주의할 점은

 

리틀 엔디안 방식으로 저장되어 있기 때문에

 

뒤부터 역순으로 써줘야 한다는 것이다.

반응형