一、题目

shellcode广泛用于许多涉及代码注入的攻击中。编写shellcode是相当有挑战性的。虽然我们可以很容易地从互联网上找到现有的shellcode,但是能够从头开始编写我们自己的shellcode总是令人兴奋的。shellcode中涉及到几种有趣的技术。本实验室的目的是帮助学生理解这些技术,以便他们能够编写自己的shellcode。

编写shellcode有几个挑战,一个是确保二进制文件中没有0x00,另一个是找出命令中使用的数据的地址。第一个挑战不是很难解决,有几种方法可以解决它。第二个挑战的解决方案导致了编写外壳代码的两种典型方法。在一种方法中,数据在执行期间被推入堆栈,因此可以从堆栈指针获得它们的地址。在第二种方法中,数据存储在代码区域中,就在调用指令之后,因此在调用调用函数时,其地址被推入堆栈(作为返回地址)。两种解决方案都非常优雅,我们希望学生能够学习这两种技术。

二、过程

一、Task 1
(一)task 1.a
1.使用nasm编译上面的汇编代码(mysh.s),这是一个针对Intelx86和x64架构的汇编器和解汇编器。一旦我们得到了对象代码mysh.o,如果我们想生成可执行的二进制文件,我们可以运行链接器程序ld,这是编译的最后一步。-melfi386选项意味着生成32位ELF二进制文件。在此步骤之后,我们将得到最终的可执行代码mysh。如果我们运行它,我们可以得到一个外壳。在运行mysh之前和之后,我们使用echo$$打印出当前外壳的进程id,所以我们可以清楚地看到mysh确实启动了一个新的外壳。

2.在攻击期间,我们只需要壳码的机器代码,而不是一个独立的可执行文件,它包含除实际机器代码以外的数据。在技术上,只有机器代码被称为壳码。因此,我们需要从可执行文件或对象文件中提取机器代码。我们使用-Mintel选项在Intel模式下生成组装代码。

3.使用xxd命令打印出二进制文件的内容,能够从打印输出中找到壳码的机器代码。

4.使用外壳代码来攻击代码。复制从xxd命令得到的任何东西并粘贴到代码中。

5.运行convert.py文件,得到结果如下。打印出可以在攻击代码中包含的以下Python代码。它将外壳代码存储在一个Python数组中。



(二)task 1.b
此任务,不允许向字符串添加任何冗余/,即该命令的长度必须为9字节(/bin/bash)。还需要显示代码中没有零。把h###先左移三位,再右移三位。修改如下,得到结果如下:

(三)task 1.c
1.修改mysh.s文件,argv数组应该有四个元素:argv[3] = 0 ;argv[2] = “ls -la” ;argv[1] = “-c” ;argv[0] = “/bin/sh”。所有这些元素都需要在堆栈上构造。运行以下命令,该命令使用/bin/sh来执行“ls-la”命令。


二、Task 2: Using Code Segment
1.修改mysh2.s,得到结果


三、Task 3: Writing 64-bit Shellcode

更多推荐

网络攻防技术——shellcode编写