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


ID : level13

PW : it is like this


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


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


[그림 1] level13 hint 파일


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

level11, level12와는 다르게 다른 것들이 정의되어 있습니다.

특징을 살펴보도록 합시다.

01. long형으로 선언된 변수에 0x01234567이 들어가 있습니다.

02. char형으로 1024바이트의 배열을 선언합니다.

03. argv로 입력을 받고, argc(입력 값의 수)가 1개 이상(argv값이 입력되면)이면 buf 변수에 문자열을 복사합니다.

04. 만약 long형으로 선언된 변수의 값이 0x01234567에서 변조되면 " Warnning : Buffer Overflow !!!"를 프린트합니다. 그리고 바로 종료합니다.


long형이 먼저 선언됐으니까 RTL로 하기 위해서는 0x01234567의 위치도 알아야 이를 변조하지 않도록 할 수 있습니다. 먼저 스택의 형태를 보기 전에 gdb로 열어보도록 합시다.

이번 분석도 마찬가지고 /tmp에 atm이라는 이름으로 attackme를 복사하여 분석을 진행하도록 해봅시다.


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


gdb로 열어보았을 때, 이전보다는 꽤 긴 모습을 볼 수 있습니다.

먼저 [그림 2]를 요약해보면 특징에서 나타난 내용과 같다는 것을 알 수 있습니다.

그렇다면, 우리는 0x01234567의 위치와 버퍼가 어디에서 시작되는지를 알 필요성이 있습니다.


작성자는 1024바이트만큼 입력하고 이를 살펴보았습니다.


gdb 명령어 :

01. r `python -c 'print "A"*1024'`

02. x/300x $esp


이제 Stack을 살펴보면 [그림 3]과 같습니다.


[그림 3] 1024개의 A를 넣어본 Stack의 모습


저렇게 A가 1024개나 밖혀있는 모습을 볼 수 있습니다.

우리는 이제 RET와 long i를 찾아야 하는데, 먼저 0xbffff4b0의 마지막 줄을 보면, 0xbffff4bc부터 0x01234567이 있다는 것을 알 수 있습니다.

그리고 RET는 0xbffff4cc으로 예상할 수 있습니다.

작성자는 argc와 argv를 통해 알아내는데, argv는 address가 들어가기 때문에 0xbffffd4를 4바이트만큼 열어보면 또 다시 주소가 나올 것입니다.

이는 argv의 값을 가지고 있는 위치이며 이를 string으로 프린트하면 /home/level13/tmp/atm으로 나올 것입니다.

즉, argv 앞은 argc, 그리고 그 앞은 RET라는 예측을 할 수 있습니다.


따라서 우리는 A*1036 + "0x01234567" + "A"*12 + "system address" + "AAAA" + "/bin/sh addreess"와 같은 방법으로 풀이가 가능합니다.


입력 위치(/home/level13)

코드 : ../attackme `python -c 'print "A"*1036 + "\x67\x45\x23\x01" + "A"*12 + "\xc0\xf2\x03\x42" + "AAAA" + "\xa4\x7e\x12\x42"'`


[그림 4] my-pass로 얻어낸 모습






'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
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