2011-10-16 5 views
0

나는 교수의 지시에 따라 FedoraCore6를 실행 중입니다. 나는 실험실 지침에 의해 제공되는이 쉘 코드를 실행하려고 시도하고 있으며 분할 결함을 계속해서 얻고 있습니다. 우리는 명령을 사용하여 스택이 해제 된 gaurd로 컴파일 할 수 있다고 들었습니다. gcc-fno-stack-protector call_shellcode.c 어느 쪽이든 나는 단지 gcc -o 쉘 call_callshellcode.c를 사용하여 코드를 컴파일하거나 -fno-stack-protector 명령을 사용합니다. 코드가 시작될 때 세그먼트 화 오류가 발생합니다. 도움이 필요하십니까? 다음과 같이 가 그래서 난이 랩에 대한 코드와 함께 제공하고있다 : 모든학교 실용 분할 오류 쉘 코드 버퍼 오버 플로우

#include <stdlib.h> 
#include <stdio.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 buf[sizeof(code)]; 
    strcpy(buf, code); 
    ((void(*) ())buf)(); 
} 
+0

32 비트 또는 64 비트를 실행하고 있습니까? 새 커널 같은 기본 설치를 변경 했습니까? – Dmitri

+0

32 비트. 기본 설치에는 큰 변경이 없습니다. 필자는 그것에 대해 zsh를 추가했다. – YoungGuy

답변

3
  • 첫째, 당신은 어디에 프로그램 세그먼테이션 폴트 (segfault)를 식별해야합니다. 이를 수행하는 방법 중 하나는 dmesg| tail입니다. 이 출력의 마지막 행은 SEGFAULT가 발생할 때 명령 포인터가 있던 위치를 나타냅니다.
  • 다른 방법은 -ggdb 플래그가 설정된 프로그램을 컴파일하는 것입니다.
  • 쉘에 ulimit -c unlimited을 실행하여 프로그램이 SEGFAULT 일 때 코어 덤프가 생성되도록하십시오.
  • 코드를 변경하지 않고 프로그램을 실행하면 Segmentation Fault (core dumped)이됩니다. 로컬 디렉토리에 core이라는 새 파일이 표시됩니다.
  • gdb -c core을 실행하여 코어 덤프를 분석하십시오.
  • gdb 안에 들어가면 정확히 SEGFAULT가 발생한 위치를 확인하려면 bt 또는 backtrace을 입력하십시오.
  • 보유하고있는 값을 분석하기 위해 info registers, info locals, info args과 같은 명령을 사용할 수도 있습니다. x/x $esp (또는 다른 레지스터 이름)을 사용하여 개별 레지스터의 내용을 확인하십시오.

    행운을 빌어 요!