FTZ level12

2022. 3. 6. 13:55Site/FTZ

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

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


전체 디렉포리와, 파일을 조회해보았습니다

level12이와 같이 attackme라는 있고 setuid가 걸려있는 것을 확인했습니다.

 

attack파일을 실행 시켰더니 위와 같은 소스코드가 나옵니다

level11에서 언급했던거같이 strcpy처럼 get함수도 변수의 범위를 검사하지않아 저희가 256byte를 초과하여 입력하면 버퍼오버플로우가 발생할 가능성이 있을것 같습니다

아마 접근방식이 level11과 동일할것 같습니다

 

*

char str[256] : char형 문자열을 256바이트만큼 할당함

setreuid(3092, 3092); -> level12의 권한id값임

printf : 출력

gets(str) : str입력받음

printf : 출력

*

 

먼저 gdb를 통해 attackme를 열어보았습니다

main+3에서 264byte의 공간을 할당해 주고있는데 힌트에서 보았던 str의 할당크기는 256byte라서 8byte가 dummy크기인것을 예상할 수 있었습니다. main+9에서는 추가로 8byte 확보를 해주고있습니다

 

      [메모리구조(총 272byte)]

ret[4]
sfp[4]
dummy[8]
str[256]

 

main+49에는 eax에 ebp-264를 넣고 스택에 push하면서 get함수에 전달하고 있어서 str의 시작주소가 ebp-264라는것을 예상할 수 있었습니다

저희는 ret주소를 알아야 되는데 ebp아래있는 ret이 있기때문에 4byte를 더해주어 

ret의 주소가 268byte인것을 알 수 있었습니다

ret[4byte]을 뺀 264byte[str+dummy+sfp]를 채워주고 ret에 25byte 쉘코드주소를 넣어주겠습니다

 

*

25byteshellcode : \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80

*

 

버퍼오버플로우 공격은 대표적으로 NOP sled방법과 환경변수를 통한 공격방법이 있는데 level11에서는 NOP sled방법으로 진행하였기에 이번에는 환경변수 방법으로 시도해보겠습니다

cf) NOP sled[No operation]은 \90으로도 표현되고 \90을 특정주소까지 채워넣은다음 원하는 주소에 도달했을때 shellcode를 실행시켜줍니다

 

*

환경변수적용방법

export 변수명[shell제외모두가능함] = 값

cf) export : 쉘변수 -> 환경변수

*

 

위에서 만든 환경변수의 주소값을 얻기위해 shell.c을 만든다음

SHELL의 주소값을 얻기위해 getenv함수를 작성하였습니다

gcc를 이용하여 shell을 컴파일시켜주었습니다

확인해보니 잘 생성되었습니다

shell파일을 실행시켜주니 SHELL코드 주소가 0xbffffc15라는 것을 확인할 수 있습니다

268byte를 \x90로 출력하고 getenv통해 얻어진 shell코드의 주소값을 나머지 ret주소에 채워 넣어주는 페이로드를 작성했습니다

 

cf) Little Indian :  높은메모리 -> 낮은메모리 15fcffxb

    Big Indian : 낮은메모리 -> 높은메모리 0xbffffc15

이부분에 대해서는 추가로 더 공부하여 글을 올리도록하겠습니다

 

다음시간에는 level13을 풀어보겠습니다

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

FTZ level14  (0) 2022.03.08
FTZ level13  (0) 2022.03.07
FTZ level11  (0) 2022.03.04
FTZ level10  (0) 2022.02.25
FTZ level9  (0) 2022.02.25