首页
社区
课程
招聘
__security_cookie/__security_check_cookie 作用等若干疑问
发表于: 2011-9-21 20:15 10315

__security_cookie/__security_check_cookie 作用等若干疑问

2011-9-21 20:15
10315
0:000> uf IsTheSameDir 
*** WARNING: Unable to verify checksum for BWChess.exe 
BWChess!IsTheSameDir [d:\testproject\bwchess\bwchess.cpp @ 77]: 
   77 00401020 55              push    ebp 
   77 00401021 8bec            mov     ebp,esp 
   77 00401023 6aff            push    0FFFFFFFFh 
   77 00401025 68d62c4000      push    offset BWChess!controlfp+0x20 (00402cd6) 
   77 0040102a 64a100000000    mov     eax,dword ptr fs:[00000000h] 
   77 00401030 50              push    eax 
   77 00401031 64892500000000  mov     dword ptr fs:[0],esp 
   77 00401038 81ec28020000    sub     esp,228h 
   77 0040103e [B]a138434000[/B]      mov     eax,dword ptr [BWChess!__security_cookie (00404338)] 
   77 00401043 33c5            xor     eax,ebp 
   77 00401045 8945ec          mov     dword ptr [ebp-14h],eax 
   77 00401048 57              push    edi 
   78 00401049 8b450c          mov     eax,dword ptr [ebp+0Ch] 
   78 0040104c 3b0560434000    cmp     eax,dword ptr [BWChess!g_hModule (00404360)] 
   78 00401052 7507            jne     BWChess!IsTheSameDir+0x3b (0040105b) 

BWChess!IsTheSameDir+0x34 [d:\testproject\bwchess\bwchess.cpp @ 79]: 
   79 00401054 33c0            xor     eax,eax 
   79 00401056 e90b010000      jmp     BWChess!IsTheSameDir+0x146 (00401166) 

BWChess!IsTheSameDir+0x3b [d:\testproject\bwchess\bwchess.cpp @ 81]: 
   81 0040105b 66c785e4fdffff0000 mov   word ptr [ebp-21Ch],0 
   81 00401064 b981000000      mov     ecx,81h 
   81 00401069 33c0            xor     eax,eax 
   81 0040106b 8dbde6fdffff    lea     edi,[ebp-21Ah] 
   81 00401071 f3ab            rep stos dword ptr es:[edi] 
   81 00401073 66ab            stos    word ptr es:[edi] 
   83 00401075 8d8de4fdffff    lea     ecx,[ebp-21Ch] 
   83 0040107b 51              push    ecx 
   83 0040107c 6804010000      push    104h 
   83 00401081 ff5510          call    dword ptr [ebp+10h] 
   83 00401084 8945f0          mov     dword ptr [ebp-10h],eax 
   85 00401087 8b5508          mov     edx,dword ptr [ebp+8] 
   85 0040108a 52              push    edx 
   85 0040108b 8d8de0fdffff    lea     ecx,[ebp-220h] 
   85 00401091 e85a050000      call    BWChess!ATL::CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > >::CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > > (004015f0) 
   85 00401096 c745fc00000000  mov     dword ptr [ebp-4],0 
   86 0040109d 8d85e4fdffff    lea     eax,[ebp-21Ch] 
   86 004010a3 50              push    eax 
   86 004010a4 8d8de0fdffff    lea     ecx,[ebp-220h] 
   86 004010aa e8f1050000      call    BWChess!ATL::CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > >::CompareNoCase (004016a0) 
   86 004010af 85c0            test    eax,eax 
   86 004010b1 7527            jne     BWChess!IsTheSameDir+0xba (004010da) 

BWChess!IsTheSameDir+0x93 [d:\testproject\bwchess\bwchess.cpp @ 87]: 
   87 004010b3 c785dcfdffff00000000 mov dword ptr [ebp-224h],0 
   87 004010bd c745fcffffffff  mov     dword ptr [ebp-4],0FFFFFFFFh 
   87 004010c4 8d8de0fdffff    lea     ecx,[ebp-220h] 
   87 004010ca e891050000      call    BWChess!ATL::CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > >::~CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > > (00401660) 
   87 004010cf 8b85dcfdffff    mov     eax,dword ptr [ebp-224h] 
   87 004010d5 e98c000000      jmp     BWChess!IsTheSameDir+0x146 (00401166) 

