博客
关于我
ARM exploit编写二
阅读量:741 次
发布时间:2019-03-21

本文共 2507 字,大约阅读时间需要 8 分钟。

学习如何编写实现bind shell和reverse shell的shellcode是一项复杂但极具挑战性的任务,涉及到深入的操作系统知识以及汇编语言的编写。以下是通过实际操作和对技术细节的深入分析,逐步阐述实现bind shell和reverse shell的解法。

1. 理解bind shell和reverse shell的工作原理

Bind Shell:

  • 目标:在目标机器上打开一个通信端口或监听器。
  • 过程
  • 创建新的TCP socket。
  • 将socket绑定到本地某个端口。3.监听到来的连接。4.接收连接,并将输入输出错误重定向到客户端新连接的socket中。5.利用shell执行命令。

Reverse Shell:

  • 目标:让目标机器回连到攻击者机器,通常通过开放一个监听端口接收远端连接。
  • 优点:不受防火墙的严格限制,因为空间较小且传入连接通常被允许。

2. 收集和分解系统调用的参数

  • socket(2, 1, 0):创建socket。参数依次为file_type(2=socket), protocol(1=IPv4), flags(0=STREAM)。
  • bind(3, 16, 0):将socket绑定到指定的IP和端口。注意IP地址不能有空字节,通常使用0.0.0.0以避免IP地址受限。
  • listen(2048, 128):设置socket监听的 backlog数和正在等待接受的连接数。
  • accept(.,.,.):接收连接,并返回新的连接socket和客户端地址。

3. 在汇编代码中实现bind shell的各个阶段

Thumb 模式编码

  • 原因:在Thumb模式下,指令更短,减少了空字节的可能性。
  • 实现:通过设置PC寄存器的最低有效位为1,然后使用BX指令切换到Thumb模式。

socket和bind调用的实现

socket调用:
  • 汇编代码示例
    .THUMBmov r0, #2mov r1, #1sub r2, r2, r2mov r7, #200add r7, #1add r7, #2svc ; 200不是281发生混淆?
bind调用:
  • 使用文字池存储地址和端口,通过ADR指令和STRB指令实现动态写入,避免空字节。

listen和accept调用的实现

  • 使用保存的socket将其设置为监听状态,然后接受连接。
accept调用的实现:
  • 将host_sockid保存到寄存器,同时将地址信息弄碎,以避免空字节。

4. 处理输入输出重定向和派生shell

  • 使用dup2系统调用重定向输入输出流到客户端连接。
  • 使用execve执行/bin/sh,需要将字符串编写到内存中。

注意事项:

  • 避免使用空字节:通过相互抵消或在汇编中避免。
  • 使用Thumb模式降低指令长度。
  • 文字池存放常量,使用ADR和STRB指令动态地处理。

5. 实际编码示例

;这是一个简化的bind shell汇编代码.NeatHexFormat TWOTABS│亭字节顺序的表格       0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       1: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       ...        2: 02 FF 0A 01 5C 01 01 00 01 01 00 01 01 00       3: ............ .........       4: ............ .........       ...受支持的指令在两个字节的跨度内会有特殊的行为。; 在代码入口处进行初始化_start:.ARMadd r3, pc, #1bx r3;切换到Thumb模式; socket调用mov r0, #2; r0 = AF_INETmov r1, #1; r1 = SOCK_STREAMsub r2, r2, r2; r2 = 0mov r7, #281; 281是socket的系统调用号add r7, #81; r7 = 281 + 81 = 362 ?; loudness; 绑定socket到本地地址和端口adr r1, struct_addrstrb r2, [r1, #1]; 写入AF_INT 0xff,变成null byte; 替换1.1.1.1 IP地址到0.0.0.0strb r2, [r1, #4]; 替换端口号4444到0mov r2, #16add r7, #1; r7 = 281 + 1 = 282svcmov r4, r0 ;保存host_sockid;监听阶段mov r0, r4mov r1, #2add r7, #2; r7 = 282 + 2 = 284svc; 接受连接mov r0, r4sub r1, r1, r1sub r2, r2, r2add r7, #1svcmov r4, r0; 处理输入输出重定向dup2 client_sockid, 0; ...dup2 client_sockid, 1dup2 client_sockid, 2;派生shell溢出 r2, [r0, #0]mov r7, #11svc

6. 测试和验证

  • 生成可执行文件并测试,如objcopy -o .text -O binary bind_shell.bin
  • 在另一终端输入nc localhost 4444连接测试-输入命令如whoami查看是否成功

7. 注意事项

  • 保险避免空字节:通过让寄存器相互抵消。
  • 使用可选段和文字池存储常数,使用溢出命令动态处理为空字节。
  • 编写代码时,代码段必须是可写的。

编写有效的bind和reverse shell shellcode不仅需要深入了解系统调用的工作原理,还需要对汇编语言有深入的掌握,同时需要对内存管理和缓冲区操作有深入的了解。在实际操作中,还需要测试每一步是否正确,以确保最终的shellcode能够成功绕过目标机器的安全措施,实现远程控制。

转载地址:http://oiegz.baihongyu.com/

你可能感兴趣的文章
MySQL-【4】基本操作
查看>>
Mysql-丢失更新
查看>>
Mysql-事务阻塞
查看>>
Mysql-存储引擎
查看>>
mysql-开启慢查询&所有操作记录日志
查看>>
MySQL-数据目录
查看>>
MySQL-数据页的结构
查看>>
MySQL-架构篇
查看>>
MySQL-索引的分类(聚簇索引、二级索引、联合索引)
查看>>
Mysql-触发器及创建触发器失败原因
查看>>
MySQL-连接
查看>>
mysql-递归查询(二)
查看>>
MySQL5.1安装
查看>>
mysql5.5和5.6版本间的坑
查看>>
mysql5.5最简安装教程
查看>>
mysql5.6 TIME,DATETIME,TIMESTAMP
查看>>
mysql5.6.21重置数据库的root密码
查看>>
Mysql5.6主从复制-基于binlog
查看>>
MySQL5.6忘记root密码(win平台)
查看>>
MySQL5.6的Linux安装shell脚本之二进制安装(一)
查看>>