[LOB] darkknight -> bugbear

Posted by dw0rdptr
2015. 4. 12. 15:30 System/LOB


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
/*
        The Lord of the BOF : The Fellowship of the BOF
        - bugbear
        - RTL1
*/
 
#include <stdio.h>
#include <stdlib.h>
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 betrayed you!!\n");        
        exit(0);    
    }    
    
    strcpy(buffer, argv[1]); 
    printf("%s\n", buffer);
 
}
cs


bugbear의 소스이다 . 힌트를 보면 알 수 있듯이 이번엔 RTL 기법을 사용해서 풀어야 한다. ret에 스택내의 주소를 덮으려하면 스택이 배신했다고 하면서 종료돼버린다.


RTL(Return To Libc) : 스택에서 어떤 코드도 실행되지 못하도록 하는 보호기법이 나온 이후 나온 기법. 프로그램이 실행될 때 프로그램이 사용한 함수를 포함한 내장라이브러리인 Libc가 Libc 영역에 적재된다. 이 라이브러리에는 system()함수도 포함되어있는데 프로그램이 이함수를 쓰지 않더라도 LIbc가 통째로 올라가기 때문에 메모리에 같이 적재된다

*system()함수 : 명령어를 실행하는 함수. 


이제 메모리 적재되어있는 Libc 영역에서 system() 함수의 주소를 찾고 인자로 "/bin/sh"를 주면 다음레벨의 쉘을 딸 수 있을것이다.


system()함수의 주소는0x40058ae0이다.


이제 "/bin/sh"문자열이 있는 주소를 전달하면 되는데 환경변수를 /bin/sh로 등록해도되지만 system() 함수 내에서도 /bin/sh라는 문자열이 존재한다.

1
2
3
4
5
6
7
8
9
10
int main(int argc, char * argv[])
{
    long shell;
    shell = 0x40058ae0//system 함수 주소
    while(memcmp((void *)shell, "/bin/sh"8)) //시스템 함수 내에서 /bin/sh문자열 비교 
    shell++;
    printf("/bin/sh = %p\n",shell); // /bin/sh문자열이 있는 
}
 
 
cs

 위 소스로 "/bin/sh" 문자열이 있는 주소를 찾을 수 있다.


주소는 0x400fbff9


프로그램의 ret주소를 system()함수의 주소로 채우고 뒤에 인자를 전달하는데, ret명령에 의해 호출된 system() 함수는 ret가 쌓이지 않기 때문에 비어있는 ret자리인 4byte를 더미로 채우고 인자(/bin/sh의 주소)를 전달한다



페이로드와 Password




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

[LOB] giant -> assassin  (0) 2015.04.14
[LOB] bugbear -> giant  (2) 2015.04.14
[LOB] golem -> darkknight  (0) 2015.04.11
함수의 프롤로그(prologue) 및 에필로그(epilogue)  (0) 2015.04.10
[LOB] skeleton -> golem  (0) 2015.04.07

[LOB] golem -> darkknight

Posted by dw0rdptr
2015. 4. 11. 02:16 System/LOB
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
/*
        The Lord of the BOF : The Fellowship of the BOF
        - darkknight
        - FPO
*/
 
#include <stdio.h>
#include <stdlib.h>
 
void problem_child(char *src)
{
    char buffer[40];
    strncpy(buffer, src, 41);
    printf("%s\n", buffer);
}
 
main(int argc, char *argv[])
{
    if(argc<2){
        printf("argv error\n");
        exit(0);
    }
 
    problem_child(argv[1]);
}
cs


먼저 함수의 프롤로그와 에필로그 글을 보고 오자


darkknight 소스를 보면
주석에 FPO라고 쓰여져있는데 이는 Frame Pointer Overflow의 약자로 함수 에필로그 과정에서 함수를 종료하면서 ebp포인터를 복구시킬 때 공격자가 원하는곳으로 ebp를 이동시켜 공격코드를 실행시키는 기법이다.