BWChess!IsTheSameDir+0xba [d:\testproject\bwchess\bwchess.cpp @ 89]: 
   89 004010da 6a5c            push    5Ch 
   89 004010dc 8d8de0fdffff    lea     ecx,[ebp-220h] 
   89 004010e2 e809060000      call    BWChess!ATL::CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > >::ReverseFind (004016f0) 
   89 004010e7 50              push    eax 
   89 004010e8 8d8dd8fdffff    lea     ecx,[ebp-228h] 
   89 004010ee 51              push    ecx 
   89 004010ef 8d8de0fdffff    lea     ecx,[ebp-220h] 
   89 004010f5 e866060000      call    BWChess!ATL::CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > >::Left (00401760) 
   89 004010fa 8985d0fdffff    mov     dword ptr [ebp-230h],eax 
   89 00401100 8b95d0fdffff    mov     edx,dword ptr [ebp-230h] 
   89 00401106 8995ccfdffff    mov     dword ptr [ebp-234h],edx 
   89 0040110c c645fc01        mov     byte ptr [ebp-4],1 
   89 00401110 8b85ccfdffff    mov     eax,dword ptr [ebp-234h] 
   89 00401116 50              push    eax 
   89 00401117 8d8de0fdffff    lea     ecx,[ebp-220h] 
   89 0040111d e85e050000      call    BWChess!ATL::CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > >::operator= (00401680) 
   89 00401122 c645fc00        mov     byte ptr [ebp-4],0 
   89 00401126 8d8dd8fdffff    lea     ecx,[ebp-228h] 
   89 0040112c e82f050000      call    BWChess!ATL::CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > >::~CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > > (00401660) 
   91 00401131 8d8de4fdffff    lea     ecx,[ebp-21Ch] 
   91 00401137 51              push    ecx 
   91 00401138 8d8de0fdffff    lea     ecx,[ebp-220h] 
   91 0040113e e85d050000      call    BWChess!ATL::CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > >::CompareNoCase (004016a0) 
   91 00401143 f7d8            neg     eax 
   91 00401145 1bc0            sbb     eax,eax 
   91 00401147 40              inc     eax 
   91 00401148 8985d4fdffff    mov     dword ptr [ebp-22Ch],eax 
   91 0040114e c745fcffffffff  mov     dword ptr [ebp-4],0FFFFFFFFh 
   91 00401155 8d8de0fdffff    lea     ecx,[ebp-220h] 
   91 0040115b e800050000      call    BWChess!ATL::CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > >::~CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > > (00401660) 
   91 00401160 8b85d4fdffff    mov     eax,dword ptr [ebp-22Ch] 

BWChess!IsTheSameDir+0x146 [d:\testproject\bwchess\bwchess.cpp @ 94]: 
   94 00401166 8b4df4          mov     ecx,dword ptr [ebp-0Ch] 
   94 00401169 64890d00000000  mov     dword ptr fs:[0],ecx 
   94 00401170 5f              pop     edi 
   94 00401171 8b4dec          mov     ecx,dword ptr [ebp-14h] 
   94 00401174 33cd            xor     ecx,ebp 
   94 [I]00401176[/I] e8[B]63160000[/B]      call    BWChess!__security_check_cookie (004027de) 
   94 [B]0040117b[/B] 8be5            mov     esp,ebp 
   94 0040117d 5d              pop     ebp 
   94 0040117e c3              ret 
0:000> uf searching 
BWChess!Searching [d:\testproject\bwchess\bwchess.cpp @ 157]: 
  157 004011f0 55              push    ebp 
  157 004011f1 8bec            mov     ebp,esp 
  157 004011f3 b848120000      mov     eax,1248h 
  157[B] 004011f8[/B] e8[B]03160000[/B]      call    BWChess!_chkstk (00402800) 
  157[B] 004011fd[/B] a138434000      mov     eax,dword ptr [BWChess!__security_cookie (00404338)] 
  157 00401202 33c5            xor     eax,ebp 
  157 00401204 8945e4          mov     dword ptr [ebp-1Ch],eax 
  158 00401207 837d0800        cmp     dword ptr [ebp+8],0 
  158 0040120b 7406            je      BWChess!Searching+0x23 (00401213) 

BWChess!Searching+0x1d [d:\testproject\bwchess\bwchess.cpp @ 158]: 
  158 0040120d 837d0c00        cmp     dword ptr [ebp+0Ch],0 
  158 00401211 7507            jne     BWChess!Searching+0x2a (0040121a) 

BWChess!Searching+0x23 [d:\testproject\bwchess\bwchess.cpp @ 159]: 
  159 00401213 33c0            xor     eax,eax 
  159 00401215 e9c1010000      jmp     BWChess!Searching+0x1eb (004013db) 

