2017-11-06 17 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システム(ubuntu)を実行しています

+0

x86-64では、システムコールを実行するときに、命令は「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 *ファイル名、するchar * constとして、 のchar * constのenvpを[]);

  • CONSTチャー*ファイル名 - > RSI
  • するchar * CONST envpを[] - - > RDX例えば

[] ARGV> RDI

  • するchar * 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は末尾のヌルバイトを持たないため、strcpy()を使用してコピーすることはできません。 memcpy()を使用してください。コメントで述べたように

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

    は、あなたが持っているシェルコードは、32ビットLinux用ですが、64ビットシステム上でそれを実行しようとしています。おそらくそれを修正した後のエラーを説明します。

    +0

    まだセグメンテーションエラーが発生しています –

    +0

    エラーが発生しているのは、どのラインですか? – Barmar

    +0

    私はgdbを使用し、0x00007fffffffe1d8を得ましたか? () –