一行代码暴露你的C++水平
2016-01-07 09:37
330 查看
1 遇到如下的一个崩溃:
chrome!net::ConnectJob::ConnectJob:
5eb3e0bd 55 push ebp
5eb3e0be 8bec mov ebp,esp
5eb3e0c0 83ec30 sub esp,30h
5eb3e0c3 a140d0cf6b mov eax,dword ptr ds:[6BCFD040h]
5eb3e0c8 33c5 xor eax,ebp
5eb3e0ca 8945fc mov dword ptr [ebp-4],eax
5eb3e0cd 8b451c mov eax,dword ptr [ebp+1Ch]
5eb3e0d0 8365d000 and dword ptr [ebp-30h],0
5eb3e0d4 53 push ebx
5eb3e0d5 56 push esi
5eb3e0d6 8b7508 mov esi,dword ptr [ebp+8]
5eb3e0d9 57 push edi
5eb3e0da 8bf9 mov edi,ecx
5eb3e0dc 8945d8 mov dword ptr [ebp-28h],eax
5eb3e0df 897dd4 mov dword ptr [ebp-2Ch],edi
5eb3e0e2 8d4f08 lea ecx,[edi+8]
5eb3e0e5 c707bc19706b mov dword ptr [edi],6B7019BCh
5eb3e0eb e80bc5ffff call chrome!net::HpackHuffmanTable::HpackHuffmanTable (5eb3a5fb)
5eb3e0f0 8d5f38 lea ebx,[edi+38h]
5eb3e0f3 56 push esi
5eb3e0f4 8bcb mov ecx,ebx
崩溃在读取这个6BCFD040h地址违例。
但是ConnectJob的构造函数是这样的:
ConnectJob::ConnectJob(const std::string& group_name,
base::TimeDelta timeout_duration,
RequestPriority priority,
Delegate* delegate,
const BoundNetLog& net_log)
: group_name_(group_name),
timeout_duration_(timeout_duration),
priority_(priority),
delegate_(delegate),
net_log_(net_log),
idle_(true) {
DCHECK(!group_name.empty());
DCHECK(delegate);
net_log.BeginEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB,
NetLog::StringCallback("group_name", &group_name_));
}
似乎也没有读取全局变量的操作,那么问题来了,这个6BCFD040h地址究竟是什么变量呢?
真相在函数的最后:
5eb3e16c 8b4dfc mov ecx,dword ptr [ebp-4]
5eb3e16f 8bc6 mov eax,esi
5eb3e171 5f pop edi
5eb3e172 5e pop esi
5eb3e173 33cd xor ecx,ebp
5eb3e175 5b pop ebx
5eb3e176 e8b02ff0ff call chrome!__security_check_cookie (5ea4112b)
函数开始的时候,将6BCFD040h值赋予ebp-4,函数退出的时候检测该值,判断缓冲区是否溢出。
chrome!net::ConnectJob::ConnectJob:
5eb3e0bd 55 push ebp
5eb3e0be 8bec mov ebp,esp
5eb3e0c0 83ec30 sub esp,30h
5eb3e0c3 a140d0cf6b mov eax,dword ptr ds:[6BCFD040h]
5eb3e0c8 33c5 xor eax,ebp
5eb3e0ca 8945fc mov dword ptr [ebp-4],eax
5eb3e0cd 8b451c mov eax,dword ptr [ebp+1Ch]
5eb3e0d0 8365d000 and dword ptr [ebp-30h],0
5eb3e0d4 53 push ebx
5eb3e0d5 56 push esi
5eb3e0d6 8b7508 mov esi,dword ptr [ebp+8]
5eb3e0d9 57 push edi
5eb3e0da 8bf9 mov edi,ecx
5eb3e0dc 8945d8 mov dword ptr [ebp-28h],eax
5eb3e0df 897dd4 mov dword ptr [ebp-2Ch],edi
5eb3e0e2 8d4f08 lea ecx,[edi+8]
5eb3e0e5 c707bc19706b mov dword ptr [edi],6B7019BCh
5eb3e0eb e80bc5ffff call chrome!net::HpackHuffmanTable::HpackHuffmanTable (5eb3a5fb)
5eb3e0f0 8d5f38 lea ebx,[edi+38h]
5eb3e0f3 56 push esi
5eb3e0f4 8bcb mov ecx,ebx
崩溃在读取这个6BCFD040h地址违例。
但是ConnectJob的构造函数是这样的:
ConnectJob::ConnectJob(const std::string& group_name,
base::TimeDelta timeout_duration,
RequestPriority priority,
Delegate* delegate,
const BoundNetLog& net_log)
: group_name_(group_name),
timeout_duration_(timeout_duration),
priority_(priority),
delegate_(delegate),
net_log_(net_log),
idle_(true) {
DCHECK(!group_name.empty());
DCHECK(delegate);
net_log.BeginEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB,
NetLog::StringCallback("group_name", &group_name_));
}
似乎也没有读取全局变量的操作,那么问题来了,这个6BCFD040h地址究竟是什么变量呢?
真相在函数的最后:
5eb3e16c 8b4dfc mov ecx,dword ptr [ebp-4]
5eb3e16f 8bc6 mov eax,esi
5eb3e171 5f pop edi
5eb3e172 5e pop esi
5eb3e173 33cd xor ecx,ebp
5eb3e175 5b pop ebx
5eb3e176 e8b02ff0ff call chrome!__security_check_cookie (5ea4112b)
函数开始的时候,将6BCFD040h值赋予ebp-4,函数退出的时候检测该值,判断缓冲区是否溢出。
相关文章推荐
- C++重载操作符
- C语言学习之关键字第四讲
- 在oc语言中字符串和整型数相互转换
- 学习笔记(六):C++串口连接
- 值得推荐的C/C++框架和库 (真的很强大)
- 线程安全单例模式(C++)
- c语言,java类型转换时遇到的大小端问题
- Sicily 1325. Digit Generator
- 日志 c/c++ 正则表达式 regex
- 【C语言提高40】结构体套一级指针和二级指针
- 【C语言提高38】结构体套一级指针
- C语言:关于字符串的编程题
- Sicily 1129. ISBN
- 【C语言提高37】结构体做函数参数进阶
- C语言:利用排序二叉树进行排序
- C++/STL Bitset (转)
- 半夜来一发C语言gdbm数据库基本操作
- C++之学习记录1
- STL编程题2(C++程序设计第8周)
- c++ 简易文件读写操作