BWChess!Searching+0x2a [d:\testproject\bwchess\bwchess.cpp @ 161]: 
  161 0040121a 837d1000        cmp     dword ptr [ebp+10h],0 
  161 0040121e 7507            jne     BWChess!Searching+0x37 (00401227) 

BWChess!Searching+0x30 [d:\testproject\bwchess\bwchess.cpp @ 162]: 
  162 00401220 33c0            xor     eax,eax 
  162 00401222 e9b4010000      jmp     BWChess!Searching+0x1eb (004013db) 

BWChess!Searching+0x37 [d:\testproject\bwchess\bwchess.cpp @ 165]: 
  165 00401227 c745ec00000000  mov     dword ptr [ebp-14h],0 
  167 0040122e 683c010000      push    13Ch 
  167 00401233 8b4510          mov     eax,dword ptr [ebp+10h] 
  167 00401236 50              push    eax 
  167 00401237 ff5508          call    dword ptr [ebp+8] 
  167 0040123a 83c408          add     esp,8 
  167 0040123d 8945f0          mov     dword ptr [ebp-10h],eax 
  168 00401240 687a010000      push    17Ah 
  168 00401245 8b4d10          mov     ecx,dword ptr [ebp+10h] 
  168 00401248 51              push    ecx 
  168 00401249 ff5508          call    dword ptr [ebp+8] 
  168 0040124c 83c408          add     esp,8 
  168 0040124f 8945e8          mov     dword ptr [ebp-18h],eax 
  169 00401252 6848020000      push    248h 
  169 00401257 8b5510          mov     edx,dword ptr [ebp+10h] 
  169 0040125a 52              push    edx 
  169 0040125b ff5508          call    dword ptr [ebp+8] 
  169 0040125e 83c408          add     esp,8 
  169 00401261 8985ccefffff    mov     dword ptr [ebp-1034h],eax 
  170 00401267 683b010000      push    13Bh 
  170 0040126c 8b4510          mov     eax,dword ptr [ebp+10h] 
  170 0040126f 50              push    eax 
  170 00401270 ff5508          call    dword ptr [ebp+8] 
  170 00401273 83c408          add     esp,8 
  170 00401276 8985c4efffff    mov     dword ptr [ebp-103Ch],eax 
  171 0040127c 66c745d05000    mov     word ptr [ebp-30h],50h 
  171 00401282 66c745d25300    mov     word ptr [ebp-2Eh],53h 
  171 00401288 66c745d44100    mov     word ptr [ebp-2Ch],41h 
  171 0040128e 66c745d65000    mov     word ptr [ebp-2Ah],50h 
  171 00401294 66c745d84900    mov     word ptr [ebp-28h],49h 
  171 0040129a 66c745da2e00    mov     word ptr [ebp-26h],2Eh 
  171 004012a0 66c745dc4400    mov     word ptr [ebp-24h],44h 
  171 004012a6 66c745de4c00    mov     word ptr [ebp-22h],4Ch 
  171 004012ac 66c745e04c00    mov     word ptr [ebp-20h],4Ch 
  171 004012b2 66c745e20000    mov     word ptr [ebp-1Eh],0 
  172 004012b8 8d4dd0          lea     ecx,[ebp-30h] 
  172 004012bb 51              push    ecx 
  172 004012bc ff95ccefffff    call    dword ptr [ebp-1034h] 
  172 004012c2 8945f4          mov     dword ptr [ebp-0Ch],eax 
  174 004012c5 837df400        cmp     dword ptr [ebp-0Ch],0 
  174 004012c9 7507            jne     BWChess!Searching+0xe2 (004012d2) 

BWChess!Searching+0xdb [d:\testproject\bwchess\bwchess.cpp @ 175]: 
  175 004012cb 33c0            xor     eax,eax 
  175 004012cd e909010000      jmp     BWChess!Searching+0x1eb (004013db) 

