level12의 ID와 PW는 아래와 같습니다.


ID : level12

PW : it is like this


-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


hint 파일을 살펴보면 다음과 같습니다.


[그림 1] level12 hint 파일


힌트 파일에서 attackme의 소스를 [그림 1]과 같이 보여주고 있습니다.

level11과의 차이점은 gets() 함수로 문자열을 입력받는 점입니다. 우리는 argv로 값을 넘겨주는 것이 아닌 파일을 실행한 후 값을 넘겨줘야 합니다.

우리가 사용할 기법은 Return To Library로 사용할 것입니다.

여기서 필요한 요소는 총 세 가지로 다음과 같습니다.


(1) 프로그램 내에서 사용하는 Library 중 system 함수의 주소

(2) system 함수 내의 '/bin/sh'의 주소

(3) 우리가 이용할 Return의 주소


이제 gdb를 이용하여 소스코드를 자세하게 분석하여 봅시다.

gdb로 run이 되지 않으면 tmp 디렉토리에 파일을 카피하여 카피한 파일로 열어보도록 합니다.

설명 : level11_FTZ_RTL기법 참고


작성자는 tmp파일에 atm이라는 이름으로 attackme를 복사하여 분석을 진행하였습니다.

[그림 2] gdb로 열어본 atm의 모습


atm은 다음과 같이 나타나 있습니다.

요약하면 0x108만큼 공간을 마련한 후 이곳에 gets()함수로 받은 문자열을 0x108에 저장하고 이를 print합니다.


[그림 3] system 내의 /bin/sh의 주소를 프린트하는 소스


system의 주소는 main에 breakpoint를 걸어준 후 p system을 하면 주소가 나오게 됩니다.

이후 shell 부분에 system 주소를 HEX 값으로 입력하면 그 주소로부터 1바이트씩 옮겨가며 8바이트씩 비교하여 '/bin/sh'인지 체크를 합니다.


level11과의 차이는 gets()함수로 받기 때문에 argv처럼 입력받는다 하여도 해결할 수 없게 됩니다.

때문에 우리는 code를 다르게 만들어 풀어야 할 것입니다.


작성자는 다음과 같은 방법으로 풀었습니다.


(python -c 'print "A"*268 + "system addr" + "AAAA 혹은 Return address" + "/bin/sh address") | cat > Data

와 같이 Data에 우리가 쓸 코드를 만들었습니다.


완성된 문장 : (python -c 'print "A"*268 +"\xc0\xf2\x03\x42" +"AAAA"+ "\xa4\x7e\x12\x42"') | cat > data


GDB에서는 'r < Data'와 같이 프로그램을 실행하여 비교를 진행하였고, 제대로 작동될 것이 예상되면 tmp 디렉토리에서

(cat Data;cat) | ../attackme 와 같이 명령어를 실행해줍니다.


[그림 4] 문제 해결




'WARGAMES > FTZ' 카테고리의 다른 글

level16_FTZ_SIMPLE BOF기법  (0) 2016.09.12
level15_FTZ_SIMPLE BOF기법  (0) 2016.08.24
level14_FTZ_SIMPLE BOF기법  (0) 2016.08.10
level13_FTZ_RTL기법  (0) 2016.08.08
level11_FTZ_RTL기법  (0) 2016.07.21
level10_FTZ  (0) 2016.07.21
level09_FTZ  (0) 2016.07.21
level08_FTZ  (0) 2016.01.07

+ Recent posts