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


ID : level14

PW : what that nigga want?

(작성자는 이 Password를 좋아하지 않습니다.)


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


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


[그림 1] level14 hint파일


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

이 소스를 요약하면 다음과 같은 특징을 가집니다.


01. int형으로 crap선언

02. int형으로 check선언

03. char형으로 20Byte만큼의 buf 선언

04. buf[0]~buf[45]까지의 문자열을 읽어들임

05. check에는 비록 아무것도 없지만 check라고 선언된 부분의 Hex값이 0xdeadbeef라면 문제가 해결됨


우리는 먼저 이 check라는 변수가 어디에 위치하는지를 알아야 합니다.

attackme를 atm으로 복사하여 gdb로 파일을 열어보도록 합시다.

[그림 2] atm 파일을 gdb로 열어본 모습


main+3을 보아하니 0x38만큼 스택의 장소를 마련하는 것이 보입니다. 이는 십진수로 56, 즉 56Byte만큼 먼저 스택을 잡아준 것입니다.

아마 crap, check, buf의 변수를 모두 잡아준 것 같습니다.

이제 우리는 check의 위치를 보도록 합시다.

main+29를 보시면 0xdeadbeef와 0xfffffff0(%ebp)를 비교하는 것을 볼 수 있습니다.

0xfffffff0(%ebp)는 해석하면 $ebp-0x10과 같습니다. 즉, ebp에서 16바이트 위에 있는 값을 말하는 것입니다.

우리는 0xdeadbeef와 비교하는 곳이 check일 것이라는 추측을 할 수 있습니다.

x/x $ebp-0x10을 해보면 그 위치의 값이 나올 것입니다.


[그림 3] x/x $ebp-0x10을 한 모습


자 이제 이 녀석을 얼마나 입력해야 하는지 계산해보기 위해 스택을 살펴봅시다.



[그림 4] check의 위치 확인


check의 위치를 확인해보면 우리가 40바이트를 Dummy로 입력해준 후 그 위치에 0xdeadbeef를 입력하면 되는 것을 알 수 있습니다.

다음과 같이 코드를 입력하면 되겠습니다.


입력위치 (/home/level14)

코드 : (python -c 'print "A"*40 + "\xef\xbe\xad\xde"';cat) | ./attackme


[그림 5] level15 비밀번호(my-pass 입력)


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

level16_FTZ_SIMPLE BOF기법  (0) 2016.09.12
level15_FTZ_SIMPLE BOF기법  (0) 2016.08.24
level13_FTZ_RTL기법  (0) 2016.08.08
level12_FTZ_RTL기법  (0) 2016.08.07
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