BWChess!Searching+0xe2 [d:\testproject\bwchess\bwchess.cpp @ 177]: 
  177 004012d2 6a05            push    5 
  177 004012d4 8b55f4          mov     edx,dword ptr [ebp-0Ch] 
  177 004012d7 52              push    edx 
  177 004012d8 ff5508          call    dword ptr [ebp+8] 
  177 004012db 83c408          add     esp,8 
  177 004012de 8945f8          mov     dword ptr [ebp-8],eax 
  179 004012e1 6a10            push    10h 
  179 004012e3 8b45f4          mov     eax,dword ptr [ebp-0Ch] 
  179 004012e6 50              push    eax 
  179 004012e7 ff5508          call    dword ptr [ebp+8] 
  179 004012ea 83c408          add     esp,8 
  179 004012ed 8985c8efffff    mov     dword ptr [ebp-1038h],eax 
  180 004012f3 c745fc00000000  mov     dword ptr [ebp-4],0 
  181 004012fa 8d4dec          lea     ecx,[ebp-14h] 
  181 004012fd 51              push    ecx 
  181 004012fe 6800100000      push    1000h 
  181 00401303 8d95d0efffff    lea     edx,[ebp-1030h] 
  181 00401309 52              push    edx 
  181 0040130a ff55f0          call    dword ptr [ebp-10h] 
  181 0040130d 50              push    eax 
  181 0040130e ff55f8          call    dword ptr [ebp-8] 
  181 00401311 85c0            test    eax,eax 
  181 00401313 0f84bd000000    je      BWChess!Searching+0x1e6 (004013d6) 

BWChess!Searching+0x129 [d:\testproject\bwchess\bwchess.cpp @ 183]: 
  183 00401319 c785c0efffff00000000 mov dword ptr [ebp-1040h],0 
  183 00401323 eb0f            jmp     BWChess!Searching+0x144 (00401334) 

BWChess!Searching+0x135 [d:\testproject\bwchess\bwchess.cpp @ 183]: 
  183 00401325 8b85c0efffff    mov     eax,dword ptr [ebp-1040h] 
  183 0040132b 83c001          add     eax,1 
  183 0040132e 8985c0efffff    mov     dword ptr [ebp-1040h],eax 

BWChess!Searching+0x144 [d:\testproject\bwchess\bwchess.cpp @ 183]: 
  183 00401334 8b4dec          mov     ecx,dword ptr [ebp-14h] 
  183 00401337 c1e902          shr     ecx,2 
  183 0040133a 398dc0efffff    cmp     dword ptr [ebp-1040h],ecx 
  183 00401340 0f8390000000    jae     BWChess!Searching+0x1e6 (004013d6) 

BWChess!Searching+0x156 [d:\testproject\bwchess\bwchess.cpp @ 188]: 
  188 00401346 6808020000      push    208h 
  188 0040134b 8d95b8edffff    lea     edx,[ebp-1248h] 
  188 00401351 52              push    edx 
  188 00401352 8b85c0efffff    mov     eax,dword ptr [ebp-1040h] 
  188 00401358 8b8c85d0efffff  mov     ecx,dword ptr [ebp+eax*4-1030h] 
  188 0040135f 51              push    ecx 
  188 00401360 ff55f0          call    dword ptr [ebp-10h] 
  188 00401363 50              push    eax 
  188 00401364 ff95c8efffff    call    dword ptr [ebp-1038h] 
  188 0040136a 85c0            test    eax,eax 
  188 0040136c 7463            je      BWChess!Searching+0x1e1 (004013d1) 

BWChess!Searching+0x17e [d:\testproject\bwchess\bwchess.cpp @ 191]: 
  191 0040136e 8b95c4efffff    mov     edx,dword ptr [ebp-103Ch] 
  191 00401374 52              push    edx 
  191 00401375 8b85c0efffff    mov     eax,dword ptr [ebp-1040h] 
  191 0040137b 8b8c85d0efffff  mov     ecx,dword ptr [ebp+eax*4-1030h] 
  191 00401382 51              push    ecx 
  191 00401383 8d95b8edffff    lea     edx,[ebp-1248h] 
  191 00401389 52              push    edx 
  191 0040138a ff5520          call    dword ptr [ebp+20h] 
  191 0040138d 83c40c          add     esp,0Ch 
  191 00401390 85c0            test    eax,eax 
  191 00401392 743d            je      BWChess!Searching+0x1e1 (004013d1) 

BWChess!Searching+0x1a4 [d:\testproject\bwchess\bwchess.cpp @ 192]: 
  192 00401394 8b4514          mov     eax,dword ptr [ebp+14h] 
  192 00401397 8b08            mov     ecx,dword ptr [eax] 
  192 00401399 8b551c          mov     edx,dword ptr [ebp+1Ch] 
  192 0040139c 8d048a          lea     eax,[edx+ecx*4] 
  192 0040139f 50              push    eax 
  192 004013a0 8b4d14          mov     ecx,dword ptr [ebp+14h] 
  192 004013a3 8b11            mov     edx,dword ptr [ecx] 
  192 004013a5 8b4518          mov     eax,dword ptr [ebp+18h] 
  192 004013a8 8d0c90          lea     ecx,[eax+edx*4] 
  192 004013ab 51              push    ecx 
  192 004013ac 8b95c0efffff    mov     edx,dword ptr [ebp-1040h] 
  192 004013b2 8b8495d0efffff  mov     eax,dword ptr [ebp+edx*4-1030h] 
  192 004013b9 50              push    eax 
  192 004013ba ff550c          call    dword ptr [ebp+0Ch] 
  192 004013bd 83c40c          add     esp,0Ch 
  192 004013c0 85c0            test    eax,eax 
  192 004013c2 740d            je      BWChess!Searching+0x1e1 (004013d1) 

