记事本

讯飞输入法PC版日志上传解密逆向

入手 驰那边安装讯飞输入法后,他将全部文件打包发送过来。解压后发现有.exe和.dll文件: 所以要检查的目标,就是这些二进制文件。 根据旭抓包的结果,日志请求会访问 /log.aspx?c=1002&v=2.0&t=20170613144351 这样的地址,所以,最基本的就是在全部二进制文件中搜索字符串&t=。搜索确认后,发现在文件BlcCore.dll中...

机器学习在侵权微信公众号识别中的应用

研究背景 最近遇到了收集侵权的微信公众号的需求。根据前期沟通,整理得到了一批搜索关键词以及白名单。 于是,我对之前的公众号信息采集插件进行了调整优化,加快了搜索速度,得到了一批数据: 搜索关键词数量 118 采集字段 微信ID、公众号名称、账号主体、功能描述、是否通过微信认证、logo地址 ...

x86架构下对方法做inline hook的坑

最近在研究Android原生代码hook时,遇到了一个麻烦。具体来说,就是在x86架构下,方法inline hook后,在执行原方法时可能会segfault。这里简要记录下,希望之后能够解决这个问题。 inline hook的基本思路 对方法进行inline hook,基本上就是以下步骤: 将origin方法的起始几条指令,保存到backup 在backup的最后,跳转回or...

YAHFA--ART环境下的Hook框架

在Android Dalvik时代,最流行的Hook框架非Xposed莫属了。各种功能强大的Xposed插件极大地丰富了Android的可玩性,而对于安全研究人员来说,hook则是应用逆向工作中的一项非常有效的手段。 但是,进入到ART时代后,情况逐渐发生了变化。Xposed框架对系统进行了较大的改动,因此其安装适配难度显著提高;另一方面,随着近年来热修复技术的兴起,各大国内厂商也纷纷推出...

VirtualApp沙盒基本原理

VirtualApp是一个开源的Android App虚拟化引擎,允许在其中创建虚拟空间,并在这个虚拟空间中运行其他应用。通过阅读源码及动态调试,基本了解了其运行原理,在此记录。 本质 Android应用隔离是基于Linux系统的多用户机制实现的,即每个应用在安装时被分配了不同的Linux用户uid/gid。而在VirtualApp中,client应用(通过VirtualApp安装的...

为filebeat+kafka+logstash添加认证与授权

我们之前自己开发的几套工具,目前部署在了外网。为了便于监控运营状况,需要对服务日志进行收集展示。 我们采用了目前非常火的ELK,es和kibana之前已经部署好了,所以需要完成的就是日志收集这一环节。具体地,我们采用filebeat+kafka+logstash,即: 在需要监控的各个节点上运行filebeat。相比logstash,filebeat更为轻量,也更为专一 将fi...

mmap的随机化

pwnable.kr上的题目tiny,我一直没有能够做出来,所以就决定先看看tiny_easy。tiny_easy与tiny很相似,只是栈变成了可执行的,所以可以将shellcode放在栈上。但是,由于栈的地址被随机化了,我们仍然需通过暴力尝试的方法来克服ASLR。 直到最近,我在网上搜索了解到mmap地址随机化的一些坑,才明白这两道题目可以通过某些手段来克服ASLR,从而避免暴力尝试。 ...

pwnable.kr之fsb

这道题目与格式化字符串(format string)攻击相关。程序会将argv和envp清空,但是调试发现,在栈的底部仍然存在可执行文件的路径。所以基本思路就是利用符号链接。将key内存地址写入栈上。随后利用格式化字符串,获取栈上该内存地址相对于栈顶的偏移。最后通过%x$hhx的方式,将key的内容改写为我们设定的值。 但是,实际操作时,还是掉了几个坑。 第一个,读入字符串使用的是rea...

pwnable.kr之syscall

这道题目提供了一个编写的内核模块源码,其中添加了一个syscall,其执行的逻辑基本与strcpy()相同,只是会将小写字母变为大写字母。 那么,这里的漏洞就很明显了,基本上就是一个向任意地址写任意内容的漏洞,只要写入的内容不包含小写字母。接下来,就是如何利用这个syscall,获取root权限,从而读取flag文件。 接下来,便对linux内核exploit进行简单的介绍。 在l...

pwnable.kr之uaf

由这道题目名称便可知,是需要使用Use After Free(UAF)。漏洞很明显,我们只需要首先free掉空间,再分配并向释放的地址写入内容,最后再次use即可。 具体地,在use时会调用类的虚方法introduce(),根据反汇编可知,该方法在虚表中是第二项,而第一项则是我们要调用的虚方法give_shell()。所以,我们需要向对象的虚表处写入的内容,是原虚表地址的前一项(即-0x8...