0%

De1CTF-2020-stl-container(C++ Vector漏洞)

C++的vector的erase函数实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
iterator erase(iterator position){
if (position + 1 != end())
{
// 把从 position+1 到 finish 之间的元素一个一个复制到从 position 指向
//的空间,这样,就把 position 原来指向的元素个覆盖了

copy(position + 1, finish, position);
}

--finish;

destroy(finish);

return position;
}

就是将position+1 到 finish 之间的元素一个一个复制到从 position 指向的空间,这样,就把 position 原来指向的元素个覆盖了。同时注意到destroy(finish);释放最后一个元素,因此position位置的元素不会被释放,最后一个元素会被释放造成UAF。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//假设有如下的一个列表,其内存空间表示如下:
//---------------------------------------------------------
//| 1 | 2 | 3 | 4 | 5 | | |
//---------------------------------------------------------
// |
// finish
//现在,要删除第二个元素 2 这个对象。
//所以,执行 copy 之后,把 3, 4, 5 对象往前移动,其内存空间如下:
//---------------------------------------------------------
//| 1 | 3 | 4 | 5 | 5 | | |
//---------------------------------------------------------
// |
// finish
//注意,第 5 个元素的内存空间还是原来的对象 5 这个对象。
//然后,执行 --finish; 操作,移动指针,如下:
//---------------------------------------------------------
//| 1 | 3 | 4 | 5 | 5 | | |
//---------------------------------------------------------
// |
// finish
//然后,执行 destroy(finish); 操作,执行的是第 5 个元素的析构函数,而
//我们删除的第2个对象,并没有执行其析构函数,只是把它在内存空间给覆盖了。