strncpy함수를 쓰는데 41바이트제한으로 딱 1바이트 오버플로우를 시킬 수 있다. sfp(saved frame pointer) 영역의 마지막 1바이트를 변조시킬 수 있다. 겨우 1바이트로 뭘하지 할텐데

우선 sfp에 저장되어있는 값을 보자

버퍼크기만큼 채운 NOP바로 뒤 sfp에 0xbffffa00값이 들어있다.

버퍼의 시작주소가 담겨있는 주소 역시 0xbffffaa0로 앞의 3바이트가 같으므로 1바이트 변조로도 ebp를 버퍼로 이동시킬 수 있다.


? 세폴이 뜬다. core를 떨어트려 분석해보자


역시 주소가 바뀌어있다. 80으로 바꿔서 해보자


세폴이뜬다.

problem_child에서 sfp를 변조하면 ebp는 0xbffffa80으로 날아간다. 그리고 main으로 돌아가서 나머지들을 실행한 후

main의 leave 과정을 통해 mov esp, ebp 명령어를 실행 할 때 esp가 0xbffffa80으로 날아가게 된다

leave과정중 pop ebp를 하게 되면 esp값이 +4가 된다.

그상태에서 ret과정을 통해 pop eip와 jmp eip, 결과적으로 0xbffffa80(esp)+4의 주소에 있는 값이 eip에 들어가고 그 값으로 jmp(점프)하게 되어서 0x90909090 주소로 점프해버려 쉘코드 실행이 되지 않는것이다,


주소를 -4하면 해결된다

\x80->\x7c


페이로드와  Password







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

[LOB] bugbear -> giant  (2) 2015.04.14
[LOB] darkknight -> bugbear  (0) 2015.04.12
함수의 프롤로그(prologue) 및 에필로그(epilogue)  (0) 2015.04.10
[LOB] skeleton -> golem  (0) 2015.04.07
[LOB] vampire -> skeleton  (0) 2015.04.01

함수의 프롤로그(prologue) 및 에필로그(epilogue)

Posted by dw0rdptr
2015. 4. 10. 03:51 System/LOB
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
/*
        The Lord of the BOF : The Fellowship of the BOF
        - darkknight
        - FPO
*/
 
#include <stdio.h>
#include <stdlib.h>
 
void problem_child(char *src)
{
    char buffer[40];
    strncpy(buffer, src, 41);
    printf("%s\n", buffer);
}
 
main(int argc, char *argv[])
{
    if(argc<2){
        printf("argv error\n");
        exit(0);
    }
 
    problem_child(argv[1]);
}
cs

r

LOB darkknight의 소스이다. strncpy함수를 호출하는데 딱 1바이트만 오버플로우를 일으킬 수 있다.

이문제는 FPO(Frame Pointer Overflow)기법으로 풀어야 하는데 그전에 함수 프롤로그와 에필로그를 먼저 이해해야 한다.



참고) mov %esp(source),%ebp(destination)   -> AT&T 문법

  mov ebp(destination), esp(source)        -> intel 문법       

둘은 같은 명령을 의미(표기방법의 차이. 자세한건 구글신)


main에서 p(problem_child)함수를 호출했다.

어셈블리에선 생략되어있지만 우선 ret이 생성된다.

higher address

------------

      ret

------------ <-esp

lower address



먼저 push %ebp를 한다. 현재 ebp에는 main함수의 frame pointer(base pointer라고도 함)값이 있는데 이를 push해서 저장한 공간을 sfp(saved frame pointer) 라고 한다. push하였기 때문에 esp가 움직인다.

higher address

------------

      ret

------------

sfp(main의 ebp)

------------ <- esp

lower address



그리고 mov %esp, %ebp로 현재의 esp값을 ebp에 넣는다.(ebp를 esp로 이동시킨다)

현재까지의 스택상황을 보면

higher address

------------

      ret

------------

sfp

------------ <- ebp,esp

lower address


지금 ebp의 위치가 p함수의 frame pointer가 되는것이다

여기까지가 함수 프롤로그.



이제 p함수내에서 버퍼를 선언하면

higher address

------------

      ret

------------

sfp

------------ <- ebp


  buffer[40]

------------ <- esp

lower address


