通过 Python 向 GDB 添加类型

逆向工程 数据库 Python
2021-07-11 04:05:30

GDB 有一个相当健壮的 API,它在运行时暴露给 Python。它允许检查各种类型,但似乎不允许创建类型。

但是,可以通过在运行时加载目标文件来手动添加类型 ( https://stackoverflow.com/q/7272558 )。

有没有办法gdb.Type在运行时添加或创建新对象?

其目的是允许随后的存储器检查经由gdb.Value.casttype.pointer(),然后.dereference()天。这比手动逐字段反序列化数据要好得多/容易得多。

或者,我认为我可以以编程方式加载一个目标文件。看起来 GDB 非常乐意为符号/类型目的加载跨架构的目标文件。为了不杀死任何真实/有用的符号,或创建误导性的符号,应使用不存在的地址。但是,.o在未映射的地址加载 a需要用户验证(键入y),因此从gdb.execute(...)完成后会完全失败。

1个回答

因此,您可以通过以下方式从 GDB Python 中执行此操作。诀窍是from_tty=False

foo = open('foo.cc','w+')
foo.write('struct foobar { int x; }; foobar foo;')
foo.close()

subprocess.check_output('g++ -w -c -g foo.cc -o foo.o', shell=True)

gdb.execute('add-symbol-file foo.o 0', from_tty=False, to_string=True)

您现在应该可以在 gdb 中查看类型:

gdb $ ptype foobar
type = struct foobar {
    int x;
}