frida内存检索svc指令查找sendto和recvfrom进行hook抓包

一颗小胡椒2021-12-26 16:14:28

利用wirkeshake抓包初步分析

配置本地PC的ip为192.168.5.150并在上面运行server,然后在pixel手机上安装client_连接192.168.5.150服务器.apk,手机ip为192.168.5.221,在PC上通过wireshake进行抓包。如下所示,看到No.14是手机发给server的HTTP GET包,No.17为server发给手机的HTTP报文。

追踪http流,可以看到server返回给手机一个字符串“hello world"。

常规抓包方案

根据上面分析,apk使用的http通信,采用tcp协议。

2.1 尝试Java层使用tcp通信的常规hook点,如下所示。

java.net.SocketInputStream. socketRead0

java.net.SocketOutputStream. socketWrite0

2.2尝试JNI层使用tcp通信的常规hook点。

apk直接调用libc.so中接口实现收发包,一般tcp是使用send和recv函数,而udp使用sendto和recvfrom函数。查看libc源码,send最终还是调用的sendto,而sendto通过系统调用实现。recv原理与send一致,所以我们直接hook住libc.so的recvfrom和sendto正常是可以拿到tcp和udp的包。

经过实验分析,上面两种方法都没有能抓到包,那么剩下的可能就是so中通过系统调用实现了sendto和recvfrom函数,下面对此猜想进行分析验证。

进一步分析

3.1 先利用frida_fart对apk进行脱壳,脱壳后看到onCreate函数native化了,加载了一个libnative-lib.so,还有一个jni函数stringFromJNI。

3.2 解压apk取出libnative-lib.so,利用IDA分析,但是打不开报如下错误。

利用readelf查看,section段查看结果如下,也是不正常的。我利用010Editor打开这个so进行ELF解析,也会报错。

3.3 使用frida去dump出运行时的so,核心代码如下。

将这个so拉入IDA进行分析,这次不会报错了,使用ctrl+F5反编译,查看到so中使用系统调用实现了sendto和recvfrom,如下所示。

查看sub_2BD8的汇编代码,看到svc 0指令对应的机器码是“00 00 00 EF"。

因为上面分析的so是加壳的so,所以我们无法确定svc指令的真实地址,所以需要从内存中根据机器码找到svc指令,然后通过hook住svc指令,去dump收发包数据。

frida脚本实现

4.1 寻找hook时机,一般加壳so的解码在init或者init_array中实现,它们在so加载过程中会进行调用,所以选择java层加载so完毕后进行hook,代码如下。

4.2 根据libnative-lib.so模块的基地址和偏移,从内存中匹配svc 0的机器码,并反汇编出附近的指令进行匹配,如果找到了svc 0,则对其地址进行hook。

4.3 hook住svc 0后打印收发包的data部分。

首先查看sendto和recvfrom的机器码分别是290和292, 如下所示。

查看sendto原型如下,在它执行前打印出r0即fd,r1即buffer,r2即buffersize。在它执行后打印r0即sendto的返回值也就是真正发送出去的包的长度。recvfrom原理与之一致。

下面在sendto和recvfrom执行完毕后,打印出收发包的data部分以及调用栈。

4.4 运行frida脚本,同时支持dump出so和抓包,并打印出了调用栈。

如下是发包数据,可以看到apk做了一次HTTP GET的操作。

如下是收包数据,可以看到收到的真实数据为“helloworld"。

综上,frida抓包结果与wireshake抓包结果是一致的,同时也是可以利用frida dump出的运行中的so以及调用栈,分析so中收发包函数的流程。

recvfromsendto
本作品采用《CC 协议》,转载必须注明作者和本文链接
利用wirkeshake抓包初步分析配置本地PC的ip为192.168.5.150并在上面运行server,然后在pixel手机上安装client_连接192.168.5.150服务器.apk,手机ip为192.168.5.221,在PC上通过wireshake进行抓包。如下所示,看到No.14是手机发给server的HTTP GET包,No.17为server发给手机的HTTP报文。
组播通信介绍直白的讲,组播就是为同一个网段下两个或多个设备提供信息交换的渠道。这个渠道被称作组播组,本质上是一个IP。我们发现这其中涉及了两个协议——设备加入组播组所使用的协议,以及设备往组播端口发送信息的协议。笔者测试的设备所用的组播协议为IGMPV3,而设备和端口通信用的是UDP协议。具体的端口号的问题,后面会进行分析。这里就要先细说一下sendto函数了:sendto;
目标:请编写frida脚本,完成对该app通信的抓包
0x01 前言最近 UPnP 比较火,恰好手里有一台 Cisco RV110W,在 2021 年 8 月份思科官方公布了一个 Cisco RV 系列关于 UPnP 的 0day,但是具体的细节并没有公布出来。
Seccomp BPF与容器安全
2022-07-17 10:07:03
本文详细介绍了关于seccomp的相关概念,包括seccomp的发展历史、Seccomp BPF的实现原理以及与seccomp相关的一些工具等。此外,通过实例验证了如何使用seccomp bpf 来保护Docker的安全。
概述最近 fodcha 僵尸网络泛滥。fodcha 是最近新发现的快速传播型 DDos 僵尸网络,由于使用 chacha 算法加密网络流量,360 将其命名为 Fodcha[2]。该恶意软件支持多种架构,包括 x86,arm,mips 等。
前言本来是打算来挖它的,去搜索它以往爆出的漏洞,就先复现玩玩了,这次用了三种方法来验证,分别为用户级模拟,系统级模拟,
接下来,我们通过wireshark来查找pcap文件中的丢包线索。结论1、1句忠告:不能通过判断数据包是否已被接收端收到来判断pcap中是否丢包。
大厂基本为了程序的安全,会使用大量内联SVC去调用系统函数,以此来保护程序的安全。如何实现SVC指令的IO重定向,成为最大的问题。内核态是当Linux需要处理文件,或者进行中断IO等操作的时候就会进入内核态。当arm系列cpu发现svc指令的时候,就会陷入中断,简称0x80中断。
也防止有人通过inlinehook 直接hook recv ,recvform,recvmsg 直接在收到数据包的时候被拦截和替换掉。
一颗小胡椒
暂无描述