2017-10-06 3 views
0

나는 (I 32 비트 리눅스 머신 사용하고, 참조) 현재 스택 오버 플로우에 대해 쓰고 아래에 다음과 같은 프로그램을 생성하고이 프로그램왜이 프로그램이 segfault를 유발합니까?

gcc stack_buffer_2.c -g -o stack_buffer_2 -fno-stack-protector 

로 컴파일 된

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

int main() { 
    char foo[16]; 
    strcpy(foo, "AAAAAAAAAAAAAAAABBBBC"); 
} 

무엇 이 프로그램은 않습니다

  • 채우기 'A'모든 "foo는"배열은
  • 필의가 문자 내가 GDB andhere에서이 프로그램의 동작을 확인

ESP 저장에 'B'문자

  • 쓰기 'C'문자 (플러스 널 문자)와 aved EBP는 내가 가진 무엇 :

    (gdb) run 
    
    Program received signal SIGSEGV, Segmentation fault. 
    0xb7e30043 in ??() from /lib/i386-linux-gnu/libc.so.6 
    

    이 컨텍스트에서 __libc_start_main의 반환 지점 인 원래 값 0xb7e31637 대신 0xb7e30043 (오버플로 된 값, 0x43 및 널 종료 자)으로 점프하려했습니다.

    여기 나를 위해 까다로운 일이 있습니다. "정보 proc 매핑"을 수행하면 0xb7e30043이 "유효한"메모리 (/lib/i386-linux-gnu/libc.so.6 안에 있음)처럼 보입니다.

    segfaults가 다음에 의해 트리거 될 수 있음을 알고 있습니다. 메모리 "나"또는 매핑되지 않은 세그먼트를 소유하지 않습니다. 하지만이 경우에는 응용 프로그램의 메모리 공간에 libc가 매핑되어 있기 때문에 왜 segfault가 발생합니까?

    오버플로 EIP가 libc 내부의 임의의 명령어를 가리키고 있기 때문에 이것이 어떤 종류의 정렬 불량 때문인 것으로 생각됩니다. 그렇다면 어떻게 조정할 수 있습니까? 그 뒤에있는 제약은 무엇이며 누가 그것을 시행합니까? 커널, MMU?

  • +0

    glibc 심볼을로드하지 않은 한,'0xb7e30043 in ?? '은'glibc' 함수 안에 있지 않다는 것을 의미합니다. EIP 주소에 초점을 맞추는 이유는 무엇입니까? 실행되는 명령에 대해서는 아무 말도하지 않습니다. 세그 폴트 추적에서 너무 많이 생각하지 말고,'main'의'return'에서'stepi' 만하고, 레지스터를보고, 어셈블리 코드를 검사하고 정확히 무슨 일이 일어나는 지 봅니다. 게다가,이 질문은 아마도 StackOverflow (말장난 의도 없음)에 가장 적합합니다 – xhienne

    +0

    _0xb7e30043 in ?? 당신이 glibc 함수 안에 있지 않다는 것을 암시하는 것 같습니다. - 런타임은 내가 glinc 함수 안에 있지 않다는 것을 어떻게 알 수 있습니까? 각 실행 전에 심볼 테이블을 보입니까? –

    +0

    확실하지는 않지만 그 메시지가 해당 주소에 액세스하는 세그 폴트라고 말하지는 않지만 해당 주소에서 코드를 실행하면 세그 폴트가 발생합니다. 그리고 이것은 레지스터 설정없이 임의의 코드를 실행할 때 매우 유용합니다. 또는 실제 opcode에 대한 바이트 오프셋을 가지고 완전히 혼란스러운 결과를 얻는 다른 opcode를 얻습니다. 디스어셈블러를 보았 니? – Philippos

    답변

    0

    0xb7e30043의 명령어가 잘못되었습니다.

    여기서 현재 명령어이다

    0xb7e30043: add %cl,(%eax) 
    

    내가 EAX 값으로보고하고 제로이다. 거기에서 일이 쉬워집니다. 프로세스가 0x0에서 메모리에 액세스하려고 시도했지만 segfault로 실패했습니다.

    관련 문제