【Linux安全】Shellcoding

news/2025/1/9 12:30:09/文章来源:https://www.cnblogs.com/o-O-oO/p/18522695

原创 haidragon 安全狗的自我修养

“面向安全专业人员的 Linux Shellcoding”

今天我们将学习 Linux Shellcoding 并学习实践知识。

shell代码

编写 shellcode 是了解有关汇编语言以及程序如何与操作系统交互的更多信息的好方法。

为什么红队成员和渗透测试人员编写 shellcode?因为在实际情况下,shellcode 可以注入到正在运行的程序中,使其执行一些它本来没有设计的作用,例如缓冲区溢出攻击。

因此,shellcode 通常用作漏洞利用中的 “payload”。

为什么叫 “shellcode”?从历史上看,shellcode 是机器代码,执行时会打开 shell。

Shellcode 在渗透测试和红队中发挥着至关重要的作用,原因如下:

了解低级操作:编写 shellcode 需要深入了解汇编语言以及程序如何在低级与操作系统交互。漏洞利用的有效载荷 : Shellcode 通常用作漏洞利用中的有效负载。当缓冲区溢出等漏洞被利用时,shellcode 可以注入到正在运行的进程中以执行任意命令。规避和混淆:制作有效的 shellcode 涉及逃避防病毒和入侵检测系统检测的技术。高级后开发:除了简单地生成 shell 之外,现代 shellcode 还可以设计为执行复杂的开发后任务。多功能性:现代 shellcode 不仅限于生成 shell。它可以被设计成执行广泛的操作,例如下载额外的恶意软件、创建后门。

Shellcode 测试

在测试 shellcode 时,只需将其插入到程序中并执行它就很方便了。

以下 C 程序 (run.c) 将用于测试我们的所有代码:

强烈建议对 C 和 Assembly 有深入的理解。此外,了解堆栈的运行方式也是一个显著的优势。

【linux安全】禁用 ASLR

集会

让我们再次回顾一些更多的介绍性信息。

x86 Intel 寄存器集。

EAX、EBX、ECX 和 EDX 都是 32 位通用寄存器。

AH、BH、CH 和 DH 访问这些通用寄存器的高 16 位,而 AL、BL、CL 和 DL 访问低 8 位。

EAX、AX、AH 和 AL 被称为“累加器”寄存器,可用于 I/O 端口访问、算术运算、中断调用等。这些 registers 对于实现 system 调用也很有用。

EBX、BX、BH 和 BL 被称为 “Base” 寄存器,用作内存访问的 base 指针。此 register 通常用于存储 system call 参数的指针,有时用于存储中断的返回值。

ECX、CX、CH 和 CL 称为 “Counter” 寄存器。

EDX、DX、DH 和 DL 被称为“数据”寄存器,可用于 I/O 端口访问、算术运算和某些中断调用。

组装说明。在汇编编程中,有一些指令很重要:

mov eax, 32 ; assign: eax = 32
xor eax, eax ; exclusive OR
push eax ; push something onto the stack
pop ebx ; pop something from the stack
; (what was on the stack in a register/variable)
call mysuperfunc ; call a function
int 0x80 ; interrupt, kernel command

Linux 系统调用充当桥接用户空间和内核空间的 API。要在汇编程序中使用 Linux 系统调用,请执行以下步骤:

  1. 将系统调用号加载到 EAX 寄存器中。
  2. 根据需要将 system call 的参数放入 EBX、ECX 和其他 registers。
  3. 调用适当的中断 (80h)。
  4. 结果通常在 EAX 寄存器中返回。

可以在 '/usr/include/asm/unistd_32.h' 中找到 x86 系统调用的完整列表。

libc 如何包装 syscall 的示例:

让我们编译和反汇编:

gcc -masm=intel -static -m32 -o exit0 exit0.c
gdb -q ./exit0

0xfc = exit_group() 0x1 = exit()

空字节数

我们来研究一下简单的程序:

编译并运行:

gcc -m32 -w -o woow woow.c
./woow

当为针对 C 代码的漏洞提供 shellcode 时,必须避免使用空字节 (\x00),因为它们会终止指令链。这一点至关重要,因为 shellcode 通常包含在以 NUL 结尾的字符串中。如果 shellcode 包含 null 字节,则被利用的 C 代码可能会忽略并丢弃从第一个 null 字节开始的任何后续代码。

