一行代码暴露你的C++水平

来源:互联网 发布:天知道 其犹张弓乎 编辑:程序博客网 时间:2024/06/06 07:43

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,函数退出的时候检测该值,判断缓冲区是否溢出。




0 0