在GDB脚本中能否获取`old rip at`的值并用于表达式运算
GDB获取old rip at值用于运算的实现方法
完全可以实现,以下是两种常用的、适配不同场景的实现方式:
方式一:基于x86_64常规栈帧直接计算(最简单,无需解析输出)
x86_64架构默认栈帧布局中,rbp寄存器指向当前栈帧基地址,基地址+8的位置就是old rip at对应的返回地址存储位置,直接定义GDB便利变量即可:# 定义存储old rip地址的便利变量 set $old_rip_at = $rbp + 8 # 直接做你需要的偏移量计算 p $old_rip_at - $rsp这种方式适合没有开启栈帧省略编译选项的常规程序,执行效率最高,最适合自动化脚本调用。
方式二:解析
info frame输出(兼容所有场景,结果和info frame完全一致)
如果目标程序开启了-fomit-frame-pointer等优化选项导致rbp不可用,你可以通过解析info frame的输出提取对应值,用GDB内置Python API实现的话稳定性最高,不会受输出格式微调影响:# 在GDB中执行以下Python代码即可自动赋值便利变量 python import re frame_info = gdb.execute("info frame", to_string=True) match = re.search(r"old rip at (0x[0-9a-f]+)", frame_info) if match: gdb.execute(f"set $old_rip_at = {match.group(1)}") end # 后续直接运算即可 p $old_rip_at - $rsp
提示:如果是写外部自动化脚本调用GDB,也可以把
info frame的输出导出到外部,用grep、awk等工具提取地址后再传入GDB做运算,逻辑和上述Python实现一致。
内容的提问来源于stack exchange,提问作者Aaa Bbb
相关产品推荐
相关产品推荐