这个挑战特别与机器代码有关。例如,要调用数字为 0xb 的系统调用,您需要将 EAX 寄存器设置为 0xb,而不使用包含空字节的计算机代码。
避免在 shellcode 中使用空字节 (\x00) 以利用 C 代码,因为它们会过早终止代码,导致其余代码被忽略。

让我们去编译并运行两个等效的代码。

第一个 exit1.asm

编译并调查 exit1.asm:

nasm -f elf32 -o exit1.o exit1.asm
ld -m elf_i386 -o exit1 exit1.o
./exit1
objdump -M intel -d exit1

正如你所看到的,我们在机器代码中的字节为零。

下一个 exit2.asm:

编译并调查 exit2.asm:

nasm -f elf32 -o exit2.o exit2.asm
ld -m elf_i386 -o exit2 exit2.o
./exit2
objdump -M intel -d exit2

如您所见,其中没有嵌入的零字节。

计算机 CPU 中的 EAX 寄存器可以分成更小的部分:AX、AH 和 AL。AX 是 EAX 的下半部分,AL 是下半部分,AH 是下半部分的上四分之一。

这在编写 shellcode (小型、特殊用途的代码) 时很重要,因为我们需要避免 “null bytes” (0x00),这可能会弄乱代码。

使用寄存器的较小部分可以帮助我们做到这一点。例如,使用 'mov al, 0x1' 只会更改 EAX 的一小部分,并避免创建 null 字节,这与 'mov eax, 0x1' 不同,它可能会在我们的代码中创建不需要的 null 字节。

EAX 是一个 32 位寄存器。AX 是 EAX 的低 16 位。AL 是 AX 的低 8 位(这意味着它也是 EAX 的一部分)。AH 是 AX 的高 8 位。

这两个程序在功能上是等效的。

正常退出

让我们从最简单的示例开始。让我们使用 exit.asm 代码作为 shellcoding 的第一个示例 (example1.asm):

提取字节码:

nasm -f elf32 -o example1.o example1.asm
ld -m elf_i386 -o example1 example1.o
objdump -M intel -d example1

这是十六进制的样子。

所以,我们需要的字节是 31 c0 b0 01 cd 80。将顶部的代码 (run.c) 替换为:

现在,编译并运行:

gcc -z execstack -m32 -o run run.c
./run
echo $?

-z execstack 关闭 NX 保护以使堆栈可执行

我们的程序返回 0 而不是 1,因此我们的 shellcode 可以正常工作。

生成 linux shell

让我们编写一个简单的 shellcode 来生成一个 shell (example2.asm):

要编译它,请使用以下命令:

nasm -f elf32 -o example2.o example2.asm
ld -m elf_i386 -o example2 example2.o
./example2


使用将是一种简单的方法,但它有一个缺点:会丢弃用户的权限。system("/bin/sh")system

相反,我们可以使用 ,它稍微复杂一些,但没有这个问题。需要三条信息:execve execve

要运行的程序(进入 EBX 寄存器),程序的参数(这进入 ECX 寄存器,如果没有参数,则可以是),null环境变量(这进入 EDX 寄存器,如果不需要,也可以进入)。null

在示例代码 (example3.asm) 中,我们避免了 null 字节,并使用堆栈直接保存这些值。

现在,让我们组装它并检查它是否正常工作并且不包含任何 null 字节:

nasm -f elf32 -o example3.o example3.asm
ld -m elf_i386 -o example3 example3.o
./example3
objdump -M intel -d example3

然后,通过一些 bash hacking 和 objdump 提取字节码:

objdump -d ./example3|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g'

所以,我们的 shellcode 是:

然后,将顶部的代码 (run.c) 替换为:

编译并运行:

gcc -z execstack -m32 -o run run.c
./run

结论:

在恶意软件开发中,shellcoding 是指创建小型汇编程序来执行诸如打开命令 shell 之类的任务。这需要知道如何编写和管理直接与操作系统交互的代码,同时避免可能破坏代码的 null 字节等问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/825960.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[极客大挑战 2019]Http

题目链接:https://buuoj.cn/challenges#[极客大挑战 2019]Http。 访问环境如下。该页面的响应包如下。 HTTP/1.1 200 OK Date: Wed, 23 Oct 2024 16:21:45 GMT Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.3.3 Content-Length: 4065 Connection: close Content-Type:…

Matlab 2024下载与安装(包含授权激活)

