调试:追踪原始指针在代码中的传播路径
用调试器追踪heap-use-after-free的指针传播路径
完全可以通过调试器追踪目标指针的传播路径,下面以GDB为例给出具体操作步骤,LLDB操作逻辑类似:
1. 在指针分配处打断点
已知持有分配地址的原始指针变量,直接在该指针接收内存分配返回值的代码行设断点:
break 文件名:行号 # 或者通过函数名定位,比如malloc/new的调用处 break malloc
程序运行到断点后,确认目标内存地址(即ASAN给出的出错地址),打印原始指针变量的值:
p 原始指针变量名
记录这个地址,记为TARGET_ADDR。
2. 设置读断点追踪指针复制
原始指针的值被读取时,大概率是要将该地址复制到其他变量。给原始指针设置读断点,每次读取该指针就触发中断:
rwatch 原始指针变量名
触发断点时,查看调用栈定位当前代码上下文:
bt
同时结合当前执行的代码,就能找到指针被复制到的目标变量(比如类成员、全局变量或局部变量)。
3. 监控目标地址的写入操作(可选)
如果原始指针被多次传递,还可以直接监控**任何变量被赋值为TARGET_ADDR**的操作,通过硬件断点实现:
watch -l TARGET_ADDR
这个命令会监控所有内存位置被写入TARGET_ADDR值的场景,触发后同样通过调用栈定位复制逻辑。
注意事项
- 大型遗留代码可能会触发大量断点,建议结合调用栈过滤掉临时变量的无关复制,重点关注生命周期长的变量(比如类成员、全局变量、静态变量)。
- 硬件断点数量有限(通常4个左右),如果需要监控多个地址,可分批处理。
内容的提问来源于stack exchange,提问作者User 10482
相关产品推荐
相关产品推荐

