Как запустить 64-битный шелл-код на 32-битной Linux машине? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть этот шелл-код, который работает только на 64-битной машине:

unsigned char shellcode[] = \
\xeb\x1f\x48\x31\xc0\x5b\x88\x43\x07\x48\x89\x5b\x08\x48\x89\x43\x10\x6a\x3b\x58\x48\x8d\x3b\x48\x8d\x73\x08\x48\x8d\x53\x10\x0f\x05\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x30\x61\x61\x61\x61\x61\x61\x61\x62\x62\x62\x62\x62\x62\x62\x62

Если я запусту его на 32-битной машине, он, конечно, получит ошибку сегмента. Как мне сделать его совместимым для 64-битной машины?

К вашему сведению, вот код C для запуска вышеуказанного шеллкода (он отлично работает на 64-битной машине):

main()
{


    int (*ret)() = (int(*)())shellcode;

    ret();

}

1 Ответ

0 голосов
/ 11 апреля 2020

Если вы работаете на 32-битной машине, вы можете использовать qemu для эмуляции 64-битного двоичного файла:

% qemu-x86_64 ./shell64
warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5]
$

Если вы получаете Segmentation fault, не забудьте скомпилировать с флагом -fno-stack-protector и -m64 флаг для создания 64-битного двоичного файла

% cat shell64.c
#include <stdio.h>

unsigned char shellcode[] = "\xeb\x1f\x48\x31\xc0\x5b\x88\x43\x07\x48\x89\x5b\x08\x48\x89\x43\x10\x6a\x3b\x58\x48\x8d\x3b\x48\x8d\x73\x08\x48\x8d\x53\x10\x0f\x05\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x30\x61\x61\x61\x61\x61\x61\x61\x62\x62\x62\x62\x62\x62\x62\x62";

int main() {
   int (*ret)() = (int(*)())shellcode;
   ret();
}

Как скомпилировать:

% gcc-4.6 -o shell64 shell64.c -m64 -fno-stack-protector
% qemu-x86_64 ./shell64
warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5]
$
...