DongDD's IT

[LOB] Level11 skeleton 본문

Wargame/LOB

[LOB] Level11 skeleton

DongDD 2018. 1. 24. 15:57

[LOB] Level11 skeleton


Problem



이번 문제도 golem 실행 파일과 golem.c 소스 코드 파일이 주어졌다.

소스 코드를 확인해보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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, 044);
        memset(buffer+4800xbfffffff - (int)(buffer+48));
}
cs


먼저, buffer의 size는 40 bytes였고 argv[1]의 48번째 글자는 "\xbf"여야하는 것으로 보아 stack 영역의 변수를 사용해야 하는 것처럼 보였다.

extern을 통해 환경 변수들을 불러온다. 앞 문제에서 여러가지 hunter들이 사라진 것 처럼 보였다. strcpy를 통해 argv[1]을 buffer에 복사하고 마지막에 buffer를 memset() 함수를 통해 초기화 해주고 buffer+48부터 stack의 끝 부분 까지 memset()을 통해 초기화를 시켜준다.

앞에 있던 모든 초기화 구문을 합친 것 같았다. stack 영역을 사용해야하는데 stack 영역을 모두 초기화했기 때문에 어떤 부분을 사용할 수 있을 까 gdb를 통해 찾아보았지만 쉽게 찾기는 어려웠다.



Solution


stack의 거의 모든 부분을 찾아보았지만 빈틈이 없어보였다.

그런데 stack destroyer에 관련된 문서를 보게 되었고 사용할 수 있는 것을 알게 되었다.

LD_LIBRARY_PATH와 LD_PRELOAD라는 공유 라이브러리에 관련된 환경 변수는 stack 영역에서 낮은 주소를 가지는 부분에 저장되기 때문에 초기화되지 않는 다는 것을 알게 되었고 이를 이용해보기로 했다.


1. LD_LIBRARY_PATH 이용 -> 실패 


LD_PRELOAD에 대해서는 몰랐지만 LD_LIBRARY_PATH에 대해서는 알고 있었어서 먼저 시도해보았다.



먼저 fPIC 옵션과 shared 옵션을 사용해 gcc로 공유 라이브러리 파일을 만들어주었다.

이것을 LD_LIBRARY_PATH에 넣어주고 gdb를 통해 메모리를 확인해보았다.



LD_LIBRARY_PATH에 생성한 공유 라이브러리를 넣어주고 gdb를 통해 메모리를 확인해보았다.

입력한 LD_LIBRARY_PATH의 NOP코드가 조금 보이는 것 같지만 완벽한 shell code가 들어가있지는 않은 것 같다.

알고보니 LD_LIBRARY_PATH는 특정 크기만큼만 들어간다고 한다.

그래서 NOP+shell code+NOP에서 NOP만 일부분 들어간 것 처럼 보인다.


LD_LIBRARY_PATH를 사용하는 방법은 어려워보인다.


2. LD_PRELOAD 이용



같은 방식으로 LD_PRELOAD에 shell code가 들어간 공유 라이브러리 파일을 넣고 gdb를 통해 메모리를 확인해보았다. 이번에는 NOP+shell code+NOP이 제대로 들어가있는 것을 확인할 수 있었다.

이제 이 memory주소를 가지고 payload를 작성하면 될 것 같았다.


shell code 주소 : 0xbffff5e0


사용한 shell code(48bytes) :

\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81 


Payload = dummy(44 bytes, "A"*40) + return address(shell code 주소, 0xbffff5e0)


위 Payload로 실행해 쉘을 얻을 수 있었다.


LD_LIBRARY_PATH와 LD_PRELOAD에 대해서 잘 모르고 있었는데 이번 문제를 풀며 도움이 많이 된 것 같다.




**************     Answer & Flag     **************


1. LD_PRELOAD 이용


Payload = dummy(44 bytes, "A"*44) + return address(shell code 주소, 0xbffff5e0)




Next ID : golem

Next PW : cup of coffee





'Wargame > LOB' 카테고리의 다른 글

[LOB] Level13 darkknight  (0) 2018.01.26
[LOB] level12 golem  (0) 2018.01.25
[LOB] Level10 vampire  (0) 2018.01.21
[LOB] Level9 troll  (0) 2018.01.21
[LOB] Level8 orge  (0) 2018.01.20
Comments