SystemHacking/FTZ(22)
-
FTZ level20 포맷 스트링 버그 [FSB]
FTZ level20번 문제는 포맷 스트링 버그문제입니다 ( level11번에서도 풀었엇죠? )힌트를 봐보시면 포맷스트링 취약점이 보입니다[ 그림1 ] 포맷스트링 취약점이 있는 것을 알았고, 이제 포맷스트링 공격에 필요한 것은 무엇일까요?2가지 : RET(리턴 어드레스) , 쉘 생성코드 주소 level11번문제에서는 " nm " 명령어를 통해서 소멸자의 주소를 알아냈습니다.하지만 이번에는 " nm " 명령어로 볼 수 없게 막아놧네요. 하짐 또다른 방법이 있습니다 [level20@ftz level20]$ objdump -h attackme[ 그림2 ] 18 .dtors 라는 것이 보일겁니다. 해당 라인에 나와있는 주소값은 " __DTOR_LIST__ " 의 주소입니다 어디서 많이 본거 같죠? " __DTO..
2017.05.30 -
FTZ level19 Return to Libc
level19번 문제입니다 이번 문제는 에그쉘을 이용해 쉘을 실행시키는 방법과 RTL기법을 활용해서 문제를 풀어보도록 하겠습니다 먼저 힌트파일을 보겠습니다. 다른 문제들과 다르게 소스파일에 setreuid() 함수가 없습니다 따라서 이전 문제처럼 쉘 생성코드만 작성하고 실행시킨다고 level20계정의 권한을 얻을 수 없습니다 setreuid()함수를 실행할 수 있는 코드를 직접 만들어야 합니다 이제 해당 파일의 스택구조를 살펴보겠습니다 gdb분석 결과 Procedure prelude 과정에서 sub $0x28,$esp 부분이 보이실겁니다 40byte만큼 지역변수 공간을 할당해주었습니다. 따라서 스택구조는 다음과 같습니다 buffer SFP RET 환경변수 등등...
2017.05.30 -
FTZ level18 포인터 특성 활용
level18의 힌트파일을 보면 " File Descriptor " 개념이 나옵니다. 소스파일을 읽기 어렵게 만들어놓은 함정입니다 switch문만 제대로 파악하면 문제는 풀리지만 나머지 소스에 대해서 설명해 드리겠습니다 그럼 힌트파일을 열어보도록 하겠습니다 소스가 엄청 깁니다 천천히 따라서 읽어보세요 #include #include #include #include void shellout(void); int main() { char string[100]; int check; int x = 0; int count = 0; fd_set fds; // fd_set 타입의 fds 변수선언 ( 파일디스크립터의 집합 or 소켓 구조체 ) printf("Enter your command: ");..
2017.05.28 -
FTZ level17 포인터 변조 2
level17번 문제입니다. 힌트를 봐보겠습니다 이번 문제에서는 level16번 문제와 선언된 변수들과 스택의 구조가 모두 똑같습니다 다른 점은 level16에 있던 shell()함수가 없다는 것입니다. 따라서 우리가 직접 환경변수에 쉘 생성코드를 작성해서 주소를 구합니다 그리고 포인터 call 을 환경변수의 주소로 초기화 시켜주면 call() 함수가 실행될 때 쉘이 떨어지게 될것입니다 쉘을 생성하는 코드는 따로 정리해놓았습니다. 아래 링크를 들어가시면 됩니다 쉘 생성코드 작성법
2017.05.28 -
FTZ level16 포인터 변조 1
level16에서 새롭게 등장한 개념은 " 함수포인터 " 입니다 #include void function(){ printf("Hello\n"); } int main(){ void (*call)() ; // 매개변수와 리턴값이 없는 함수 포인터 선언 call = function ; // function 함수의 메모리주소를 call 함수포인터에 저장 call(); // 함수포인터로 function 함수를 호출한다 // => "hello" 출력 // 또는 한 번에 선언과 초기화를 같이 시켜주는 방법도 가능하다 // void (*call)() = function; // call(); } 문제를 보면서 해당 개념을 다시 익혀보도록 하겠습니다 힌트파일의 소스를 복사해서 임시로 파일을 생성합니다 ( attackme파..
2017.05.23 -
FTZ level15 분기 루틴 2
level15는 level14문제에서 int형 변수에서 포인터형 변수로 바뀌고 나머지는 모두 똑같은 문제입니다 바로 문제 풀이 시작하겠습니다 힌트파일에 attackme 실행파일의 소스가 들어있습니다 해당 파일을 tmp 디렉토리에 복사하고 컴파일 시킨후 gdb분석을 시작합니다 ( gdb분석을 통해 각 변수들의 메모리 위치를 파악한다 ) 먼저 소스코드 실행 흐름을 파악해보겠습니다 [1] Procedure Prelude $0x38 = 56byte만큼의 공간을 지역변수에게 할당한다 [2] fgets() fgets( buf , 45 , stdin ) 45만큼의 문자열을 입력받고, buf에 저장한다 * buf의 시작주소를 알 수 있습니다 ( 에서 "0xbffffffc8" ..
2017.05.23