が、私はこの単純なアセンブリプログラムを作っ与えます。次のように私はそれをコンパイル: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で出なければならないのですか?
'* ret =(int)shellcode;'は1つのintをコピーします。 – wildplasser
あなたは実際にどこでもシェルコードを呼び出すことは決してありません。 – slugonamission
@slugonamissionどうすればいいですか? –