1、安装包Matlab 2024 B: 链接:https://pan.quark.cn/s/f56eda425e79 提取码:daQZ Matlab 2023B: 链接:https://pan.quark.cn/s/6b597a439f49 提取码:c3XR Matlab R2022 a: 链接:https://pan.quark.cn/s/4a8cf5260d20 提取码:QyKG 2、安装教程 1) 解压压缩包文件…

[极客大挑战 2019]Upload

题目链接:https://buuoj.cn/challenges#[极客大挑战 2019]Upload。 打开环境,如下所示。通过页面源代码可以发现,该网站系 PHP 架构,因此尝试直接上传一句话木马。发现提示 "NOT!php!",因此尝试 fuzzing 一下后缀名。发现网站可以通过了 "phtml" 的后…

[SUCTF 2019]EasySQL

题目链接:https://buuoj.cn/challenges#[SUCTF 2019]EasySQL 打开环境后,如下所示。尝试输入字符:1。尝试输入字符:0 后,发现没有输出结果。尝试输入字符串 "aaa"、"bbb" 等后,发现都跟输入 0 的结果一致,而输入 123、456 等非 0 的内容,都与输入 …

[极客大挑战 2019]LoveSQL

题目链接:https://buuoj.cn/challenges#[极客大挑战 2019]LoveSQL。 打开环境后,如下所示。尝试 SQL 注入(万能密码)。 Payload:admin+or+1%3d1%3b%23。(笔者通过简单粗暴的尝试:①没有使用单引号;②使用单引号;③使用双引号,来确定后端拼接的 SQL 语句中的 password…

2024软工现场编程实践

作业所属课程 https://edu.cnblogs.com/campus/fzu/SE2024作业要求 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13302作业的目标 在三个小时内编写出一个个人记账本,用户可以对自己平时的收入和支出情况进行简单的记录,查看和统计团队名称 “研途无忧”团队成员学号…

2024软工实践

作业所属课程 https://edu.cnblogs.com/campus/fzu/SE2024作业要求 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13302作业的目标 在三个小时内编写出一个个人记账本,用户可以对自己平时的收入和支出情况进行简单的记录,查看和统计团队名称 “研途无忧”团队成员学号…

Winform在主窗体里切换多个窗体

1.点击解决方案资源管理器的项目名称,右键添加用户控件(Windows窗体)。2.在主窗体代码中实例化添加的用户控件(Windows窗体)。3.在主窗体界面中添加pane控件,该控件的大小就是要切换的界面大小,然后在主窗体代码中将实例化的用户控件(Windows窗体)添加到pane控件的集合…

目前遇到过的编码

Base家族 base16 由大写字母(A-Z)和数字(0-9)组成,通常不需要“=”填充 base32 由(A-Z、2-7)32个可见字符构成,“=”符号用作后缀填充 例:NZXV64DBONZXO33SMQ====== KVEEQRSCI5DVKVSXKZEUQS2FJBKE2WKKGI2EKNCWJFCUQNSKIVAVINBTKVKE2TZUKVHUWRZWGRIVSVSNJZJFIQKNIZLDIN…

NOI LINUX 系统终端常用操作

打开终端 我们可以右键空白处 - 在终端中打开(Open in Terminal)/Ctrl+Alt+T 快捷键打开终端。 考试时编译、运行、调试、对拍、测大样例等行为的操作 对于一个 C++ 可执行文件 1.cpp 为例:编译: g++ 1.cpp -o qwq,其中 1.cpp 可替换为任意 C++ 可执行文件,qwq 表示已编译…

[BUUCTF]disk

[BUUCTF]disk[BUUCTF]disk 分析 VMDK:(VMWare Virtual Machine Disk Format)是虚拟机VMware创建的虚拟硬盘格式,文件存在于VMware文件系统中,被称为VMFS(虚拟机文件系统) 解题 凡是先打开010获得ctf{unseCure_quick_form4t_vo1umer 查找另外一半 用7Z打开该vmdk文件,发…

云南5日游

1 总览🦋云南景点合集 💛昆明:石林景区、昆明老街、滇池、斗南花市 💜大理:大理古城、洱海、苍山、喜洲古镇、南诏风情岛、双廊古镇、崇圣寺三塔 💙丽江: 玉龙雪山、蓝月谷、云杉坪、束河古镇、丽江古城、泸沽湖、 💚香格里拉:普达措公园、虎跳峡、独克宗古城、梅…