草庐IT

glibc2.35-通过tls_dtor_list劫持exit执行流程

前言glibc2.35删除了malloc_hook、free_hook以及realloc_hook,通过劫持这三个hook函数执行system已经不可行了。传统堆漏洞利用是利用任意地址写改上上述几个hook从而执行system,在移除之后则需要找到同样只需要修改某个地址值并且能够造成程序流劫持的效果。__call_tls_dtors在程序返回时会通过exit函数,exit函数会经历以下调用过程exit->__run_exit_handlers->__call_tls_dtors而__call_tls_dtors函数中则存在着可以进行劫持的地址,__call_tls_dtors函数的执行如下:判

c++ - `weak_ptr::expired` 对象 dtor 中的行为

考虑以下代码:#include#includeusingnamespacestd;classT;std::weak_ptrwptr;classT{public:T(){}~T(){std::cout();wptr=ptr;std::cout在这段代码中,我试图找出weak_ptr是否在对象销毁阶段过期。似乎是这样。输出是:notexpiredindtorexpired我使用gcc-5.1和ideone.现在,我有另一个问题。我找不到任何说明这是标准行为的文档。是否保证以这种方式工作,总是? 最佳答案 Now,Ihaveanother

c++ - `weak_ptr::expired` 对象 dtor 中的行为

考虑以下代码:#include#includeusingnamespacestd;classT;std::weak_ptrwptr;classT{public:T(){}~T(){std::cout();wptr=ptr;std::cout在这段代码中,我试图找出weak_ptr是否在对象销毁阶段过期。似乎是这样。输出是:notexpiredindtorexpired我使用gcc-5.1和ideone.现在,我有另一个问题。我找不到任何说明这是标准行为的文档。是否保证以这种方式工作,总是? 最佳答案 Now,Ihaveanother

c++ - shared_ptr 的 dtor 是否需要使用 "deleter"?

It'swidelyknown您可以使用shared_ptr来存储指向不完整类型的指针,只要在构造shared_ptr期间可以删除该指针(具有明确定义的行为).例如,PIMPL技术:structinterface{interface();//out-of-linedefinitionrequired~interface()=default;//publicinlinemember,evenifimplicitlydefinedvoidfoo();private:structimpl;//incompletetypestd::shared_ptrpimpl;//pointertoinco

c++ - 由在 DTor 之前删除的静态对象创建的线程?

我的代码中有以下类。换句话说,CTor中有一个创建线程的静态对象(单例),当它的DTor被调用时,它有一些工作要做在这个线程的上下文中(DTor为线程放置一些工作)。我面临的问题是,当调用B的DTor时,进程中没有其他线程在运行-似乎这个线程在调用B类的析构函数之前被进程清理杀死。有人知道为什么会这样吗?以及如何避免?UPD:仅当从DLL创建Singleton时才会出现问题。当从同一个可执行文件创建Singleton时,一切正常。我正在使用VS2017Singleton.dll(A.h+A.cpp)A.h-->#pragmaonce#includeclass__declspec(dll

c++ - 数组对象初始化,其类具有一些 ctor/dtor

我想通过如下初始化语句实现数组对象的初始化。TestClassarray[5]={TestClass("test1"),TestClass("test2"),TestClass("test3"),TestClass("test4"),TestClass("test5")};根据一些权威书籍如ARM(annotatedreferencemanual)forC++,似乎说这是初始化具有构造函数/析构函数的对象数组的方法。在此之后,我刚刚创建了以下示例代码,看看会发生什么。#include#include#includeclassTestClass{public:TestClass(cons

c++ - std::unordered_map<std::String, myClass*> - std::unordered_map::erase() 是否调用 myClass 的 DTor?

假设我有一些unordered_map指向类实例的指针,从该映射中删除一个对象是否也会删除该实例?(改写问题:)如果我想删除那个实例,哪个版本是正确的?if(it!=map.end()){deleteit->second;map.erase(it);}或者只是if(it!=map.end())map.erase(it);?更新:根据很多人的建议,我转而使用shared_ptr,效果很好! 最佳答案 不,因为这是标记的C++11,你应该首先使用std::unique_ptr/std::shared_ptr来管理你的对象指针,例如std

c++ - 在结构的 STL 映射中,为什么 "[ ]"运算符会导致结构的 dtor 被额外调用 2 次?

我创建了一个简单的测试用例,展示了我在处理的较大代码库中注意到的奇怪行为。这个测试用例如下。我依靠STLMap的“[]”运算符在此类结构的映射中创建一个指向结构的指针。在下面的测试用例中,行...TestStruct*thisTestStruct=&testStructMap["test"];...获取指针(并在map中创建一个新条目)。我注意到的奇怪之处在于,这一行不仅导致在映射中创建一个新条目(因为“[]”运算符),而且由于某种原因它导致结构的析构函数被额外调用两次。我显然遗漏了一些东西-非常感谢任何帮助!谢谢!#include#include#includeusingnamesp

c++ - 普通 ctor(或 dtor)和用户定义的空 ctor(或 dtor)之间有什么区别

当类具有普通构造函数和/或普通析构函数时,C++标准定义了一些非常具体的行为。例如,根据标准的§3.8/1:ThelifetimeofanobjectoftypeTendswhen:—ifTisaclasstypewithanon-trivialdestructor(12.4),thedestructorcallstarts,or—thestoragewhichtheobjectoccupiesisreusedorreleased.所以,如果一个对象不是普通可破坏的,则在调用析构函数后访问该对象成员的任何尝试都是UB。如果一个对象是普通可破坏的,则在调用析构函数后尝试访问该对象的成员是

c++ - GNU GCC (g++) : Why does it generate multiple dtors?

开发环境:GNUGCC(g++)4.1.2当我试图研究如何在单元测试中增加“代码覆盖率——尤其是函数覆盖率”时,我发现某些类dtor似乎被生成了多次。请问你们中的一些人知道为什么吗?我使用以下代码尝试并观察了上面提到的内容。在“test.h”中classBaseClass{public:~BaseClass();voidsomeMethod();};classDerivedClass:publicBaseClass{public:virtual~DerivedClass();virtualvoidsomeMethod();};在“test.cpp”中#include#include"t