前几天通过从网上查阅相关资料,大体了解了一些Android无源码调试的方法,本文主要总结无源码调试的三种方法:
- smalidea + Android Studio
- IDA
- 插桩(Instrumentation)
前几天通过从网上查阅相关资料,大体了解了一些Android无源码调试的方法,本文主要总结无源码调试的三种方法:
这篇文章是参考UC Berkeley张超博士的一个视频和两篇NDSS论文,学习的一些关于C++虚函数安全相关的内容。虚函数调用
是面向对象中的一个很重要的特性,用来支持多态。运行时实际调用的函数是根据对象来决定的。运行时找虚函数是通过vtable
函数指针来实现,vtable指针由编译器添加到对象中。
本文介绍通过return-to-dl-resolve的手法绕过NX和ASLR的限制。
这里构造一个存在栈缓冲区漏洞的程序,以方便后续构造ROP链。
1 | #include <unistd.h> |
本文以一个简单C++例子进行介绍。
示例代码编译时没有使用RTTI,也没有使用异常机制
下文中的样例在x86平台上测试
所有二进制文件已经被strip了
大多数虚函数的实现细节都没有标准化,并且不同编译器之间可能会有所不一样。因此,我们将专注于GCC的行为。
大多数情况下,没有办法让一个虚函数的调用,变换为一个对非虚函数的调用(反虚拟化)。因为,需要的信息在静态编译中是不全的,只有在运行时才会存在。因此,逆向虚函数时,目标是判断哪些函数会在特定的情况下被调用。后面会学习其他技巧,来进一步缩小范围。
先介绍一下IDAPython的简单用法:写一个获取函数引用的功能,只需要XrefsTo()这个API函数,脚本如下:
1 | def find_func_xrefs(addr): |
类的基本思想是数据抽象
和封装
。数据抽象是一种依赖于接口
和实现
分离的编程技术。
面向对象程序设计的核心思想是数据抽象
、继承
和动态绑定
。
定义基类