BWChess!Searching+0x1d4 [d:\testproject\bwchess\bwchess.cpp @ 194]: 
  194 004013c4 8b4d14          mov     ecx,dword ptr [ebp+14h] 
  194 004013c7 8b11            mov     edx,dword ptr [ecx] 
  194 004013c9 83c201          add     edx,1 
  194 004013cc 8b4514          mov     eax,dword ptr [ebp+14h] 
  194 004013cf 8910            mov     dword ptr [eax],edx 

BWChess!Searching+0x1e1 [d:\testproject\bwchess\bwchess.cpp @ 197]: 
  197 004013d1 e94fffffff      jmp     BWChess!Searching+0x135 (00401325) 

BWChess!Searching+0x1e6 [d:\testproject\bwchess\bwchess.cpp @ 201]: 
  201 004013d6 b801000000      mov     eax,1 

BWChess!Searching+0x1eb [d:\testproject\bwchess\bwchess.cpp @ 202]: 
  202 004013db 8b4de4          mov     ecx,dword ptr [ebp-1Ch] 
  202 004013de 33cd            xor     ecx,ebp 
  202 [B]004013e0[/B] e8[B]f9130000 [/B]     call    BWChess!__security_check_cookie (004027de) 
  202 [B]004013e5[/B] 8be5            mov     esp,ebp 
  202 004013e7 5d              pop     ebp 
  202 004013e8 c3              ret


上面是自己写的一段函数的反汇编程序, 主要函数名字叫 Searching(...)
它的参数是kernel32.dll的handle, 然后通过查询pe导出函数表,来获得例如loadlibrary() / getprocaddr() 等函数地址, 
函数中会主动家在psapi.dll, 然后同样是查询pe导出表 获得 psapi.dll 里面枚举但前进程加载模块的句柄的函数  EnumProcessModules, 获得所有加载的dll句柄后,就会到我想要做的:
   1, Searching是在我的dll(下面就叫mydll.dll) 中,我的dll会有两个导出函数
   2, 同样,在和mydll.dll同目录下,也会有很多dll
   3, 目的就是想获得mydll.dll以外dlls的两个导出函数地址

结果:
  1, c++直接写完,没有问题 能够获得地址
  2, 我将上述Searching的机器码放入 char数组 chsch[]中( Searching 中我自己写的函数调用全部是由函数指针实现), 然后调用chsch, 结果crash
  2.1 仔细一看,发现vc给我自动加入了几个函数调用:
        _chkstk, __security_cookie 和 __security_check_cookie

  2.2 解决尝试1, 首先将上面对应的机器码从数组中删除, 运行 发现正常结束,但是中间的api调用和预期结果不一样导致获取导出函数失败
  
  2.2 解决尝试2, 反汇编_chkstk, 发现它自身函数很短,且不存在再次调用, 直接将其对应机器码放入char数组chkstk1[], 然后发现另一个函数IsTheSameDir 也会调用__security_cookie 和 __security_check_cookie, 这样问题就使要对chsch[]中
157 004011f3 b848120000      mov     eax,1248h 
  157[B] 004011f8[/B] e8[B]03160000[/B]      call    BWChess!_chkstk (00402800) 
  157[B] 004011fd[/B] a138434000      mov     eax,dword ptr [BWChess!__security_cookie (00404338)] 
 和 
202 [B]004013e0[/B] e8[B]f9130000 [/B]     call    BWChess!__security_check_cookie (004027de) 
对应部分进行重定位, 由于IsTheSameDir 在编译选项固定的情况下生成的机器码固定所以可以根据其函数起始地址加固定的偏移获得
__security_cookie
 和 __security_check_cookie 的地址, 然后运算成chsch对应位置的偏移
 2.2的结果: 代码正常退出但是我要的结果没出现, chsch在中间执行类似EnumProcessModules 时失败退出。

现在我的问题是:
1, 
__security_cookie
 和 
__security_check_cookie 
的作用是什么,他们会导致中间api的结果么?

