如何在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
之后,之后只有垃圾会在作为指令执行时使您的程序崩溃。
我正在学习根据 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
之后,之后只有垃圾会在作为指令执行时使您的程序崩溃。