在 GDB 中取消引用双指针(指向值的指针)
Posted
技术标签:
【中文标题】在 GDB 中取消引用双指针(指向值的指针)【英文标题】:Dereference a double pointer (a pointer to a pointer to a value) in GDB 【发布时间】:2021-09-22 12:13:10 【问题描述】:我正在编写一个脚本来对可执行文件进行逆向工程。我有一种情况,RAX 是一个指向一个值的指针,该值本身就是一个指向对象的指针。反过来,该对象的第一个值是指向字符串的指针。可视化应该清除它:
RAX
|
| points to
|
V
Value on the stack
|
| points to
|
V
The start of an object (std::vector<std::string)
|
| the very first value of that object points to
|
V
A string in memory
我想访问内存中的字符串。如何用一个命令做到这一点?
【问题讨论】:
【参考方案1】:我是这样做的:
# Dereference RAX to get the value on the stack
(gdb) x/gx $rax
0x7fffffffe0d0: 0x0000555555598700
# Dereference the value on the stack to get the start of the object
(gdb) x/gx *((uint64_t*)$rax)
0x555555598700: 0x0000555555578ea0
# Dereference the start of the object because it points to a string
(gdb) x/s *((uint64_t*)*((uint64_t*)$rax))
0x555555578ea0: "/root/.ssh/id_rsa"
我必须将值转换为 uint64_t
,否则 GDB 会认为它是 32 位值(我正在使用 64 位可执行文件)。
此外,在向量对象开始后 4 个字节处还有另一个指向字符串的指针。以下是我访问该字符串的方式:
x/s *((uint64_t*)*((uint64_t*)$rax) + 4)
【讨论】:
以上是关于在 GDB 中取消引用双指针(指向值的指针)的主要内容,如果未能解决你的问题,请参考以下文章