C++虚函数逆向 (1)
译者注
译者 : Silver@XDSEC 原文地址 , https://alschwalm.com/blog/static/2016/12/17/reversing-c-virtual-functions/ 作者为 , Adam Schwalm 译文首发于 。 Freebux 本来想投 。 36x 赚点稿费 但是他们的编辑器实在太难用了 , 就投了支持 , Markdown 的 Freebux 结果后来才知道 , 36x 也能用 markdown 投 嘛 …… 反正已经投了 , 就这样吧 , 。
前言
关于
此外
- 示例代码编译时没有使用
也没有使用异常机制, - 下文中的样例在
- 所有的二进制文件已经被
剥离了符号( ) - 大多数虚函数的实现细节是没有特定标准的
因此不同编译器对此的处理方法很可能不一致, 因此。 我们将着重讨论,
另外g++ -m32 -fno-rtti -fnoexceptions -O1 file.cpp
strip
目标
大多数情况下
基本功
假设你已经比较熟悉
// file reversing-1.cpp
#include <cstdlib>
#include <iostream>
struct Mammal {
Mammal() { std::cout << "Mammal::Mammal\n"; }
virtual ~Mammal() { std::cout << "Mammal::~Mammal\n"; };
virtual void run() = 0;
virtual void walk() = 0;
virtual void move() { walk(); }
};
struct Cat : Mammal {
Cat() { std::cout << "Cat::Cat\n"; }
virtual ~Cat() { std::cout << "Cat::~Cat\n"; }
virtual void run() { std::cout << "Cat::run\n"; }
virtual void walk() { std::cout << "Cat::walk\n"; }
};
struct Dog : Mammal {
Dog() { std::cout << "Dog::Dog\n"; }
virtual ~Dog() { std::cout << "Dog::~Dog\n"; }
virtual void run() { std::cout << "Dog::run\n"; }
virtual void walk() { std::cout << "Dog::walk\n"; }
};
然后还有这么一段调用他们的代码
// file reversing-2.cpp
int main() {
Mammal *m;
if (rand() % 2) {
m = new Cat();
} else {
m = new Dog();
}
m->walk();
delete m;
}
很显然m
cat
dog
rand
walk
由于我们把walk
vtable
)vptr
)Dog
Cat
Mammal
Dog
Dog::run
Dog::walk
Cat
Cat::run
Cat::walk
通过在.rodata
Mammal
Cat
Dog
主函数这时候被编译成了这个样子
可以看到vptr
vptr
vptr+12
我们再看一下sub_80487AA
sub_804877E
___cxa_pure_virtual
Dog
Cat
walk
Mammal
Mammal
walk
Mammal
Cats
Dogs
但比较奇怪的是
run
walk
move
- 析构器
实际上
那么现在我们搞清楚了虚表的布局
| Offset | Pointer to |
|--------+-------------|
| 0 | Destructor1 |
| 4 | Destructor2 |
| 8 | run |
| 12 | walk |
| 16 | move |
值得注意的是
现在可以考虑给他们重命名
注意Cat
Dog
move
Mammal
结构体
为了研究方便Mammal
Cat
Dog
接下来就比较麻烦了m
具有一个特定类型的话
接下来Cat
vptr
CatVtable*
类型Dog__run
void (*)(Dog*)
最后一步是回到原来的代码中
上面是把m
设定为Cat*
或Dog*
m
是Dog
Dog__walk
Cat__walk
我们也可以把m
设置为Mammal*
类型
假设m
是Mammal*
类型m
Mammal*
类型
这种和源代码不符的说法m
赋予的是一个编译时的类型___cxa_pure_virtual
Mammal
通过以上的分析Cat
Dog