Phantom

[Golem] golem -> darkknight 풀이 본문

Pwnable/[Wargame]Load of Bof

[Golem] golem -> darkknight 풀이

Ph4nt0m_ 2015. 1. 5. 22:26
반응형


Colored By Color Scripter

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]);
}


이번 단계는 Frame Pointer Overflow라고 하기도 하고 1 Byte Overflow 라고도 하는 기법입니다


쉘 획득과정 페이로드



1. main에서 problem_chid()를 호출합니다

2 .problem_child에서 strncpy로 buffer 40바이트 이후 SFP 1바이트만 덮어쓰고 그 1바이트로  

   problem_chid의 leave 명령을 통해

   mov ebp, esp

   pop ebp

   로 변조된 ebp값을 pop해서 main의 ebp를 변조된 ebp로 저장하고


3. problem_child의 ret를 통해 main으로 복귀하여 main의 leave ret을 실행하는데

    problem_child에서 변조된 ebp를 main에서 받아 변조된 main의 ebp로 이동, 

    pop ebp에 의해 esp는 +4 byte증가합니다 esp+4의위치는 ret의 위치이구요

    ret명령으로 eip는 esp를 참조해서 쉘코드를 실행할 주소로 점프합니다 



 




먼저 소스코드를 조금 수정했습니다

Colored By Color Scripter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
 
void problem_child(char *src)
{
    char buffer[40];
    strncpy(buffer, src, 41);
    printf("%s\n", buffer);
    printf("[ %p ]\n",buffer);
}
 
main(int argc, char *argv[])
{
    if(argc<2){
        printf("argv error\n");
        exit(0);
    }
 
    problem_child(argv[1]);
}



명령문 작성하기


우리는 마지막 끝자리 바이트를 이용해 SHELLCODE가 있는곳으로 점프할건데요 우선

펄로 아무 값이나 집어넣고 buffer의 시작점을 알아냅니다

 시작지점이 0xbffffaa4네요 그럼 마지막 바이트를 \xa4로 바꾸면 저곳으로 점프를 하겠죠?
 명령문에 쓸 코드는 AAAA + ret로 점프할 코드(NOP코드 사이)(4) + NOP(7) + SHELLCODE(25) + 변조할끝자리(1) = 41바이트가 되겠는데요 작성하겠습니다


이로써 darkknight의 권한을 얻었습니다


반응형
Comments