2, 我计算e8 call 的方法:
     
157[B] 004011f8[/B] e8[B][U]03160000[/U][/B]      call    BWChess!_chkstk ([U]00402800[/U]) 
157[B] [U]004011fd[/U][/B] a138434000      mov     eax,dword ptr 


00402800 = 004011fd + 00001603
则反过来需要填充 00001603则需要用减法, 如:
void Relocate(void* pfnissame, void* pfnsch) 
{ 
        DWORD* phead = (DWORD*)(((BYTE*)pfnissame) + 0x1f); 
        DWORD* phead2 = (DWORD*)(((BYTE*)pfnsch) + 0x0e); 
        *phead2 = *phead; 

        DWORD dwPos = (DWORD)(((BYTE*)pfnissame) + 0x15b); 
        DWORD* dwVal = (DWORD*)(((BYTE*)pfnissame) + 0x157); 


        DWORD dwPos2 = (DWORD)(((BYTE*)pfnissame) + 0x1eb + 0xa); 
        DWORD* dwVal2 = (DWORD*)(((BYTE*)pfnissame) + 0x1eb + 6); 

        *dwVal2 = dwPos + *dwVal - dwPos2; 

}

  不知这样算对不对?

 3, 最后一个疑惑就是反汇编Searching的时候遇到跳转指令如:
       
  192 004013c2 740d            je      BWChess!Searching+[B]0x1e1[/B] (004013d1) 

       等到反汇编chsch时就可能变成了:
      
740d            je      BWChess!chsch+[B]0x1e3[/B]

      chsch其实就是Searching的完整拷贝,怎么算出来的偏移不一致呢?

其实本来是作的一次活动需要写点儿算法,本来想偷机取巧搞点儿花样,没想到遇到这些问题,搞了许久问题也没解决,希望各位有经验的大侠指点一二

谢谢

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
cookie 是个值,check_cookie是个函数,check 失败直接__report_gsfailure。看下这个:http://user.qzone.qq.com/31731705/blog/1304480303

另外,你可以使用VC的编译选项去掉cookie和_chkstk的检查,把这些无关的代码去掉,再试试。
2011-9-21 21:00
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
我把_chkstk 和 cookie 相关的代码去掉后 运行是可以的 但是结果就和c++ 原生build出来的不一样
2011-9-21 22:03
0
雪    币: 77
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
在微软的c/c++ 编译器中,增加了对于栈溢出进行检测的参数 “/GS”,在调试shellcode 的时候,发现vs2005 产生的code 和 vc6 产生的code 有些不同,才让我注意到这个问题。

     写了这样的一个测试程序:

     void foo(const char * datas)

     {

       char szbuf[32];

        strcpy(szbuf, datas);

     }

     汇编的代码如下:

00411F70  push        ebp  

00411F71  mov         ebp,esp

00411F73  sub         esp,0ECh

00411F79  push        ebx  

00411F7A  push        esi  

00411F7B  push        edi  

00411F7C  lea         edi,[ebp-0ECh]

00411F82  mov         ecx,3Bh

00411F87  mov         eax,0CCCCCCCCh ;0x0c is equal to the machine code of int3

00411F8C  rep stos    dword ptr es:[edi]

00411F8E  mov         eax,dword ptr [___security_cookie (419004h)]

00411F93  xor         eax,ebp

00411F95  mov         dword ptr [ebp-4],eax

00411F98  mov         eax,dword ptr [ebp+8]

00411F9B  push        eax  

00411F9C  lea         ecx,[ebp-28h]

00411F9F  push        ecx  

00411FA0  call        @ILT+625(_strcpy) (411276h)

00411FA5  add         esp,8 ; strcpy's call conversation is __cdecl, so the caller should help callee cleanup stack

00411FA8  push        edx  

00411FA9  mov         ecx,ebp ; pass the stack top by ecx

00411FAB  push        eax  

00411FAC  lea         edx,[ (411FD8h)] ; pointer to a _RTC_framedesc structure

00411FB2  call        @ILT+195(@_RTC_CheckStackVars@8) (4110C8h)

00411FB7  pop         eax  

00411FB8  pop         edx  

00411FB9  pop         edi  

00411FBA  pop         esi  

00411FBB  pop         ebx  

00411FBC  mov         ecx,dword ptr [ebp-4]

00411FBF  xor         ecx,ebp

00411FC1  call        @ILT+45(@__security_check_cookie@4) (411032h)

00411FC6  add         esp,0ECh

00411FCC  cmp         ebp,esp

00411FCE  call        @ILT+430(__RTC_CheckEsp) (4111B3h)

