2017/01/11 - [Study :)/FTZ] - [해커스쿨] FTZ level15 풀이과정
힌트 볼깝숑~ㅋㅋㅋㅋㅋ
shell()함수가 정의되고, printit()함수가 정의되고, main함수에서 printit()함수가 불러지는 것을 확인 할 수 있다.
딱 보니 감이 오지 않는가? shell()함수는 정의해놓고 안불러오는것을 보니, printit()함수를 불러오는 버퍼에 shell()함수의 주소를 대체해서 넣으면, printit()함수가 아닌 shell()함수를 불러오게 되면서 해결될 것 같지 않은가? 음하하하하하하하하하하하하하하~ㅋㅋㅋ;
[ebp-16]에 "0x8048419"주소를 넣는다. 그리고 <main+46>부분에보면 [ebp-16]의 값을 eax에 넣고, eax의 값으로 call을 한다. 이부분이 분명 printit()을 call하는 과정이다.
그러면 "0x8048419"부분이 예상한 printit()함수 인지 보자.
역시 printit()함수가 있다. 그러면 우린 이제 shell()함수가 선언된 주소를 찾아야 된다.
하지만, main함수에서 어떠한 shell() 함수에 대한 코딩이 없기 때문에, main함수에서는 찾기 힘들다.
그렇지만 우린 바다처럼 넓은 기본지식이 있다ㅋㅋㅋ <사진16-1>을 보면 shell()함수를 먼저 정의하고, printit()함수를 정의하였다. 그렇다는 것은 printit()함수가 시작되는 주소 직전에 shell()함수가 정의 되어 있을 것이라는 생각을 할 수 있다. "0x8048419"에 printit()함수가 있으니까, 대충 "8048410"을 봐볼까?
"0x8048410"을 읽었는데, "0x80483ec"부터 읽어들여져 왔고, 이는 gdb에서 자동으로 불러오는 것같다. 그리고 이부분은 shell()함수 임을 확인 할 수 있다.
이부분에서 shell()함수의 시작 주소는 "0x80483ec"이라는 것을 확인했다.
이제 printit()함수의 주소 대신 shell()함수의 주소를 넣으면 된다.
위에서 봤던 사진을 다시 볼까?
사용자로 부터 받은 주소를 [ebp-56]부터 저장하고, 40byte떨어진 [ebp-16]에 call하는 함수의 주소값을 넣어둔다. 그리고 [ebp-16]의 있는 값을 eax에 넣어서 eax를 call하는 것을 우린 알고 있기 때문에,
[ebp-16]에 shell()함수의 주소값을 넣으면 될 것 같다.
<참조 02>
<참조 02>을 보면 "0x080484d0"라는 주소값을 넣고 있는데, <참조 01>까지의 풀이 흐름으로는 "0x80483ec"를 넣어야 된다.
<참조 01>에서 "0x080484d0"를 넣은 이유는 필자가 블로깅 할때는 /home/level16/tmp 안에 attackme파일을 만들어서 분석하고, 실제 공격은 /home/level16안에 있는 attackme 파일을 공격하기 때문에, 주소값이 다른것이다.