본문 바로가기
HACKING_GAME/SYSTEM

LOB#4 egghunter (goblin -> orc)

by asdf12345 2020. 4. 26.

1. 개념

eggshell란 ? stack내 shell code 저장 불가 시 (or etc), 환경변수 내 shell code 저장 후, 환경변수의 주소 값으로 eip를 이동시켜 shell code 실행하는 기법

 

2. 문제풀이

1. CODE

 

/*
        The Lord of the BOF : The Fellowship of the BOF
        - orc
        - egghunter
*/

#include 
#include 

extern char **environ;

main(int argc, char *argv[])
{
    char buffer[40];
    int i;

    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }

    // egghunter 
    for(i=0; environ[i]; i++)
        memset(environ[i], 0, strlen(environ[i]));

    if(argv[1][47] != '\xbf')
    {
        printf("stack is still your friend.\n");
        exit(0);
    }

    strcpy(buffer, argv[1]); 
    printf("%s\n", buffer);
}

 

 

2. Solution

1) Code Review

 [1] environ[i] 0 값 세팅 이유 <- eggshell 기법

 [2] argv[1][47] == '\xbf' 

 

assembly 파악 

(gdb) disas main
...
0x8048587 <main+135>: mov    0xc(%ebp),%eax
0x804858a <main+138>: add    $0x4,%eax
0x804858d <main+141>: mov    (%eax),%edx
0x804858f <main+143>: add    $0x2f,%edx
0x8048592 <main+146>: cmpb   $0xbf,(%edx)
...
mov 0xc(%ebp), %eax

%ebp 

0

---$ebp 시작

return address

argc

*argv[] (인자의 값을 가리키는 주소들을 가리키는 값)

100

 

--> 0xc(%ebp) = 인자의 값을 가리키는 주소 = %eax

add $0x4, %eax

%eax = 실행프로그램명을 가리키는 주소

%eax+4 = 인자 값을 가리키는 주소

mov (%eax), %edx

인자 값을 %edx에 넣어준다

add $0x2f, %edx

인자 문자열에서 48번째 byte의 주소를 edx에 넣어준다.

cmpl $0xbf, (%edx)

0xbf 값과 %edx 값 비교 -> 인자 문자열+48번째 바이트와 0xbf를 비교

 

[3] strcpy() 문자열 길이 NO CHECK

1. return address 주소

CALL main 후 stack 값 확인

2. buffer 주소

strcpy() 이후 stack 값 확인

 

3. SHELL CODE 작성

스택 주소 변경을 감안하여 nop코드 추가

 

'HACKING_GAME > SYSTEM' 카테고리의 다른 글

LOB#1 gate  (0) 2020.07.19
PWNABLE#7 input  (0) 2020.05.14
LOB#6 check length of argv[1] + egghunter + bufferhunter (wolfman -> darkelf)  (0) 2020.05.10
PWNABLE#3 bof  (0) 2020.04.26
LOB#2 small buffer (gremlin -> cobolt)  (0) 2020.04.26