00411FD3  mov         esp,ebp

00411FD5  pop         ebp  

00411FD6  ret              

00411FD7  nop              

00411FD8  db          01h  

00411FD9  db          00h  

00411FDA  db          00h  

00411FDB  db          00h  

00411FDC  db          e0h  

00411FDD  db          1fh  

00411FDE  db          41h  

00411FDF  db          00h  

00411FE0  db          d8h  

00411FE1  db          ffh  

00411FE2  db          ffh  

00411FE3  db          ffh  

00411FE4  db          20h  

00411FE5  db          00h  

00411FE6  db          00h  

00411FE7  db          00h  

00411FE8  db          ech  

00411FE9  db          1fh  

00411FEA  db          41h  

00411FEB  db          00h  

00411FEC  db          62h  

00411FED  db          75h  

00411FEE  db          66h  

00411FEF  db          66h  

00411FF0  db          65h  

00411FF1  db          72h  

00411FF2  db          00h  

    从程序可以看出在函数被调用之后,在正确的把ebp压入stack 之后,把当前的esp存储到ebp 中,在往下就是这个函数体自身需要的stack 空间了,微软的编译器会在debug 版本的程序中,在每一个函数的堆栈顶分配一定数目的空间,把int3的机器码写入,这样做的目的是可以防止程序跑飞,如果程序跑飞,且eip落入这个空间,那么取出的指令都是int 3,从而能程序被中断。

    ___security_cookie 变量是一个 UINT_PTR 类型的数值,这个数值应该被编译到bufferoverflowU.lib 这个库中,数值的初始值定义如下:

#ifdef _WIN64

#define DEFAULT_SECURITY_COOKIE 0x00002B992DDFA232

#else  /* _WIN64 */

#define DEFAULT_SECURITY_COOKIE 0xBB40E64E

#endif  /* _WIN64 */

DECLSPEC_SELECTANY UINT_PTR __security_cookie = DEFAULT_SECURITY_COOKIE;

    函数在取到该值之后,会和当前的ebp 相异或(xor),异或的值保持在stack 的顶部。在函数的体被执行完成之后,__security_check_cookie 会被调用,来检测security cookie 是否被修改过,__security_check_cookie 函数需要一个参数,不过这个参数没有使用,函数中,只是把ecx 的值和 _security_cookie 的值相比较,看看是否相同,如果不相同则认定为stack overflow。从上面的汇编代码可以看出在调用_security_check_cookie 之前,就把_security_cookie 的值取到ecx 中,且与ebp 进行异或(xor)操作。这样通常能够很好的防范stack 的overflow,通常的exploit code 都要覆盖函数的返回地址,而覆盖过程中写入的stack 的值是基本不会等于(__security_cookie & ebp ) 的值。

    其实在调用 _security_check_cookie 函数之前,还调用了函数 _RTC_CheckStackVars,这个函数的原型是:

    void   __fastcall _RTC_CheckStackVars(void *_Esp, _RTC_framedesc *_Fd);

    其中_RTC_framedesc 结构为 :

    typedef struct _RTC_framedesc {

        int varCount;

        _RTC_vardesc *variables;

    } _RTC_framedesc;

    _RTC_vardesc 的结构为:RTC 可能是run time check 的缩写,而 vardesc 可能是 variable descritpion 的缩写

     typedef struct _RTC_vardesc {

        int addr;

        int size;

        char *name;

    } _RTC_vardesc;

  _RTC_CheckStackVars 的汇编代码如下:

004122D0  push        ebp  

004122D1  mov         ebp,esp

004122D3  push        ecx  

004122D4  push        ebx  

004122D5  push        esi  

004122D6  push        edi  

004122D7  xor         edi,edi

004122D9  mov         esi,edx

004122DB  cmp         dword ptr [esi],edi ;比较是否有数组变量

004122DD  mov         ebx,ecx             ; 需要比较的堆栈顶是通过ecx 传递进来的,把这个值保持到 ebx

004122DF  mov         dword ptr [i],edi  ; i 应该是记录当前比较了几个 _RTC_vardesc

004122E2  jle         _RTC_CheckStackVars+58h (412328h)  ;如果没有,则不必检测了,程序跳转退出

004122E4  mov         eax,dword ptr [esi+4]              ;eax 指向_RTC_vardesc 结构

004122E7  mov         ecx,dword ptr [eax+edi]            ;ecx 为 _RTC_vardesc.addr 的值

004122EA  add         eax,edi

