MIPS下shellcode编写二

在shellcode中我们常会看到execve系统调用,它常用来运行/bin/sh之类的应用程序。
我们来execve的原型
在这里插入图片描述

execve()用来执行参数filename字符串所代表的文件路径,第二个参数是利用指针数组来传递给执行文件,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。
这里为了方便,直接将后面两个参数置0
简单的看看c程序里execve的使用
代码在exe.c
在这里插入图片描述

编译
在这里插入图片描述

运行
在这里插入图片描述

可以看到execve函数执行了/bin/sh生成了一个shell
用汇编来写同样的功能
在这里插入图片描述

两条sw指令用以将参数列表argv[0]=”/bin/sh”和argv[1]=0存入开辟的指针数组
接下来进行测试
这里直接使用之前我们写的脚本
编译完成后测试
在这里插入图片描述

可以看到是顺利执行了,接下来就是提取shellcode了,用脚本自动化完成
在这里插入图片描述

然后填入框架template.c为exe2.c
在这里插入图片描述

编译
在这里插入图片描述

执行
在这里插入图片描述

说明提取出的shellcode是可用的

回顾下我们编写shellcode的流程:
首先编写c语言版本,主要是学习相关系统调用,然后找到编写shellcode的调用号,接着一步步用汇编来写,然后编译、链接、这一步可以用脚本自动完成。接着从中提取,这一步也可以脚本完成,最后就是将提取出的机器码带入c语言的框架,来测试是否能够正常运行。
和x86下写shellcode一样,同样存在坏字符的问题,比如如果造成缓冲区溢出的漏洞为strcat,strcpy等,这些函数在复制字符串时会遇到null(\x00)就停止复制,此时如果shellcode中间有\x00,则后面的部分都不会被写过去,被复制到缓冲区的shellcode自然没用了。
接下来我们就要学习去除坏字符的方法。
一种常见的办法就是一些等价的指令来替换到汇编shellcode后会生成\x00的指令,比如li $a2,0的机器码为24 06 00 00 出现了坏字符,此时可以用等价的来代替slti a 2 , a2, a2,zero,-1,机器码为28 06 ff ff,这样就消除了坏字符。类似的替换如下所示
在这里插入图片描述在这里插入图片描述

运用上面的规则,我们可以将之前的write.s、exe.s中相关的指令替换掉。这里以exe.s为例,替换相关指令后得到exenew.s
得到如图所示
在这里插入图片描述

编译并提取机器码
在这里插入图片描述

注意到最后三行\x00,起不到任何作用,可以直接删去

“\x2f\x62\x69\x6e”
“\x2f\x73\x68\x00”
是字符串”bin/sh“的机器码,这里也有坏字符,解决办法就是直接用/bin/sh带代替
在往上\x00\x00\x00\x0c,这是syscall的机器码,不过改为\x01\x01\x01\x0c也是可以的
进过上面的分析,修改提取后的机器码放入c语言模板
代码在exenew.c
在这里插入图片描述

接下来编译执行
在这里插入图片描述

可以看到去除坏字符后的shellcode是可用的。

打过CTF pwn题的同学们可能会碰到一些题目,题目会额外限制一些字符的使用,如0x0d(\r),0x0a(\n)或者0x20(空格)等。事实上,实际生活中也会碰到类似的情况,比如为了躲避存在漏洞的软件本身的检测、躲避IDS本身的检测等情况。这时候为了保证我们的shellcode可用,就需要对我们的shellcode进行编码来绕过。
其实这和软件安全的加壳的思想很像。最开始的工作和之前介绍的一样,就是编写可以实现功能的shellcode,然后使用一种编码方式,使得编码之后的shellcode中不再存在坏字符(这里的坏字符包括\x00以及各个情况下需要避免的字符)。然后再写一段解码程序放在最开头的部分。
当程序执行时,shellcode开头的解码程序执行,会将编码后的shellcode解码成原始的shellcode,再开始执行。这样,又能避免坏字符的出现,又能实现功能。
接下来我们将会介绍最简单的一种编码方式,异或。
异或的原理很简单,相同为0,不同为1.
即:0 xor 0 =0,0 xor 1 = 1,1 xor 1=0,1 xor 0=1
以及推论:
a xor b = c,c xor b=a=》a xor b xor b = a
也就是说一个值对同一个数异或2次后得到自身。我们用个原理实现编码、解码。
先看异或的算法实现:
在这里插入图片描述

会逐字节与xor_with异或,将以后的数据返回。
这里的关键是xor_with的值,该值需要满足两个条件:1.值本身不能是坏字符,2,xor_with与shellcode异或得到的异或中不能有坏字符。
为了做到这一点,我们写了一个generate_key函数
在这里插入图片描述

将shellcode中的每个字节与1~255进行测试,如果异或的结果为坏字符或取得的i为坏字符,则做个标记,用以表示该值不能作为xor_with的值来用。
然后遍历整个bad_bytes,根据之前做的标记,找到有效的值,放在good_bytes中。然后随机选择一个作为xor_with的值。
在这里插入图片描述

坏字符可以在main这里的user_bad_byte自定义,将需要改造的shellcode机器码保存到source.bin
这就结束了吗?
别忘了我们之前说过,编码后的shellcode之前需要加上解码用的shellcode
如下所示
在这里插入图片描述

这里的关键是最后5条指令,用于从编码后的shellcode末尾循环取4字节,然后与之前选取的xor_with值异或完成解码操作。
完整的代码在encode.py
我们将之前的之前提取出的write的shellcode的机器码保存为source.bin
运行该脚本
在这里插入图片描述

得到编码后的机器码,将其填入框架
这里需要注意,由于xor_with为随机生成,所以大家操作的时候和我的情况可能会不同,只需把生成的机器码复制到框架里就可以了,完整代码在encode.c
在这里插入图片描述

编译、执行
在这里插入图片描述

成功运行

参考
pwntools官方文档关于mips的shellcode编写的资料https://docs.pwntools.com/en/stable/shellcraft/mips.html
1.exploit-db中典型的mips下的shellcode的实例https://www.exploit-db.com/exploits/18162
3.《揭秘家用路由器0day漏洞挖掘技术》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值