[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