이렇게 esp에서 할당할 만큼의 공간을 빼면서 진행한다




* 아무래도 intel문법이 편해서 지금부턴 intel문법을 쓰겠다.




함수에필로그 과정은  leave와 ret이 있다

각각의 부분에서 실행하는 명령어는 다음과 같다

leave

ret

mov esp, ebp

 pop eip

pop ebp

 jmp eip


먼저 leave에서 p함수는 mov esp, ebp로 그동안 함수내에서 진행한 esp를 ebp값으로 돌려놓는다, 즉 위에서 진행했던 p함수의 프롤로그가 진행된 직후 상태로 되돌린다.

higher address

------------

      ret

------------

sfp

------------ <- ebp,esp

lower address




그리고 pop ebp명령어를 통해 sfp에 들어있던 main의 frame pointer 값이 ebp로 들어가게 된다 (ebp는 이제 main의 frame pointer를 가리키게 됨) pop했으니 esp 4증가.

higher address

------------

      ret

------------ <- esp

lower address



마지막으로 pop eip를 하면 ret에 있는 주소가 eip에 들어가게되고 jmp eip로 점프해 main함수 안의 p함수를 호출한 직후로 가게된다.





darkknight의 풀이는 다음글에서 다룰것이다. 이 글을 이해했으면 굳이 다음 글을 읽지 않아도 해결할 수 있을 것이다.



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

[LOB] darkknight -> bugbear  (0) 2015.04.12
[LOB] golem -> darkknight  (0) 2015.04.11
[LOB] skeleton -> golem  (0) 2015.04.07
[LOB] vampire -> skeleton  (0) 2015.04.01
[LOB] troll -> vampire  (0) 2015.04.01

[LOB] skeleton -> golem

Posted by dw0rdptr
2015. 4. 7. 16:19 System/LOB
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
/*
        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, 044);
    memset(buffer+4800xbfffffff - (int)(buffer+48));
}
cs

1) egghunter가 없다 -> 환경변수 사용가능

2) argv[1][47] 에 \xbf가 없으면 종료(ret 주소) -> 스택 내에 쉘코드를 써야한다는 것을 뜻합

3) stack destroyer ! -> 스택을 모조리 초기화시켜버림


ret에 스택내의 주소를 덮어야하는데 스택을 몽땅 초기화시켜버려 답이 없는듯 보이지만 환경변수를 못쓰는 제약을 풀어놓아서 LD_PRELOAD 라는 환경변수를 이용하면 된다

프로그램이 실행될 때 일반적으로 정의되어있는 공유라이브러리를 참조하는데 공유라이브러리 파일을 만들어LD_PRELOAD라는 환경변수에 정의하면 이를 먼저 참조한다. 이 과정에서 찌꺼기가 남게 되는데 이를 이용하면 쉘을 딸 수 있다


*공유라이브러리를 사용하는 이유? : 여러 함수가 내장되어있는 공유라이브러리를 메모리에 올려놓으면 여러 프로그램이 동시에 활용할 수 있기 때문에 디스크공간과 메모리공간을 절약할 수 있다

touch test.c로 파일생성뒤 gcc로 컴파일하는데 이름은 NOP+쉘코드로 한다

그리고 LD_PRELOAD 환경변수도 같은 이름으로 정의한다



이제 프로그램이 실행될 때 LD_PRELOAD 를 먼저 참조하고 stack destroyer 뒤에도 쉘코드가 스택에 존재하게 될 것이다

gdb로 분석해보자

? 없네.. 좀더 뒤에서 찾아봐야겠다



x50x $esp-4000으로 노가다뛰어서 찾으니 NOP이 나왔다 

0xbffff60c로 공격하자


페이로드와 Password



 





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

[LOB] golem -> darkknight  (0) 2015.04.11
함수의 프롤로그(prologue) 및 에필로그(epilogue)  (0) 2015.04.10
[LOB] vampire -> skeleton  (0) 2015.04.01
[LOB] troll -> vampire  (0) 2015.04.01
[LOB] orge -> troll  (0) 2015.04.01

[LOB] vampire -> skeleton

Posted by dw0rdptr
2015. 4. 1. 16:12 System/LOB
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
43
44
45
46
47
48
49
50
/*
        The Lord of the BOF : The Fellowship of the BOF
        - skeleton
        - argv hunter
*/
 
