systemhacking/practice

lob skeleton->goelm (LD_PRELOAD)

qkqhxla1 2015. 1. 18. 17:51

태국이가 쓴 LD_PRELOAD문서.


LD_PRELOAD를 이용한 hooking and wrapping.pptx


비슷한 관련 문서가 없으면 진짜 상당히 좋다고 생각한다. 초보자인 내가 보는데 이해가 잘된다!!


처음 보면 두번 이상 읽어서 완벽히 이해하기. 풀이는 http://turtle1000.tistory.com/46가 잘해놓음.


문서를 봤으면 동적으로 내가 LD_PRELOAD로 원래 있는 함수를 추가하면 원래의 함수가 실행되지


않고 LD_PRELOAD에 있는 함수가 실행된다. 예로 stdio.h 헤더파일에 printf함수가 있는데,


내가 정의한 printf함수를 LD_PRELOAD에 올려놓으면 stdio.h헤더파일이 있어도 내가 정의한


printf함수를 실행하게 된다. 하지만 setuid가 걸린 파일에서는 안된다고 한다. 만약 되면


setuid가 걸린 파일 내부의 함수중 아무거나 쉘을 실행하게끔 바꾸면 방법이 없기 때문이다.


어쨋든 위에 링크 걸어놓은대로 printf.c라는 파일에


#include <stdlib.h>


int printf(char *str)

{

        system("/bin/sh");

        return 0;

}

이렇게 printf함수를 내가 정의 해준다음 gcc -o printf.so printf.c -shared -fPIC 


으로 컴파일해주면 printf.so라는 동적 라이브러리가 생성이 되는데 이걸 LD_PRELOAD


에 올려놓고( export LD_PRELOAD=./printf.so 


golem.c를 gole1.c로 복사 후 exit(0); 등 부분을 전부 지운 후 gcc -o gole1 gole1.c로 컴파일해서


실행해보면 맨 끝의 printf("%s\n",buffer);의 출력부분에서 예상하던 출력과는 달리 우리가


LD_PRELOAD에 올려놓았던 쉘이 실행되어 쉘이 실행됨을 알 수 있다.


하지만 위에서 말했듯이 setuid가 걸린 파일은 이게 안된다.


하지만 우리가 비밀번호를 찾을때 쓰는 /bin/my-pass 는 (ls -l /bin/my-pass 로 확인) setuid


가 걸려 있지 않다. my-pass.c파일을

int geteuid(void)

{

        return 520;

}


처럼 작성한 뒤 gcc -o my-pass my-pass.c -shared -fPIC 과 같이 컴파일 후 


export LD_PRELOAD=./my-pass로 LD_PRELOAD에 올려놓고 실행해보면 euid520의


비밀번호가 보임을 확인할 수 있다. 지금 해보니 return 520;값을 511로 바꾸면 패스워드를


얻을 수 있고, 512,513 등으로 다 바꾸면 모든 비밀번호를 얻을 수 있다(??)





근데 의도가 이게 아닌 것 같으므로..


exploit.c파일을 만들고 내용은 작성하지 않는다. 컴파일 후 exploit를 LD_PRELOAD에


올려놓고 복사해둔 gole1.c 파일의 맨 마지막줄에 dumpcode(buffer-1050,100); 줄을 포함하고


./gole1 `python -c 'print "a"*44+"\xbf\xbf\xbf\xbf"'`와 같이 주소 확인용으로 실행해보면




와 같이 스택을 모두 초기화시켰음에도 불구하고 빨간색 부분에 올려둔 ./exploit가 남아있는걸


알 수 있다. 그럼 ./exploit 대신 파일명을 쉘코드로 하고, 리턴주소를 쉘코드로 가게끔 하면 된다.






그러면 우리가 올려둔 쉘코드가 빨간색 부분인 \x6a\xf6\xff\xbf주소에 올라가있음을


알 수 있다. 저 주소를 리턴주소로 바꿔보면 성공함을 알 수 있다.

'systemhacking > practice' 카테고리의 다른 글

lob darkknight->bugbear  (0) 2015.01.22
lob golem->darkknight (1바이트변조)  (0) 2015.01.21
lob vampire->skeleton  (0) 2015.01.17
lob orge->troll  (0) 2015.01.15
lob darkelf->orge  (0) 2015.01.09