Advanced Debugging and the Address Sanitizer
2024-09-26 19:32:55
A debug trick
在异常端点处运行 po $arg1
,找出异常信息。

Address Sanitizer
概述
- 是一个运行时检测工具
- 发现内存问题
- 可以用于模拟器和设备
可以发现的问题
- Use after free
- Heap buffer overflow
- Stack buffer overflow
- Global variable overflow
- Overflows in C++ containers
- Use after return
原理
当打开这个功能时,在编译时传入了一个参数,在运行时链接了一个动态库 asan dylib
。

系统为所有内存维护了一个 shadow memory,标记了那些是可以正常使用的,那些是不可以访问的。

在上图中,红色区域是不可以访问的,因为不是预分配的地址。
为了达到这个目的,系统预留了部分内存地址做为 shadow memory,把每 8 个字节的状态用 1 个比特来代表。

在访问内存时,只需要做一个偏移来查看比特位的状态即可。
bool IsPoisoned(Addr) {
Shadow = Addr >> 3 + Offset
return (*Shadow) != 0
}
检测堆的内存错误原理
复写了系统的 malloc
函数,把分配好的内存区域周围标记为 posioned。这样子在越界时,可以检测出来。

可以检测出来下面的错误:
- Heap underflows/overflows
- Use-after-free
- double free
检测栈上内存错误
类似,在栈上分配的内存周围标记为 posioned,并在访问内存之前做检查。

这样子也可以检测出全局变量内存错误。
复写了很多内存函数
不限于 memcpy, memset, strcpy, strlen, fwrite, printf, getline, ...
增加的负载

最新文章
- 【JavaScript吉光片羽】--- 滑动条
- CSS3-03 样式 2
- 初识genymotion安装遇上的VirtualBox问题
- Oracle创建/删除表空间和用户(2014-3-10 记)
- As 和 Is的区别
- Android Listener侦听的N种写法
- CF Gym 100685A Ariel
- 【转】7 Tips to Speed Up Eclipse
- USACO Section 3.3 商店购物 Shopping Offers
- poj 3273 Monthly Expense(贪心+二分)
- Android用户界面UI组件--AdapterView及其子类(五) Spinner和SpinnerAdapter
- 通过SSHFS在RHEL中安全的挂载远程Linux/UNIX目录或文件系统--转载
- 使用 Scut 搭建通服架构
- 读书笔记 effective c++ Item 11 在operator=中处理自我赋值
- 近期面试总结(PHP后端开发工程师)(部分笔试题)
- SQL Server学习之路(八):扩展SQL语句
- org.apache.hadoop.security.AccessControlException
- 转 VS2010 RDLC 横向合并时“未正确设置 tablix“Tablix1”的 FixedData 属性”错误解决方法 .
- [SQL]SQL Server 事务及回滚事务
- Android--将实体类转化成Json和Map的基类
热门文章
- wcf服务契约继承
- c++编程思想里面的错误(可能c++标准变了,所以以前的东西没有更新)
- js数组合并(一个数组添加到另一个数组里面)方法
- docker镜像基本操作
- HDU 1513 &;&; POJ 1159 Palindrome (DP+LCS+滚动数组)
- Apache Struts 2 Documentation Core Developers Guide
- (匹配)Antenna Placement --POJ --3020
- (二分匹配 模板)过山车 -- hdu --2063
- ssh远程调用之shell脚本远程调用应用程序
- C# 调用C++ CLR dll类库时,实现从 string 到 sbyte* 的转换