Я сделал простую программу для сборки:проектировал Shellcode дает неверные результаты
.text
.globl _start
_start:
mov %20, %rbx
mov %1, %rax
int $0x80
Это, очевидно, работает на 64-битных ОС (Linux). Затем я составил его следующим образом:
as -o ExitShellcode.o ExitShellcode.s
ld -o ExitShellcode ExitShellcode.o
И, наконец, после запуска программы, он выходит со статусом 20
echo $?
20
Использование objdump сваливать шеллкода для файла дает:
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;' копирует только один int. – wildplasser
Вы никогда не назовете шеллкод где-нибудь. – slugonamission
@slugonamission Как мне это сделать? –