워게임/Root Me

[Root Me] ELF x86 - Format string bug basic 1 - 포너블

SecurityMan 2023. 8. 30. 11:00

 

Root Me에서 제공하는

 

간단한 난이도의 Format String 문제

 

반응형

 

 

문제에서 제공되는 바이너리의 소스코드이다.

 

C언어로 제작되었다.

 

먼저 .passwd 파일의 내용일 읽은 뒤

 

*secret 에 저장한다.

 

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

 

printf 로 사용자로부터 입력받은 파라미터인 argv[1] 을 출력한다.

 

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

 

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

 

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

 

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

 

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

 

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

 

printf(arvg[1]) 에 있는 argv[1]은 문자열로 해석되는 것이 아니라

 

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

 

 

문제는 WebSSH 버튼을 눌러

 

웹 형태로 서버에 접근해 해결할 수 있다.

 

 

서버에서 ls -al 해보면

 

권한이 없어 읽을 수 없는 정답 파일은 .passwd 와

 

실행시킬 ch5, 소스코드인 ch5.c 파일이 보인다.

 

 

./ch5 를 실행시키면서 인자로 %p 를 주게 되면

 

예상했던대로

 

%p 가 그대로 출력되는 것이 아니라 0x20 이 출력되는것이 보인다.

 

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

 

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

 

 

%p를 많이 입력할 수록

 

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

 

*secret 도 여기 어디에 있을 것이다.

 

 

해당 값을 그대로 복사해서

 

CyberChef(https://gchq.github.io/CyberChef)에서 Form Hex로 디코딩 해보면

 

뭔가 읽을 수 있는 문자열이 보인다.

 

이 부분이 바로 플래그인다.

 

단 이대로 제출을 해선 안된다.

 

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

 

4바이트씩 끊어서 역순으로 써줘야 한다.

반응형