[LOB] golem -> darkknight

Posted by dw0rdptr
2015. 4. 11. 02:16 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
/*
        The Lord of the BOF : The Fellowship of the BOF
        - darkknight
        - FPO
*/
 
#include <stdio.h>
#include <stdlib.h>
 
void problem_child(char *src)
{
    char buffer[40];
    strncpy(buffer, src, 41);
    printf("%s\n", buffer);
}
 
main(int argc, char *argv[])
{
    if(argc<2){
        printf("argv error\n");
        exit(0);
    }
 
    problem_child(argv[1]);
}
cs


먼저 함수의 프롤로그와 에필로그 글을 보고 오자


darkknight 소스를 보면
주석에 FPO라고 쓰여져있는데 이는 Frame Pointer Overflow의 약자로 함수 에필로그 과정에서 함수를 종료하면서 ebp포인터를 복구시킬 때 공격자가 원하는곳으로 ebp를 이동시켜 공격코드를 실행시키는 기법이다.


strncpy함수를 쓰는데 41바이트제한으로 딱 1바이트 오버플로우를 시킬 수 있다. sfp(saved frame pointer) 영역의 마지막 1바이트를 변조시킬 수 있다. 겨우 1바이트로 뭘하지 할텐데

우선 sfp에 저장되어있는 값을 보자

버퍼크기만큼 채운 NOP바로 뒤 sfp에 0xbffffa00값이 들어있다.

버퍼의 시작주소가 담겨있는 주소 역시 0xbffffaa0로 앞의 3바이트가 같으므로 1바이트 변조로도 ebp를 버퍼로 이동시킬 수 있다.


? 세폴이 뜬다. core를 떨어트려 분석해보자


역시 주소가 바뀌어있다. 80으로 바꿔서 해보자


세폴이뜬다.

problem_child에서 sfp를 변조하면 ebp는 0xbffffa80으로 날아간다. 그리고 main으로 돌아가서 나머지들을 실행한 후

main의 leave 과정을 통해 mov esp, ebp 명령어를 실행 할 때 esp가 0xbffffa80으로 날아가게 된다

leave과정중 pop ebp를 하게 되면 esp값이 +4가 된다.

그상태에서 ret과정을 통해 pop eip와 jmp eip, 결과적으로 0xbffffa80(esp)+4의 주소에 있는 값이 eip에 들어가고 그 값으로 jmp(점프)하게 되어서 0x90909090 주소로 점프해버려 쉘코드 실행이 되지 않는것이다,


주소를 -4하면 해결된다

\x80->\x7c


페이로드와  Password







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

[LOB] bugbear -> giant  (2) 2015.04.14
[LOB] darkknight -> bugbear  (0) 2015.04.12
함수의 프롤로그(prologue) 및 에필로그(epilogue)  (0) 2015.04.10
[LOB] skeleton -> golem  (0) 2015.04.07
[LOB] vampire -> skeleton  (0) 2015.04.01