Objective-C 中的方法调用通过使用 objc_msgSend(void /* id self, SEL op, ... */) 函数向对象发送消息,上面的代码:[a characterAtIndex:1] 在运行时转换为:objc_msgSend(id self, @selector(characterAtIndex:), 1) 。接下来继续剖析id和SEL数据类型,来揭开 objc 消息发送机制的神秘面纱。
id 是 objc 中指向任何(NSObject)类实例的指针(和C中的 void*还是有所区别的 void*指一个未知类型或未知内容的指针),id定义在 runtime/objc.h 头文件中:
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
/// Represents an instance of a class.
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
objc_class 结构它具有名称 ( name ) 、指向其超类 ( super_class ) 的指针、指向实例变量的指针 ( ivars )、方法列表 ( methodLists )、缓存 ( cache ),最后是协议列表 ( protocols )。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
id 是 objc 中指向任何(NSObject)类实例的指针(和C中的 void*还是有所区别的 void*指一个未知类型或未知内容的指针),id定义在 runtime/objc.h 头文件中:
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
/// Represents an instance of a class.
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
objc_class 结构它具有名称 ( name ) 、指向其超类 ( super_class ) 的指针、指向实例变量的指针 ( ivars )、方法列表 ( methodLists )、缓存 ( cache ),最后是协议列表 ( protocols )。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
对利用客户端弹窗挂马的某病毒服务器取证发现的flash漏洞exp
据了解很多软件厂商对自身广告流量的管理监控都存在漏洞,有些甚至经过了多层代理分包,又缺乏统一有力的安全审核机制,导致被插入网页木马的“染毒流量”被大批推送到客户端,最终导致用户系统感染病毒。在样本溯源过程中,我们甚至在某知名音乐软件中发现一个专门用于暗刷广告流量的子模块。用户越多责任越大,且行且珍惜。
流量劫持的故事继续发展,当一个网络数据包成功躲开了本地主机系统上的层层围剿,离开用户主机穿行于各个路由网关节点,又开启了一段新的冒险之旅。在用户主机和远程服务器之间的道路同样是埋伏重重,数据包可能被指引向错误的终点(DNS劫持),也可能被半路冒名顶替(302重定向),或者直接被篡改(http注入)。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
据了解很多软件厂商对自身广告流量的管理监控都存在漏洞,有些甚至经过了多层代理分包,又缺乏统一有力的安全审核机制,导致被插入网页木马的“染毒流量”被大批推送到客户端,最终导致用户系统感染病毒。在样本溯源过程中,我们甚至在某知名音乐软件中发现一个专门用于暗刷广告流量的子模块。用户越多责任越大,且行且珍惜。
流量劫持的故事继续发展,当一个网络数据包成功躲开了本地主机系统上的层层围剿,离开用户主机穿行于各个路由网关节点,又开启了一段新的冒险之旅。在用户主机和远程服务器之间的道路同样是埋伏重重,数据包可能被指引向错误的终点(DNS劫持),也可能被半路冒名顶替(302重定向),或者直接被篡改(http注入)。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
某互联网金融APP加密算法被破解导致敏感信息泄露
某P2P应用客户端,用来加密数据的DES算法的密钥硬编码在Java代码中,而DES算法是对称密码算法,既加密密钥和解密密钥相同。
反编译APP,发现DES算法
发现DES算法的密钥,硬编码为“yrdAppKe”,用来加密手势密码|
将手势密码用DES加密后存放在本地LocusPassWordView.xml文件中
知道了密文和加密算法以及密钥,通过解密操作,可以从文件中恢复出原始的手势密码。或者使用新的生成新的手势密码
而与服务器通信时接口中的Jason字段也用了DES算法和密钥硬编码为“yRdappKY
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
某P2P应用客户端,用来加密数据的DES算法的密钥硬编码在Java代码中,而DES算法是对称密码算法,既加密密钥和解密密钥相同。
反编译APP,发现DES算法
发现DES算法的密钥,硬编码为“yrdAppKe”,用来加密手势密码|
将手势密码用DES加密后存放在本地LocusPassWordView.xml文件中
知道了密文和加密算法以及密钥,通过解密操作,可以从文件中恢复出原始的手势密码。或者使用新的生成新的手势密码
而与服务器通信时接口中的Jason字段也用了DES算法和密钥硬编码为“yRdappKY
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
❤2👍1
某租车APP加密算法被破解导致一些列风险
某租车APP与服务器通信的接口采用http传输数据,并且有对传输的部分参数进行了加密,加密算法采用AES,但是密钥硬编码在java代码中为“shenzhoucar123123”,可被逆向分析出来,导致伪造请求,结合服务器端的漏洞,引起越权访问的风险,如越权查看其它用户的订单等。
和服务器通信时的数据
q字段是加密后的内容。逆向APP,从登录Activity入手
分析登录流程:v1是用户名,v2是密码,v3是PushId,在用户名和密码不为空并且长度不小于11情况下,执行LoginOperate相关操作,追踪LoginOperate的实现,发现继承自BaseOperate,继续追踪BaseOperate的实现
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
某租车APP与服务器通信的接口采用http传输数据,并且有对传输的部分参数进行了加密,加密算法采用AES,但是密钥硬编码在java代码中为“shenzhoucar123123”,可被逆向分析出来,导致伪造请求,结合服务器端的漏洞,引起越权访问的风险,如越权查看其它用户的订单等。
和服务器通信时的数据
q字段是加密后的内容。逆向APP,从登录Activity入手
分析登录流程:v1是用户名,v2是密码,v3是PushId,在用户名和密码不为空并且长度不小于11情况下,执行LoginOperate相关操作,追踪LoginOperate的实现,发现继承自BaseOperate,继续追踪BaseOperate的实现
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
❤2
某酒店APP加签算法被破解导致一系列风险
某酒店APP和服务器通信时接口采用http通信,数据进行了加密,并且对传输参数进行签名,在服务器端校验签名,以检查传输的数据是否被篡改,但是加签算法和密钥被逆向分析,可导致加签机制失效,攻击者可任意伪造请求包,若结合服务器端的权限控制有漏洞,则可引发越权风险等。
APP和服务器通信的原始包如图,可以看到有加签字段sign
逆向APP定位到加密算法的逻辑代码,com.htinns.biz.HttpUtils.class
原始数据是unSignData,使用RC4算法加密,密钥为KEY变量所代表的值,加密后的数据为signData,传输的数据时的data字段为signData。
加签字段signd的生成方法是用unsignData拼接时间戳time和resultkey,然后做md5,再进行base64编码。时间戳保证了每次请求包都不一样。
sendSign()算法是用c或c++写的,放入了so库,其他重要算法都是用java写的。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
某酒店APP和服务器通信时接口采用http通信,数据进行了加密,并且对传输参数进行签名,在服务器端校验签名,以检查传输的数据是否被篡改,但是加签算法和密钥被逆向分析,可导致加签机制失效,攻击者可任意伪造请求包,若结合服务器端的权限控制有漏洞,则可引发越权风险等。
APP和服务器通信的原始包如图,可以看到有加签字段sign
逆向APP定位到加密算法的逻辑代码,com.htinns.biz.HttpUtils.class
原始数据是unSignData,使用RC4算法加密,密钥为KEY变量所代表的值,加密后的数据为signData,传输的数据时的data字段为signData。
加签字段signd的生成方法是用unsignData拼接时间戳time和resultkey,然后做md5,再进行base64编码。时间戳保证了每次请求包都不一样。
sendSign()算法是用c或c++写的,放入了so库,其他重要算法都是用java写的。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
模糊测试器的类型
常见的有命令行参数fuzz、环境变量fuzz、文件fuzz、网络协议fuzz、内存fuzz等
命令行参数就是上面的代码例子,环境变量fuzz,这个就是getenv("aaa"); 两种思路,不停的重写aaa变量的值和重启目标程序,第二点是必须的,第一点的改进思路hook getenv,重新实现一个getenv函数.
文件fuzz:覆盖性的写入数据,如果不读文件格式的说明文档,按字节覆盖,工作量巨大,有些文件格式会进行CRC效验,例如png文件格式.就像溢出保护的/gs选项.
网络协议fuzz:协议即传输数据的标准,数据本质上是01,根据协议对每个位置的划分来确定不同位置数据的意义,我们把这些位置称为块,块内的数据以key:value的方式存储,像是堆块中块首一样,有特定的位置标注数据的大小,client按协议格式发包后,server端根据协议解析,假如随意修改了数据却没有修改块大小,server端就无法正确识别数据.
协议也分两种:简单文本协议、二进制协议
简单协议通讯的数据在可打印字符范围内,人工可阅读,例如ftp、http协议
复杂如tcp/ip协议的NBNS,wireshark本身支持的协议比较多,或是本身公开或是逆向工程,将数据解析成肉眼可阅读的格式.
当面对复杂且闭源的协议,对其fuzz首要工作就是逆向工程,为此出现了内存形式的fuzz,直接在程序的内存空间里进行模糊测试
有如上代码,无限循环接受请求,在内存空间定位到parse之前插入数据而不必关心数据在recv之前是如何封装的,缺陷就是漏洞场景可能无法重现
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
常见的有命令行参数fuzz、环境变量fuzz、文件fuzz、网络协议fuzz、内存fuzz等
命令行参数就是上面的代码例子,环境变量fuzz,这个就是getenv("aaa"); 两种思路,不停的重写aaa变量的值和重启目标程序,第二点是必须的,第一点的改进思路hook getenv,重新实现一个getenv函数.
文件fuzz:覆盖性的写入数据,如果不读文件格式的说明文档,按字节覆盖,工作量巨大,有些文件格式会进行CRC效验,例如png文件格式.就像溢出保护的/gs选项.
网络协议fuzz:协议即传输数据的标准,数据本质上是01,根据协议对每个位置的划分来确定不同位置数据的意义,我们把这些位置称为块,块内的数据以key:value的方式存储,像是堆块中块首一样,有特定的位置标注数据的大小,client按协议格式发包后,server端根据协议解析,假如随意修改了数据却没有修改块大小,server端就无法正确识别数据.
协议也分两种:简单文本协议、二进制协议
简单协议通讯的数据在可打印字符范围内,人工可阅读,例如ftp、http协议
复杂如tcp/ip协议的NBNS,wireshark本身支持的协议比较多,或是本身公开或是逆向工程,将数据解析成肉眼可阅读的格式.
当面对复杂且闭源的协议,对其fuzz首要工作就是逆向工程,为此出现了内存形式的fuzz,直接在程序的内存空间里进行模糊测试
有如上代码,无限循环接受请求,在内存空间定位到parse之前插入数据而不必关心数据在recv之前是如何封装的,缺陷就是漏洞场景可能无法重现
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
细化规则和发包
除去内存fuzz,发包方式分两种:直接发送跟代理发送.第二种也叫启发式fuzz,wireshark可解析的情况下,针对特定字段fuzz
本文以简单协议的ftp fuzz为例,瓶颈出现在发包过程中,要考虑server端的带宽和上游isp的响应速度,好在可以把server部署在本地.
以覆盖缓冲区为目的,截取不同长度的数据来发包,数据内容不能出现在用户层的内存地址,
我们喜闻乐见的栈溢出发生时会抛出内存地址读取或写入违例的异常,假如eip指向用户层内的地址可能不会抛出异常.
这里我们就用一串A来测试.
:异常捕获
设想我们有一个长度为10的数组,数组内每组数据长度不同,以递增方式存储,假设第4组数据长度刚好溢出缓冲区抛出异常,模糊测试器没有异常捕获功能,直到发包完毕后才停止,那么我们只能确定测试目标存在漏洞,如何精准定位数据长度呢?
常见的捕获方式有三种:
监视事件日志.
心跳包检测.
调试器
大多数情况我们推荐用成熟的调试器(例如OD)attach目标程序,程序崩溃时能清楚的观察上下文,堆栈回溯定位漏洞位置,配合wireshark能清楚的看到发包数据,或者在模糊测试器内嵌异常捕获功能:
CreateProcessA包含Debug_PROCESS标志来创建调试态的程序,WaitForDebugEvent获取信号,程序触发异常会发送信号给模糊测试器
DebugActiveProcess附加到相应进程上,同WaitForDebugEvent,再另外起线程去发包
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
除去内存fuzz,发包方式分两种:直接发送跟代理发送.第二种也叫启发式fuzz,wireshark可解析的情况下,针对特定字段fuzz
本文以简单协议的ftp fuzz为例,瓶颈出现在发包过程中,要考虑server端的带宽和上游isp的响应速度,好在可以把server部署在本地.
以覆盖缓冲区为目的,截取不同长度的数据来发包,数据内容不能出现在用户层的内存地址,
我们喜闻乐见的栈溢出发生时会抛出内存地址读取或写入违例的异常,假如eip指向用户层内的地址可能不会抛出异常.
这里我们就用一串A来测试.
:异常捕获
设想我们有一个长度为10的数组,数组内每组数据长度不同,以递增方式存储,假设第4组数据长度刚好溢出缓冲区抛出异常,模糊测试器没有异常捕获功能,直到发包完毕后才停止,那么我们只能确定测试目标存在漏洞,如何精准定位数据长度呢?
常见的捕获方式有三种:
监视事件日志.
心跳包检测.
调试器
大多数情况我们推荐用成熟的调试器(例如OD)attach目标程序,程序崩溃时能清楚的观察上下文,堆栈回溯定位漏洞位置,配合wireshark能清楚的看到发包数据,或者在模糊测试器内嵌异常捕获功能:
CreateProcessA包含Debug_PROCESS标志来创建调试态的程序,WaitForDebugEvent获取信号,程序触发异常会发送信号给模糊测试器
DebugActiveProcess附加到相应进程上,同WaitForDebugEvent,再另外起线程去发包
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
hook api实现数据包打印
首先查看是用的哪个dll的导出函数
这里可以看到用了ws2_32和wsock32,hook wsock32 recv
0x71A42E9E位置调用了ws2_32的WSARecv函数,bp ws2_32.WSARecv
查看数据包结尾标志,这里是'\x0D',读内存代码大致如下:
buffer=''
while 1:
byte = dbg.read_process_memory( aaa + offset, 1 )
if byte != '\x0D':
buffer += byte
offset += 1
continue
else:
break
print buffer
看WSARecv的结构,断在WSARecv上,lpOverlapped is null,那么就是说为阻塞式,可以直接hook,在recv结束后ebx的值为BUFFER,缓冲区的数据会写入BUFFER指向的位置,所以在该api结束时callback即可
func_resolve_debug获得地址,创建一个container容器,源码上有example
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
首先查看是用的哪个dll的导出函数
这里可以看到用了ws2_32和wsock32,hook wsock32 recv
0x71A42E9E位置调用了ws2_32的WSARecv函数,bp ws2_32.WSARecv
查看数据包结尾标志,这里是'\x0D',读内存代码大致如下:
buffer=''
while 1:
byte = dbg.read_process_memory( aaa + offset, 1 )
if byte != '\x0D':
buffer += byte
offset += 1
continue
else:
break
print buffer
看WSARecv的结构,断在WSARecv上,lpOverlapped is null,那么就是说为阻塞式,可以直接hook,在recv结束后ebx的值为BUFFER,缓冲区的数据会写入BUFFER指向的位置,所以在该api结束时callback即可
func_resolve_debug获得地址,创建一个container容器,源码上有example
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
❤1