c++ string 源码分析

菜鸡的我当酱油去了ctf,re的第一题就把我整懵了
ida警告
Unexpected entries in the PLT stub.
The file might have been modified after linking.
大致就是PLT 被修改了
解决方法我能想到的有二:
一:修复PLT表//本菜鸡不会
二:直接动调//莽就完事了


跟到源码里
使用了一堆0x20大小的栈空间//我刚开始以为是数组
跟到函数里
有个basic_string 的构造函数和析构函数
那这些0x20大小的栈空间是string?
实验了一下,的确的string, 那么string是怎么存,于是今天研究一下string源码
//环境VC6.0++ 下 sizeof(string) 0x10      vs2010下(string) 0x20 研究一下vc6.0++的源码
#include<string>
using namespce std;           //这行必须加不然找不到string,也就是string在std这个命名空间里
int main()
{
    string a;
    cin >> a;
    getchar();
    return 0;
}
c++ string 源码分析c++ string 源码分析
string == basic_string< char ,char_traits<char>, allocator<char> >
模板类哦,开始不快乐了,变量辣么多
template<class _E,
    class _Tr = char_traits<_E>,
    class _A = allocator<_E> >
    class basic_string {
public:
    static const size_type npos;                         // static 不占本空间,算是全局变量,加了const变成静态
    _A allocator;
    _E *_Ptr;
    size_type _Len, _Res;

算了,直接调试吧,本菜鸡就是莽
在栈上分配空间
c++ string 源码分析
c++ string 源码分析
c++ string 源码分析c++ string 源码分析
根据结果
string 是这样一个结构
全局变量一个int

{
    int 未知;
    char*  字符串真实地址;
    int  length;
    int Res(未知);
}
所以根据这个结构,a.length的效率贼高,64位系统肯定要变化,至少指针长度不同,至于里面的函数,就不去分析了

网上搜索的时候看到一个网站,应该还行http://www.cplusplus.com/reference/string/string/