#include <stdio.h>
#include <stdlib.h>
 
extern char **environ;
 
main(int argc, char *argv[])
{
    char buffer[40];
    int i, saved_argc;
 
    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");
        exit(0);
    }
 
    // check the length of argument
    if(strlen(argv[1]) > 48){
        printf("argument is too long!\n");
        exit(0);
    }
 
    // argc saver
    saved_argc = argc;
 
    strcpy(buffer, argv[1]); 
    printf("%s\n", buffer);
 
        // buffer hunter
        memset(buffer, 040);
 
    // ultra argv hunter!
    for(i=0; i<saved_argc; i++)
        memset(argv[i], 0, strlen(argv[i]));
}
cs

1) egghunter 환경변수를 못씀

2) argv[1][47] 에 \xbf가 없으면 종료(ret 주소) -> 스택 내에 쉘코드를 써야한다는 것을 뜻합

3) buffer hunter 버퍼를 비움 -> 버퍼내에 쉘코드 쓰기불가

4) argv[1](첫번째 인자) 길이를 48로 제한

5) ultra argv hunter! argv 모두 초기화



버퍼에 인자도 모두 못써서 난감했는데 스택의 끝에 프로그램경로가 저장된다고 한다


argv가 모두 초기화 된 후main+368에 브포를 걸고


경로가 나올때까지 계속찾아본다

.....(엄청난 노가다)


메모리의 맨 끝, 스택으로 보면 맨 처음에 경로가 있는걸 확인할 수 있다


전레벨처럼 쉘코드를 이름으로 한 심볼릭링크를 생성한다

\x68\x8a\xe2\xce\x81\x68\xb1\x0c\x53\x54\x68\x6a\x6f\x8a\xe4\x68\x01\x69\x30\x63\x68\x69\x30\x74\x69\x6a\x14\x59\xfe\x0c\x0c\x49\x79\xfa\x41\xf7\xe1\x54\xc3


여기서 쉘코드앞에 경로 "/home/vampire/"부분을 빼야하는데 간단하게 0xbfffffd2에서 14를 더하면

0xbfffffe5+14=0xbffffff3 을 ret에 덮어주면 된다




?? 분명 제대로했는데;; 주소가 바뀐건가

심볼릭링크 원본을 skeleto1로 바꿔 core를 떨어트린 후 분석해보자




역시 주소가 바뀌었다. 그런데 왜 아까 절대경로이던게 상대경로가 된건지는 잘 모르겠다

"./"를 빼기 위해 2바이트를 더한 0xbfffffd4 를 ret에 덮어주고 페이로드를 다시 짜보자



페이로드와 Password



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

함수의 프롤로그(prologue) 및 에필로그(epilogue)  (0) 2015.04.10
[LOB] skeleton -> golem  (0) 2015.04.07
[LOB] troll -> vampire  (0) 2015.04.01
[LOB] orge -> troll  (0) 2015.04.01
[LOB] darkelf -> orge  (0) 2015.03.31

[LOB] troll -> vampire

Posted by dw0rdptr
2015. 4. 1. 11:50 System/LOB
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
/*
        The Lord of the BOF : The Fellowship of the BOF
        - vampire
        - check 0xbfff
*/
 
#include <stdio.h>
#include <stdlib.h>
 
