2013-08-28 12 views
2

요즘에는 버퍼 오버 플로우 기술을 연구 중이며 그러한 취약점을 악용하는 방법을 더 잘 이해하기 위해 간단한 예제를 직접 작성하려고합니다. 여기버퍼 오버플로가 여전히 feseable입니까?

//bof.c  
#include <stdio.h> 
#include <string.h> 

void 
BOF() { 
    printf("BOF"); 
} 

void 
foo1(char* argv){ 
    char buff[10]; 
    strcpy(buff, argv); 
    printf("foo1"); 
} 

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

    if (argc < 1) { 
    return 0; 
    } 
    foo1(argv[1]); 
    return 0; 
} 

내 목표는 지껄 기능 BOF(), 인쇄하여 메시지로 이동하기 위해, BOF 취약점을 활용하는 것입니다

나는이 간단한 C 프로그램을 작성했습니다. 이렇게하기 위해서는 그래서 내가 가진 : GCC -ggdb -m64 -o bof.o -fno-스택 보호 -mpreferred 스택 경계 = 4 bof.c
  • 발견 :

    • 프로그램을 컴파일 BOF() 주소 : objdump -d bof.o | R perl -e 'print "\x44\x05\x40\x00\x00\x00\x00\x00" x1500', 그러나 아무 일도 발생하지 않습니다 : (나에게 0000000000400544을 제공합니다) GREP BOF는
    • 내가 할 GDB 내부 레지스터

    에서 일어나는 것을보기 위해 GDB 내에서 프로그램을 실행. 프로그램이 정상적으로 종료됩니다. 그래서 레지스터보고하기 위해 strcpy를 기능 직후 중단 점을 놓고, 내가받은 것은 : 레지스터가 왜

    rax   0x7ffffffeca20 140737488276000 
    rbx   0x0 0 
    rcx   0x7ffff7ab1f00 140737348574976 
    rdx   0x400544 4195652 
    rsi   0x7fffffffb8cd 140737488337101 
    rdi   0x7ffffffeca20 140737488276000 
    rbp   0x7ffffffeca30 0x7ffffffeca30 
    rsp   0x7ffffffeca10 0x7ffffffeca10 
    r8    0x400660 4195936 
    r9    0x7ffff7de9740 140737351948096 
    r10   0x7ffffffec7a0 140737488275360 
    r11   0x7ffff7b8fec0 140737349484224 
    r12   0x400460 4195424 
    r13   0x7ffffffecb30 140737488276272 
    r14   0x0 0 
    r15   0x0 0 
    rip   0x40057b 0x40057b <foo1+31> 
    eflags   0x206 [ PF IF ] 
    cs    0x33 51 
    ss    0x2b 43 
    ds    0x0 0 
    es    0x0 0 
    fs    0x0 0 
    gs    0x0 0 
    

    을 덮어되지 않습니다? 1500 매개 변수를 더 큰 값으로 변경하려고 시도했지만 아무 것도 변경되지 않았습니다. 나는 또한 작은 값 (50 이하)을 시도했지만 같은 결과를 얻었다.

    나는 또한 레지스터가 덮어 쓰여졌는지 아닌지보기 위해 주소와 다른 무엇인가를 스택에 작성하려고했다. 예를 들어 perl -e 'print "A"x1500 "을 사용하면 rbp 레지스터를 수정할 수만 있었고 립은 수정할 수 없었습니다. 하지만이 사이트의 스레드를 읽으면 gdb에서 이런 일이 발생하고 유효한 주소로 시도 할 수 있습니다. 그래서 나는했다.

    내가 뭘 잘못하고있어? BOF가 요즘 커널에서는 더 이상 가능하지 않을 수도 있습니까? 나는 잊어 버리기 전에

    : 당신은 아마 레지스터보고 알아 낸 것처럼, 나는 64이 0

    마지막으로 설정 한 인쇄 요소 : 나는 또한 함께, 요소 제한을 제거하기 위해 GDB 제한 요소를 제거 우분투 12.04 (커널 버전 3.5.0-39- 일반)와 비트 기계.

    미리 감사드립니다.

  • +0

    에서 당신의 PC의 모습에서 이러한 보호를 해제 할 수 있습니다. 그러나 일반적으로, 나는 이것이 충돌을 야기 할 것이라고 기대하지만, 특권을 얻는 데 "성공"하지는 않을 것입니다. –

    +0

    'BOF()'가 최적화되지 않았다고 확신합니까? 그 주소를 확인하기 위해'printf ("% p \ n", BOF);를 할 수있다. – chux

    +0

    카나리아 사용과 같은 BOF를 방지하는 보안이 있습니다. –

    답변

    1

    기본 버퍼 오버플로를 방지하는 보안이 kernet에 있습니다.

    당신은 버퍼 오버 플로우를

    을의 연습을 damn vulnerable linux을 시도 할 수 있습니다 또는 당신은 당신의 등록이 특정 경우 스택에서 복원되지 않도록 할 수 that

    +0

    나는 ASLR을 우회하기 위해 로컬 변수 주소를 기본 변수로 사용하고 변수 오프셋을 사용하면 어떨까요? 설명해 드리겠습니다 : c 프로그램을 작성한 경우 (예 : expl.c) : 기본 주소 (예 : 부호없는 int addr), 가변 오프셋 (예 : int offset)으로 사용되는 변수를 인스 턴싱하고 인라인 매개 변수로 주소의 반복을 사용하여 프로그램 bof.o를 실행합니다 (예 : execl 사용). 변수 addr에 변수 offset을 더한 값. ASLR을 우회하는 방식으로 가능합니까? 나는 bof.o 프로세스의 스택이 expl.o 스택 근처에 생성되면 ASLR을 우회 할 수 있다고 생각한다. – badnack