网络攻防-Shellcode编写

一、题目

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

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

二、实验过程记录

task1.a

1.编译mysh.s程序,使用一下两条命令编译文件成为可执行文件mysh。

2.使用指令 echo $$ 获取shell的编号。在原本的命令行中执行和在我们生成的命令行中执行可以发现两个编号并不相同,可以说明我们已经成功建立了一个新的shell。

3.对编译生成的可执行文件进行反汇编获得机器码。

4.使用后xxd指令直接查看机器码。

5.将机器码复制到可以生成shellcode的代码convert.py中。

6.执行convert.py代码,生成我们想要的shellcode命令。

task1.b

1.因为不能出现重复的/,并且最后的/sh只有三位,所以使用#填充最后一位,将”/sh#”赋值给eax(小端存储),再通过将eax先左移8位,再右移8位,由此避免机器码中直接出现0x00;注意,因为这里修改了eax的值,所以之后用到eax时要注意是否已经将eax清零。

2.执行代码后与task1.a使用同样的方法检查,可以看到也成功建立了一个新的shell。

3.查看机器码,检查是否出现00。结果如下,机器码中并未出现00。

task1.c

1.在task1.b的基础上修改代码,将实验手册提供的命令“/bin/sh -c “ls -la””逐个压入栈中;注意“-c”字符串中不能有空格,只能够通过左右移来加入空格;

2.执行代码以后可以看到我们压入的指令成功执行:

3.与直接在命令行输入指令得到的结果进行比较,得到的结果相同。

4.检查机器码后,机器码并没有出现00,验证正确。

task2:

1.代码解释:db定义的字符串中需要使用0x00替代*,使用指令的地址替换AAAABBBB等占位符。并且在one中的pop出的ebx指的是输入的字符串的地址。

2.修改代码。对字符串进行整理之后,得到的指令是 “/usr/bin/env - a=11 b=22”。

结果展示,可以成功输出环境变量:

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值