main(int argc, char *argv[])
{
    char buffer[40];
 
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
 
    if(argv[1][47!= '\xbf')
    {
        printf("stack is still your friend.\n");
        exit(0);
    }
 
        // here is changed!
        if(argv[1][46== '\xff')
        {
                printf("but it's not forever\n");
                exit(0);
        }
 
    strcpy(buffer, argv[1]); 
    printf("%s\n", buffer);
}
cs


1) ret중 bf와 ff체크 -> bff00000 보다 낮은 주소를 써야한다


스택은 높은주소부터 낮은주소로 거꾸로 자란다 

argv[2]까지 전달했다면 스택에는 argv[2],argv[1],argv[0] 순서로 저장이 된다 즉, 숫자가 높은 인자부터 스택에 저장이된다


higher address

| argv[2] |         

| argv[1] |       ↓ 스택의 진행 방향     

| argv[0] |

lower address


여기서 argv[2], 즉 세번째 인자가 길어지면? 그 다음 스택에 저장되는 argv[1]는 더 낮은 주소에서 시작하게 된다



vampire의 소스를 변경해 argv[1]의의 주소를 출력하도록 하는 vampir1를 컴파일하고 실행했다.
argv[2]를 주지 않았을 때 argv[1]는 bffffc65에서 시작한다


그리고 argv[2]에 A를 20000개 주었더니 주소가 낮아진 것을 확인할 수 있다.

90000개쯤 늘려보니 드디어 bf"fe"9cd4, ff가 아닌 주소가 나왔다.


페이로드와 Password







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

[LOB] skeleton -> golem  (0) 2015.04.07
[LOB] vampire -> skeleton  (0) 2015.04.01
[LOB] orge -> troll  (0) 2015.04.01
[LOB] darkelf -> orge  (0) 2015.03.31
[LOB] wolfman -> darkelf  (0) 2015.03.25

[LOB] orge -> troll

Posted by dw0rdptr
2015. 4. 1. 02:15 System/LOB
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
#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

1) egghunter 환경변수를 못씀

2) argv[1][47] 에 \xbf가 없으면 종료(ret 주소) -> 스택 내에 쉘코드를 써야한다는 것을 뜻합

3) buffer hunter 버퍼를 비움 -> 버퍼내에 쉘코드 쓰기불가

4) argv[1](첫번째 인자) 길이를 48로 제한

5) 인자 두개(argv[0],argv[1]) 제한  -> argv[2]를 이용한 익스플로잇 불가

6) argv[1] 를 비움


버퍼도 막히고 argv[1]도 막혔으니 심볼릭링크와 argv[0]를 이용하자

전레벨에서는 길이만 77로 맞추면 됐었으나 이번엔 쉘코드를 써야 한다


이번엔 좀 다른 쉘코드를 쓰는데 \x2f가 없는 쉘코드이다(48bytes)

\x2f는 '/' 를 의미하는데 심볼릭링크를 생성할 때 /는 경로를 의미하기 때문에 심볼릭링크 생성이 안되므로 다음 쉘코드를 쓴다

\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



troll.c 소스를 tro11.c로 복사해 버퍼를 출력하는 부분을 argv[0]의 주소를 출력하게 수정하고 tro11로 컴파일한다

tro11에 대한 심볼릭 링크의 파일명을 쉘코드로 하고 심볼릭링크를 실행하면 argv[0]의 주소인 bffffbb4가 나온다


같은방법으로 troll에 대한 심볼릭링크를 만들어 ret 주소를 bffffbb4로 페이로드를 짜면된다


페이로드와 Password







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

[LOB] vampire -> skeleton  (0) 2015.04.01
[LOB] troll -> vampire  (0) 2015.04.01
[LOB] darkelf -> orge  (0) 2015.03.31
[LOB] wolfman -> darkelf  (0) 2015.03.25
[LOB] orc -> wolfman  (0) 2015.03.24

[LOB] darkelf -> orge

Posted by dw0rdptr
2015. 3. 31. 17:45 System/LOB

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
43
#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);
    }
 
    // here is changed!
    if(strlen(argv[0]) != 77){
                printf("argv[0] 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");
        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);
}
cs

1) egghunter 환경변수를 못씀

2) argv[1][47] 에 \xbf가 없으면 종료(ret 주소) -> 스택 내에 쉘코드를 써야한다는 것을 뜻합

3) buffer hunter 버퍼를 비움 -> 버퍼내에 쉘코드 쓰기불가

4) argv[1](첫번째 인자) 길이를 48로 제한

5) argv[0] 길이 77이 되어야함


argv[0]은 프로그램을 호출하는 데 사용하는 명령이 저장되는데,

