FTZ level18

2022. 3. 10. 17:22Site/FTZ

이번시간에는 level18에 대하여 풀어보겠습니다

공부를 하는 입장이니 틀린게 있어도 양해부탁드리겠습니다


먼저 ls -al을 통해 전체 디렉토리와 파일을 확인해보니 attackme가 보입니다

힌트파일을 열어주었는데 못보던 코드도 보이고 힌트가 역대급으로 기네요...

다는 모르겠어서 중요한 부분만 분석해보겠습니다

char형 stirng에 100bytes할당

int형 check변수 선언, int형 x 0으로 초기화, int형 count 0으로 초기화, fd_set의 구조체 fds선언(구글링)

printf("Enter your command") 출력, 출력버퍼를 fflush로 청소(구글링)

while무한루프돌려주며 count가 100이상이면 printf출력, check가 0xdeadbeef면 shellout()을 실행시켜주네요

같지않으면 FD_ZERO()로 fds를 초기화(구글링)시켜주네요

read()에서 입력받은것을[stdin]을 1byte읽어서 x에 저장해줍니다

switch구문을 통해서 x값을 읽어들어 '\r','\n'을 입력시 '\a'출력, 0x08을 입력하면 count값을 감소하고 "\b"가 2번출력되어 문자를 지우고 디폴트에서는 x를 string에 저장하고 count값을 증가시킵니다

shellout()에는 setreuid[level19ID]가 담겨있습니다

일단 선언부분에서 string[100]이 check보다 먼저 선언되어있기 때문에 전처럼 버퍼오버플로우하는 방법은 안통할것같습니다...

 

접근방법

check와 0xdeadbeef를 일치시키게만 해주면 되는데 string[100]이 check의 앞에 위치하기 때문에 현재 상태로서는 접근할수없을 것 같은데...

그런데 switch부분에 0x08을 입력하면 string배열의 인덱스 값이 1씩 감소됩니다.

아마 string의 배열인덱스 -1씩 하면서 뒤로빠지면서 check의 주소값위치에 접근을 할것 같다는 느낌이드네요...

그러긴 위해선 먼저 check의 위치와 string의 위치를 파악해야될것같습니다

 

gdb를 통해 attackme를 실행시켜주었습니다

main+3부분에서 256bytes[0x100]만큼 공간을 확보하고 main+91에서 0xdeadbeef랑 [ebp-104]랑 비교하고있네요...

아마[ebp-104]의 위치는 check가 아닐까 생각이듭니다

이제 string의 주소값만 찾아주면 될것 같습니다

 

main+409에서 read함수를 호출하고

main+471,main+489에서 printf함수가 2번호출되고 [ebp-100]부분에서 string함수의 주소값이 보입니다

string인걸 예상할 수 있는것은 check의 위치가 [ebp-104]인데 check보다 먼저 선언된 변수는 string밖에 없으니 string은 무조건 check보다 ebp에 가까워야 됩니다. 또한  check가 int형인 4bytes이므로 거리차이도 4bytes차이가 나므로[ebp-100]이 string인것을 예측할수있겠네요

 

string과 check의 거리는 4bytes차이가 나니 0x08을 4번입력하여 string의 인덱스를 [ebp-104]위치로 옮겨서 check의 주소값에 접근하여 0xdeadbeef를 덮어씌워주면 될 것 같습니다

 

다음시간에는 level19를 풀어보겠습니다

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

FTZ level20  (0) 2022.03.13
FTZ level19  (0) 2022.03.10
FTZ level17  (0) 2022.03.09
FTZ level16  (0) 2022.03.09
FTZ level15  (0) 2022.03.09