004122EC  cmp         dword ptr [ecx+ebx-4],0CCCCCCCCh   ; 根据addr 算出堆栈中的一个地址,addr 的来历不详

004122F4  jne         _RTC_CheckStackVars+34h (412304h)  ; 如果不是初始化的 0xCCCCCCCC ; 报错

004122F6  mov         edx,dword ptr [eax+4]

004122F9  add         edx,ecx

004122FB  cmp         dword ptr [edx+ebx],0CCCCCCCCh

00412302  je          _RTC_CheckStackVars+48h (412318h)

00412304  mov         eax,dword ptr [esi+4]

00412307  mov         ecx,dword ptr [eax+edi+8]

0041230B  mov         edx,dword ptr [ebp+4]

0041230E  push        ecx  

0041230F  push        edx  

00412310  call        _RTC_StackFailure (411127h)

00412315  add         esp,8

00412318  mov         eax,dword ptr [i]

0041231B  add         eax,1

0041231E  add         edi,0Ch

00412321  cmp         eax,dword ptr [esi]

00412323  mov         dword ptr [i],eax

00412326  jl          _RTC_CheckStackVars+14h (4122E4h)

00412328  pop         edi  

00412329  pop         esi  

0041232A  pop         ebx  

0041232B  mov         esp,ebp

0041232D  pop         ebp  

0041232E  ret   

     

        从函数的汇编代码可以看出虽然 CheckStackVars 需要两个参数,但是函数并没有使用这两个参数,而实际需要检测的数值,是通过edx、ecx 两个寄存器传递的,edx 指向一个_RTC_framedesc 的结构,ecx 指向函数的堆栈的顶部,可见编译器在每一个函数的结束处添加了一个_RTC_framedesc 的对象。

       _RTC_framedesc 结构,好在只是记录函数中用到的数组变量的情况。上面的 _RTC_framedesc 值为:

       _RTC_framedesc.varCount = 1;

       _RTC_framedesc.variables = 0x00411fe0

       _RTC_vardesc.addr = 0xFFFFFFD8  /* -40 */

       _RTC_vardesc.size = 0x00000020 /* buffer size is : 0x20 */

       _RTC_vardesc.name = 0x00411fec /* poiner to string 'buffer' */

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/free2o/archive/2008/06/20/2570168.aspx

看看上文希望对你有帮助
2011-9-21 23:46
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
我说的不是你手工去掉,我是说VC编译本身可以不产生这些code。
2011-9-22 12:46
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
那我就不明白了,手工去掉和通过配置选项去掉会对工作代码产生什么样的影响,
明天我把代码传上来,大家帮忙看下吧
2011-9-22 19:36
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
至少代码变小了,另外,跳转指令的offset不一样吧。
2011-9-22 21:16
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
谢谢, 我这里是release build 的啊,
还有问一下如何调试max speed 配置下的代码呢?
2011-9-22 21:36
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
编译选项中去掉cookie不会改变最终结果,
等我有空好好调试以下,到时把过程贴上来
2011-10-8 15:12
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
问题找到了, for(int i=0; i<???; ++i) 里面的临时变量i在shellcode里面被初始化成了非零值, 修改该shell code 就好了

如下

0x55,0xf8,0x85,0xc0,0x0f,0x84,0xbd,0x00,0x00,0x00,0xc7,0x85,0xc0,0xef,0xff,0xff,0x00,0x00,0x00/*eb*/,
0x00/*0f*/,0x8b,0x8d,0xc0,0xef,0xff,0xff,0x83,0xc1,0x01,0x89,0x8d,0xc0,0xef,0xff,0xff,0x8b,0x55,0xec,
0xc1,0xea,0x02,0x39,0x95,0xc0,0xef,0xff,0xff,0x0f,0x83,0x90,0x00,0x00,0x00,0x68,0x08,0x02,0x00,
0x00,0x8d,0x85,0xb8,0xed,0xff,0xff,0x50,0x8b,0x8d,0xc0,0xef,0xff,0xff,0x8b,0x94,0x8d,0xd0,0xef,
2011-11-10 20:10
0
雪    币: 376
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
VC2008 里用了数组 Release编译也被加上了 __security_check_cookier,不知道怎么才能在编译的时候去掉这个东西。。。
2012-4-7 17:07
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
编译选项里有可以去掉的函数,这两个函数的引入是因为你的函数里调用了一些api导致的
具体哪些会导致我就不清楚了
2012-4-8 17:52
0
雪    币: 435
活跃值: (1307)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
13
关掉gs选项?
2012-4-8 17:54
0
游客
登录 | 注册 方可回帖
返回
//