[Root Me] ELF x86 - Format string bug basic 1 - 포너블
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바이트씩 끊어서 역순으로 써줘야 한다.