如何在64位Linux系统上执行32位shellcode?

How to execute 32-bit shellcode on a 64-bit Linux system?

我正在学习根据 Gray Hat Hacking 教科书中的示例构建自己的 shell 代码。他们给出了在 32 位 Linux 系统上执行 shell 代码的示例,但是当我使用适当的标志将它们组装到我的系统中时(也许我在这部分可能是错误的)我没有得到预期的结果结果。

我的 shell 代码可执行文件的名称是 sc2

section .text
global _start

_start:
xor eax, eax
mov al, 0x46
xor ebx, ebx
xor ecx, ecx
int 0x80

xor eax, eax
push eax
push 0x68732f2f
push 0x6e692f2f
mov ebx, esp
push eax
push ebx
mov ecx, esp
xor edx, edx
mov al, 0xb
int 0x80
# nasm -f elf sc2.asm -o sc2.o
# ld -m elf_i386 sc2.o -o sc2
# ./sc2
segmentation fault
# objdump -M intel -d ./sc2
./sc2:     file format elf32-i386
Disassembly of section .text:
08049000 <_start>:
 8049000:   31 c0                   xor    eax,eax
 8049002:   b0 46                   mov    al,0x46
 8049004:   31 db                   xor    ebx,ebx
 8049006:   31 c9                   xor    ecx,ecx
 8049008:   cd 80                   int    0x80
 804900a:   31 c0                   xor    eax,eax
 804900c:   50                      push   eax
 804900d:   68 2f 2f 73 68          push   0x68732f2f
 8049012:   68 2f 2f 69 6e          push   0x6e692f2f
 8049017:   89 e3                   mov    ebx,esp
 8049019:   50                      push   eax
 804901a:   53                      push   ebx
 804901b:   89 e1                   mov    ecx,esp
 804901d:   31 d2                   xor    edx,edx
 804901f:   b0 0b                   mov    al,0xb
 8049021:   cd 80                   int    0x80
# gdb -q ./sc2
Reading symbols from ./sc2...
(No debugging symbols found in ./sc2)
(gdb) r
Starting program: sc2 
Program received signal SIGSEGV, Segmentation fault.
0x08049023 in ?? ()

据我所知,我相信代码已执行,但给出了段错误但没有给出 shell。我错过了什么?

(我的系统详细信息:我的是 64 位 Kali Linux)

您的即时推送指令有错字,您实际要执行的命令是//in//sh。由于不存在这样的文件,execve 系统调用失败,这意味着它 returns。因此,您的程序继续执行最后一个 int 0x80 之后,之后只有垃圾会在作为指令执行时使您的程序崩溃。