-
[FTZ Level18 풀이]System/FTZ 2018. 2. 17. 00:44
[Level18 Code]
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#include <stdio.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>void shellout(void);int main(){char string[100];int check;int x = 0;int count = 0;fd_set fds;printf("Enter your command: ");fflush(stdout);while(1){if(count >= 100)printf("what are you trying to do?\n");if(check == 0xdeadbeef)shellout();else{FD_ZERO(&fds);FD_SET(STDIN_FILENO,&fds);if(select(FD_SETSIZE, &fds, NULL, NULL, NULL) >= 1){if(FD_ISSET(fileno(stdin),&fds)){read(fileno(stdin),&x,1);switch(x){case '\r':case '\n':printf("\a");break;case 0x08:count--;printf("\b \b");break;default:string[count] = x;count++;break;}}}}}}void shellout(void){setreuid(3099,3099);execl("/bin/sh","sh",NULL);}cs 굉장히 긴 코드가 Level18의 Attackme 코드다.
파일 디크립트 함수 등 낯선 함수들이 있는데, 별거 없다.
그냥 표준입력으로 입력받아서 입력값을 스위치문에서 분기해주는 코드다.
여기서 눈여겨볼점은 check가 [0xdeadbeef]가 되면 shellout( ) 쉘을 실행시키는 함수가 실행된다는 것이다.
일반적인 BOF를 일으켜서 RET값을 shellout( )주소로 변조하려고 하면, 첫번째 if문 예외처리에 걸리기 때문에 불가능하다.
일단 밑에 스위치문들을 보자
3개의 case문이 있는데, 그 중 0x08을 입력받으면 count-- 하는 case문에서 느낌이 좀 온다.
또, Default case는 버퍼[count]에 값을 저장하고, count++ 한다.
저 두개의 case문을 잘 이용하면 될 것같다.
[Level18 Stack]
count
x
check
string[100]
SFP
RET
스택상황은 이렇다.
RET을 변조하는 것은 예외처리 때문에 불가능 하고, check영역에 BOF를 일으킬수도 없다. 일반적으론.
하지만 우리에겐 인덱스를 --해주는 case문이 있다.
따라서, string에서 check영역으로 인덱스값이 이동할때까지 0x08을 입력해주고
그 다음 deadbeef를 입력해주면 Shellout( )가 실행될 것이다.
우선 string과 check의 offset을 알아보자
[Level18 main]
빨간색 박스는 위 코드에서 x와 count를 0으로 초기화 해주는 부분이고
주황색 박스에서는 [EBP-104](Check)와 deadbeef를 비교하는 부분이다.
여기서 check의 영역은 [EBP-104]임을 알 수 있다.
[Level18 Switch문]
두번째 주황색 박스를 보면 DEC [EBP-112]부분을 보면 저 부분이 count--해주는 부분임을 알 수 있다.
(DEC는 -1해주는 어셈블리어다.)
초록색 박스는 String[count] = x 해주는 부분인데, 처음에 주소값을 참조하는 곳을 보면 [EBP-100]을 EAX에 저장한다.
그 후, [EBP-252]에 다시 EAX값을 저장하고 거기에 BYTE만큼 입력값을 저장하는데
여기서 [EBP-100]공간이 String의 공간임을 알 수 있다.
따라서 인덱스를 -4만큼 해주고, 그 후에 deadbeef를 저장해주면 쉘이 실행될 것이다.
보는 것처럼 쉘이 잘 실행된 것을 볼 수 있다.
자 이제 Level19로 넘어가보자
'System > FTZ' 카테고리의 다른 글
[FTZ Level19 풀이] (0) 2018.02.17 [FTZ Level17 풀이] (0) 2018.02.16 [FTZ Level16 풀이] (0) 2018.02.16 [FTZ Level15 풀이] (0) 2018.02.16 [FTZ Level14 풀이] (0) 2018.02.16 댓글