BOF/ ftz-level09

 

FTZ란 Free Training Zone의 약자로 hackerschool에서 배포하는 워게임입니다.
총 20문제로 구성되어 있으며 각 문제를 격파하여 다음 레벨의 패스워드를 얻는 형식입니다.
문제를 격파하고 다음 레벨의 bash를 획득하였다면 my-pass로 패스워드를 확인할 수 있습니다.

사용 linux 명령어
ls - 파일 내역 출력 cat - 파일 내용 확인
gcc - gcc컴파일러로 컴파일하도록 하는 명령 vim - text editor

send me email if you have any questions.


FTZ Level 9

ID : level9
PASSWD : apple

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main(){

  char buf2[10];
  char buf[10];

  printf("It can be overflow : ");
  fgets(buf,40,stdin);

  if ( strncmp(buf2, "go", 2) == 0 )
   {
        printf("Good Skill!\n");
        setreuid( 3010, 3010 );
        system("/bin/bash");
   }

}

level9의 힌트로 제공되는 /usr/bin/bof의 소스이다.
buf의 size는 각각 10Byte이며 buf에 NULL을 포함하여 최대 40Byte까지 문자를 읽어들인다.
buf2와 “go”문자열을 비교하여 2개의 문자가 모두 일치한다면 level10의 권한으로 /bin/bash를 실행한다.

이 문제에서 사용할 해킹 기법은 buffer overflow이며 buffer overflow(bof)란
직역하면 버퍼가 넘쳐흐른다는 뜻으로 프로그래머가 지정한 곳 바깥(의도하지 않은 메모리공간)에 해커가 데이터를 저장시키거나 유출시키는 해킹기법이다.
이는 프로그램이 정상적인 동작을 하지 못하도록 하며 bof를 활용한 다양한 해킹 기법이 존재한다.


그림1
메모리 구조를 파악하기 위해 디버깅을 진행하여아 하는데 그냥은 권한이 없어 디버깅을 할 수 없다.
따라서 hint의 소스를 리다이렉션하거나 복사하여 tmp디렉터리에 바이너리 파일을 만들어 디버깅한다.


그림2
gdb란 gnu debugger의 약자로 디스어셈블을 도와주어 메모리 구조 파악을 용이하게 해주는 도구이다.
-q옵션은 gdb를 실행할 때 설명을 생략하는 옵션.
set dis intel은 set disassembly intel명령으로 intel방식으로 디스어셈블하도록 설정하는 명령이다. (default는 at&t방식)
disas main은 disassemble main명령으로 main함수를 디스어셈블한다.

ebp-40의 값을 eax에 복사하여 push하고 fgets함수를 호출한다. 이는 buf2의 주소가 ebp-40임을 알 수 있다.

그림2
ebp-24의 값을 eax에 복사하여 push하고 strncmp함수를 호출한다. 이는 buf의 주소가 ebp-24임을 알 수 있다.
buf2와 buf의 offset값(40-24)은 16임을 알 수 있다.

메모리구조
buf2(10Byte)
dummy(6Byte)
buf(10Byte)
sfp(4byte)
ret(4byte)


그림2
페이로드는 아무값(16Byte) + “go”(2Byte)로 구성된다.
buf2의 size는 10Byte지만 그보다 많은 값을 집어넣어 결과적으로는 buf의 메모리까지 접근하였고,
이는 프로그램의 비정상적인 동작을 유도한다. buf의 메모리에 “go”를 넣었기 때문에 if문이 true가 될 수 있었다.