-
해커스쿨 ftz level15System/HackerSchool ftz level 2019. 6. 14. 18:20
어젯밤에 그냥 자서 오늘은 지금 하나랑 새벽에 하나 올라갈 겁니다.
코드를 보면 사실 level14의 코드와 매우 흡사한 모습인데, 달라진 점이라면 check 변수 호출할 때 포인터 변수로 지정했다는 것 뿐이네요
분석을 시작하기에 앞서 일단 우리가 봐야 할 부분은 <main+17>부터 <main+32>인 것 같습니다. 그 전에는 시작부, 그 이후에는 BOF 성공 뒤에 차례로 실행되는 구문이라서..
<main+17>을 보면 fgets 함수를 실행하기 전에 [ebp-56]의 주소를 EAX에 저장한 뒤 PUSH합니다. 고로 여기서부터 버퍼가 시작한다고 볼 수 있겠네요 그리고 <main+29>를 보면 그 뒤에 [ebp-12]의 값을 EAX에 넣은 뒤, <main+32>에서 그 값을 0xdeadbeef와 비교합니다.
중요한 거는 check가 포인터형 변수로 지정되었기 때문에 level14처럼 주소에 0xdeadbeef라고 쓰면 안된다는 겁니다. [ebp-12] 위치에 0xdeadbeef 라는 값이 저장된 주소값을 넣어줘야 성공적으로 쉘을 딸 수 있습니다 -
그래서 이제 0xdeadbeef 라는 값이 저장된 주소를 찾아야 해요
이걸 어떻게 찾냐?
gdb의 x명령어를 사용하면 됩니다. 이게 메모리를 조사하는 명령어거든요
x/16x 이 뜻은 16진수의 메모리를 16바이트로 끊어서 보여주겠다는 뜻입니다. 그래서 <main+32> 다음 <main+32+16>이 출력되죠
위에서 <main+32>에서 0xdeadbeef 의 주소를 비교한다고 했죠? 그래서 그 0x80484b0부터 이것저것 출력해 본 거구요
근데 이미 <main+32>에서 0xbeef어쩌구와 0x어쩌구dead가 나왔죠? 고로 0x80484b0의 주소와 0x80484c0의 주소 사이에 0xdeadbeef가 저장된 주소가 있을 겁니다
따라서 x/x 명령어(메모리별로 끊어서 출력해줌)를 사용해서 하나하나 볼 겁니다
앞에서부터 두 글자씩 또잉또잉하면서 결국 <main+34>에서 0xdeadbeef 가 저장되네요!
그러므로 이 0x80484b2 주소로 공격하면 분명 쉘을 딸 수 있을 거에요
우 와 풀 렸 다 !
다 쓰고 보니까 오늘따라 굉장히 긴 거 같아요 아직 낮이라 쌩쌩해서 그런건지 이것저것 많이 썼네요. 이래야 공부가 되는 거긴 한데 하하,,
이제 시험공부하러 갑니다 ㅂㅂ
2019.6.14
InBseiBjb21lIHRvIG1lLCBpZiB5b3UgYW5zd2VyIHRoaXMi
'System > HackerSchool ftz level' 카테고리의 다른 글
해커스쿨 ftz level17 (0) 2019.06.15 해커스쿨 ftz level16 (0) 2019.06.15 해커스쿨 ftz level14 (0) 2019.06.13 해커스쿨 ftz level13 (0) 2019.06.12 해커스쿨 ftz level12 (0) 2019.06.11