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


ID : level15

PW : guess what


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


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


[그림 1] level15 hint파일


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

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


01. int 형으로 crap선언

02. int 형으로 check선언

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

04. (level14와의 차이) *check가 가리키고 있는 곳의 Hex값이 0xdeadbeef라면 문제가 해결됨


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

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


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


main+3을 보면 0x38만큼 스택의 장소를 마련하고, 이는 level14와 다르지 않다는 것을 알 수 있습니다.

그렇다면, level14와 마찬가지로 check의 위치를 알아낼 수 있을 것으로 추측됩니다.

main+32를 보면 0xdeadbeef와 %eax가 가리키고 있는 값을 비교하고 있는 것을 볼 수 있습니다.

그리고 main+29는 %eax에 0xfffffff0(%ebp)의 값을 넣고 있는 것을 알 수 있습니다.

그럼 우리는 (ebp-0x10)에 우리가 원하는 값을 넣어줘야 한다는 걸 추측할 수 있을 것입니다.


이 문제는 포인터와 어셈블리에서 값을 말하는지 포인터를 말하는지에 대해 구분할 필요가 있습니다.


level14와 level15에서는 ebp-0x10과 0xdeadbeef를 바로 비교하지 않고, ebp-0x10을 가리키는 어떠한 포인터를 한 번 더 붙이는 것을 볼 수 있습니다.

요약하면 [그림 3]과 같습니다.


[그림 3] level14와 level15를 비교한 그림


[그림 3]의 위는 level14의 풀이를 간단히 요약한 그림이고, 아래의 그림은 level15에서의 풀이를 간단히 요약한 그림입니다.

level15의 그림에서 0xdeadbeef의 Address를 넣어야 한다는 것을 의미합니다.

즉, 이는 0xdeadbeef라는 값을 가지고 있는 주소를 가리키면 된다는 의미입니다.

TIP을 살펴보면 0xdeadbeef의 address는 main함수 내에 있을 수 있다, 고 합니다.

이 말은 main함수에서 0xdeadbeef를 비교할 때 사용하기 때문에 0xdeadbeef는 메인함수의 어느 부분에 존재할 것이라는 의미입니다.

또한, 우리는 buffer에 0xdeadbeef를 쓰고, 그곳을 가리키면 될 것이라는 다른 접근 방법도 있을 것입니다.

작성자는 후자를 먼저 해보았지만... 안 되더군요.. 왜 안 되는지는 이론상으로는 알 수 없어, 전자로 풀었습니다.


그렇다면 우리는 ebp-0x10에는 0xdeadbeef를 넣어야 하는 게 아니라 0xdeadbeef를 가리키는 주소값을 넣어야 한다는 것을 알 수 있습니다.


main내에서 0xdeadbeef를 찾아보도록 합시다.


gdb atm -q를 통해 main함수를 열어보면 main+32에서 0xdeadbeef와 비교하는 모습을 볼 수 있습니다.

그렇다면 우리는 main+29~main+32 내에 0xdeadbeef가 숨어있을 것으로 생각할 수 있습니다.(물론 저는 풀다가 겨우 알았습니다....)


[그림 4]는 main+30부터 쭉 열어본 모습입니다.


[그림 4] main+30부터 열어본 모습


0x80484ae~ 0x80484ee까지 열어보았습니다. 0x80484b2에 0xdeadbeef가 있는 것을 볼 수 있습니다.

그렇다면 우리는 ebp-0x10에 0x80484b2의 값을 넣어주는 것이 해답일 것입니다..!!(헉헉)


입력위치 (/home/level15)

코드 : (python -c 'print "A"*40 + "\xb2\x84\x04\x08"';cat) | ./attackme


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



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

level16_FTZ_SIMPLE BOF기법  (0) 2016.09.12
level14_FTZ_SIMPLE BOF기법  (0) 2016.08.10
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