argv[0]의 길이가 77이 아니면 프로그램을 종료한다



프로그램의 경로를 늘려 77로 맞추는데에 두 가지 방법이 있다

./orge [전달할 인자] 이렇게 실행하면 argv[0]에 6이 들어가게 되는데, 스크립트를 써서

.////////////////////////...../////////////orge [인자]

이런식으로 '/'를 72개를 채워 77자를 맞추면 argv[0] error 분기점을 무사히 넘어가 stack is still your friend가 나온다.



또 다른 방법은 심볼릭링크를 생성해 파일명을 77자로 맞추는것이다



성공적으로 넘어가 stack is still your friend이 떴다


나머지는 전레벨과 똑같다

arge.c 소스를 argv[1]의 주소를 출력하게 바꿔서 argv[1]의 주소를 구하고



페이로드와 Password




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

[LOB] troll -> vampire  (0) 2015.04.01
[LOB] orge -> troll  (0) 2015.04.01
[LOB] wolfman -> darkelf  (0) 2015.03.25
[LOB] orc -> wolfman  (0) 2015.03.24
[LOB] goblin -> orc  (0) 2015.03.21

[LOB] wolfman -> darkelf

Posted by dw0rdptr
2015. 3. 25. 12:26 System/LOB
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
#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");
        exit(0);
    }
 
    //chek 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);
}
cs


1) egghunter 환경변수를 못씀

2) argv[1][47] 에 \xbf가 없으면 종료(ret 주소) -> 스택 내에 쉘코드를 써야한다는 것을 뜻합

3) buffer hunter 버퍼를 비움 -> 버퍼내에 쉘코드 쓰기불가

4) argv[1](첫번째 인자) 길이를 48로 제한


argv[1]의 길이를 48까지 줄 수 있게 제약이 추가되었지만 

전단계에서도 buffer[40] + sfp[4] + ret[4] 딱 48까지 인자를 전달했기 때문에 있으나마나한 제약이다,


argv[1]의 주소를 구해 전레벨의 페이로드를 그대로 갖다쓰면된다.



페이로드와 Password



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

[LOB] orge -> troll  (0) 2015.04.01
[LOB] darkelf -> orge  (0) 2015.03.31
[LOB] orc -> wolfman  (0) 2015.03.24
[LOB] goblin -> orc  (0) 2015.03.21
[LOB] cobolt -> goblin  (0) 2015.03.20

[LOB] orc -> wolfman

Posted by dw0rdptr
2015. 3. 24. 23:46 System/LOB
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
#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");
        exit(0);
    }
    strcpy(buffer, argv[1]); 
    printf("%s\n", buffer);
 
        // buffer hunter
        memset(buffer, 040);
}
 
 
 

cs

전레벨과 같은 소스에서 buffer hunter가 추가되어 버퍼를 비운다.


1) egghunter 환경변수를 못씀

2) argv[1][47] 에 \xbf가 없으면 종료(ret 주소) -> 스택 내에 쉘코드를 써야한다는 것을 뜻합

3) buffer hunter 버퍼를 비움 -> 버퍼내에 쉘코드 쓰기불가



strcpy함수를 보자

argv[1], 즉 프로그램에서 받은 인자를 buffer에 복사한다면 argv[1]의 주소에도 인자가 쓰여져 있으므로 buffer hunter 때문에  ret에 buffer의 주소를 덮지 못한다면 argv[1]의 주소를 덮으면 된다.


printf("%s\n",buffer);를 printf("%p"\n",argv[1]);로 바꾸고 argv[1]의 주소를 알아내 ret에 덮어쓰면 끝


전레벨과 동일하지만 ret에 argv[1]의 주소를 덮는다는 것이 차이점이다


페이로드와 Password




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

[LOB] darkelf -> orge  (0) 2015.03.31
[LOB] wolfman -> darkelf  (0) 2015.03.25
[LOB] goblin -> orc  (0) 2015.03.21
[LOB] cobolt -> goblin  (0) 2015.03.20
[LOB] gremlin -> cobolt  (0) 2015.03.18