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;
}
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;
算了,直接调试吧,本菜鸡就是莽
在栈上分配空间
根据结果
string 是这样一个结构
全局变量一个int
{
int 未知;
char* 字符串真实地址;
int length;
int Res(未知);
}
所以根据这个结构,a.length的效率贼高,64位系统肯定要变化,至少指针长度不同,至于里面的函数,就不去分析了
网上搜索的时候看到一个网站,应该还行http://www.cplusplus.com/reference/string/string/