2016-06-18 6 views
0

が、私はこの単純なアセンブリプログラムを作っ与えます。次のように私はそれをコンパイル:Desigingシェルコードは、誤った結果

as -o ExitShellcode.o ExitShellcode.s 
ld -o ExitShellcode ExitShellcode.o 

そして最後に、プログラムを実行した後に、それはファイルのシェルコードをダンプするobjdumpの使い方20

echo $? 
20 

のステータスで終了できます:

objdump -d ExitShellcode 

ExitShellcode:  file format elf64-x86-64 


Disassembly of section .text: 

0000000000400078 <_start>: 
400078: 48 c7 c3 14 00 00 00 mov $0x14,%rbx 
40007f: 48 c7 c0 01 00 00 00 mov $0x1,%rax 
400086: cd 80     int $0x80 

しかし、このプログラムにシェルコードを入れた後:

#include <stdio.h> 

char shellcode[] = "\x48\xc7\xc3\x14\x00\x00\x00" 
        "\x48\xc7\xc0\x01\x00\x00\x00" 
        "\xcd\x80"; 

int main() 
{ 
    int *ret; 

    ret = (int *)&ret +2; 

    *ret = (int)shellcode; 

} 

とコンパイル:

gcc -g -o Shellcode Shellcode.c 
Shellcode.c: In function ‘main’: 
Shellcode.c:13:9: warning: cast from pointer to integer of different  size  [-Wpointer-to-int-cast] 
*ret = (int)shellcode; 

やランニング、プログラムが0の状態で終了します。

echo $? 
0 

proplemは何ですか?それは20で出なければならないのですか?

+0

'* ret =(int)shellcode;'は1つのintをコピーします。 – wildplasser

+1

あなたは実際にどこでもシェルコードを呼び出すことは決してありません。 – slugonamission

+0

@slugonamissionどうすればいいですか? –

答えて

2

コードでは、コンパイラがmainのリターンアドレスに対してスタック上の特定の場所に変数retを配置することを間違って想定しています。代わりに、コンパイラはそれが許可されているように別の場所に置くので、コードは何もしません。おそらくあなたはインターネット上で見つけた悪い設計の例に従っています。

あなたはそれにそれを呼び出し、関数とするポインタをキャストしようとすることができshellcode配列内の「シェルコード」を実行する場合:

char shellcode[] = "\x48\xc7\xc3\x14\x00\x00\x00" 
       "\x48\xc7\xc0\x01\x00\x00\x00" 
       "\xcd\x80"; 

int main() 
{ 
    ((void (*)()) shellcode)(); 
} 

しかし、これはおそらくまだどこ.dataセクションので失敗しますshellcodeが実行されていないため、実行時にプログラムがクラッシュする可能性があります。この問題を解決するには、プログラムをリンクするときに-zexecstackオプションを使用します。例:

gcc -zexecstack -g -o Shellcode Shellcode.c 
+0

ありがとうございました。それは働いた!しかし、それはどのように機能するのか説明できますか? –

+0

@DarkEagle関数へのポインタに 'shellcode'をキャストし、その関数を呼び出します。 –

+0

お世話になりました –

関連する問題