2017/01/12 - [Study :)/FTZ] - [해커스쿨] FTZ level16 풀이과정
힌트 보자..
level16에서는 shell()함수가 따로 존재하여 shell()함수에 setreuid()함수가 들어있었다.
그래서 printit()함수를 불러오는 주소에 shel()함수 주소를 대체해서 넣어서 문제를 풀었다면,
level17에서는 shell()이라는 함수가 따로 없고 main()함수에 포함되어 있다.
문제를 풀기 전 예상을 해보면, main()함수에 call(); 명령어를 통해서 원하는 주소의 값을 실행 하는 방법과, 앞서 풀었던 BOF방식으로 RET주소에 원하는 주소를 넣는 방법이 있을 것 같다고 판단된다.
이렇게 2가지 방법을 생각해 두고 문제를 풀어보자....
먼저, hint의 내용을 /home/level17/tmp 폴더안에 그대로 복사하여 attackme 파일을 만들었다.
이 파일을 분석해보자...
먼저 0x38(56)만큼 공간을 할당한다. 그리고 0x80483b8이라는 주소를 [ebp-16]에 넣고, 이를 마지막 부분에 보면 eax에 넣어 call한다.. 이를 보고 ebp-16에 printit()함수 가 있다는 것을 알 수 있다.
또, 첫번째 네모부분을 보면, [ebp-56]부분을 eax에 넣고 eax를 push해서 fgets()함수를 call하는 것으로 봐서 [ebp-56]부분이 buf[20]배열이 있는 부분이다.
분석해 보니 먼저 환경변수에 shell코드를 넣고, [ebp-16]부분에 shell코드가 들어있는 환경변수의 주소를 넣으면 printit()함수가 call되는 것이 아니라 shell코드가 call시키면 될 것 같다.
fgets()함수를 실행하고 나서 문자열이 들어가는 주소와 내용을 보기위해 main+46부분에 BP를 걸고, printit()함수를 불러오기 이전에 eax의 주소와 내용을 보기위해 main+67에 BP를 걸었다.
프로그램을 gdb로 실행시켜서 "AAAA"라는 문자열을 넣고 BP1(main+46)부분을 보자.
esp 레지스터 부분의 50만큼을 긁어서 보니, esp는 '0xbfffde20'을 가르키고 있고,
이 곳엔 "0x41414141"(AAAA)라는 내용이 들어있다. 우리가 아까 예상했던 [ebp-56]부분이 buf[20]부분인지 확인하기 위해 ebp-56부분을 보니 역시나 같은 '0xbfffde20'주소이다.
한번더 진행시켜서 우리가 두번째 BP를 걸어둔 곳까지 진행시켜 보자. 우리가 두번째 BP를 걸어둔 곳은 printit()함수가 실행되기 바로 직전이였다.
printit()함수가 있을 것이라고 예상 했던 ebp-16부분을 보니 '0x080483b8'주소가 들어가있고, 이 주소를 보니 역시나 printit 함수가 들어 있다.
그리고 ebp-56에 "AAAA"가 들어있고 BOF를 이용하여 ebp-16부분에 우리가 원하는 shell코드 주소를 넣으면 문제가 풀릴것 같다는 확신이 든다.
진행하자.
먼저 환경변수에 shell코드를 넣고 환경변수의 주소를 구한다.
(자세한 내용은 level11 풀이과정 : http://eunice513.tistory.com/56)
이제 마지막으로 정리하자. ebp-56부터 입력한 문자열이 입력되고 ebp-16부분에 printit()함수의 주소가 들어있다. 우리가 원하는 방법은 ebp-56부터 문자를 넣어서 ebp-16부분에 shell코드의 주소를 넣으면 끝난다.
ebp-56과 ebp-16는 40byte차이이기 때문에,
ebp-56부터 40byte만큼 아무값이나 입력하고 shell코드 환경변수의 주소를 넣으면 끝!!