[LOB] zombie_assassin -> succubus

Posted by dw0rdptr
2015. 4. 30. 16:38 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
        The Lord of the BOF : The Fellowship of the BOF
        - succubus
        - calling functions continuously 
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <dumpcode.h>
 
// the inspector
int check = 0;
 
void MO(char *cmd)
{
        if(check != 4)
                exit(0);
 
        printf("welcome to the MO!\n");
 
    // olleh!
    system(cmd);
}
 
void YUT(void)
{
        if(check != 3)
                exit(0);
 
        printf("welcome to the YUT!\n");
        check = 4;
}
 
void GUL(void)
{
        if(check != 2)
                exit(0);
 
        printf("welcome to the GUL!\n");
        check = 3;
}
 
void GYE(void)
{
    if(check != 1)
        exit(0);
 
    printf("welcome to the GYE!\n");
    check = 2;
}
 
void DO(void)
{
    printf("welcome to the DO!\n");
    check = 1;
}
 
 
 
main(int argc, char *argv[])
{
    char buffer[40];
    char *addr;
 
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
 
    // you cannot use library
    if(strchr(argv[1], '\x40')){
        printf("You cannot use library\n");
        exit(0);
    }
 
    // check address
    addr = (char *)&DO;
        if(memcmp(argv[1]+44, &addr, 4!= 0){
                printf("You must fall in love with DO\n");
                exit(0);
        }
 
    // overflow!
    strcpy(buffer, argv[1]);
    printf("%s\n", buffer);
 
    // stack destroyer
    // 100 : extra space for copied argv[1]
    memset(buffer, 044);
    memset(buffer+48+10000xbfffffff - (int)(buffer+48+100));
 
    // LD_* eraser
    // 40 : extra space for memset function
    memset(buffer-300003000-40);
}
cs

소스가 길어졌다... 힌트를 보면 calling functions continuously, 함수 연속호출을 뜻하는것 같다


전역변수로 check를 선언한다

공유라이브러리를 사용할 수 없고, ret가 함수 DO의 주소가아니면 종료해버린다.

DO,GYE,GUL,YUT,MO를 연속적으로 호출해 함수MO의 system함수로 쉘을 실행시키자


ret에 DO의 주소를 덮으면 DO가 호출된다. ret로 호출된 함수는 그 함수의 ret가 생성되지 않기 때문에 바로 다음함수인 GYE의 주소를 덮어쓴다. 이런식으로 먼저 MO까지 호출해보자


DO : 0x80487ec
GYE : 0x80487bc
GUL : 0x804878c
YUT : 0x804875c
MO : 0x8048724

-> gdb로 구한 함수의주소

[ buffer+sfp(44bytes) ][DO()][GYE()][GUL()][YUT()][MO()]


MO까지 성공적으로 호출했다. MO는 *cmd를 인자로 받는데 공유라이브러리를 쓰지 못하니 argv[1]에 /bin/sh를 쓰고 주소를 구해 전달하자

[ buffer+sfp(44bytes) ][DO()][GYE()][GUL()][YUT()][MO()][dummy(4bytes)][&/bin/sh][/bin/sh]


먼저 core를 떨어트려 주소를구하자

[ buffer+sfp(44bytes) ][DO()][GYE()][GUL()][YUT()][MO()][AAAA][BBBB][CCCC]

/bin/sh 가 들어갈 주소인 0xbffffa68이 $/bin/sh이다


페이로드와 Password



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

[LOB] nightmare -> xavious  (1) 2015.06.27
[LOB] succubus -> nightmare  (0) 2015.06.01
[LOB] assassin -> zombie_assassin  (0) 2015.04.18
[LOB] giant -> assassin  (0) 2015.04.14
[LOB] bugbear -> giant  (2) 2015.04.14