x64 доступ к стеку DLL вне диапазона? - PullRequest
0 голосов
/ 10 мая 2018

я соберу x64 dll с vs2017

исходный код там

#include "stdafx.h"
#include <exception>  

#define _API_STDCALL extern "C" _declspec(dllexport)

#pragma pack (push)
#pragma pack (1)

typedef struct logRecdItem
{
    DWORD LSN;
    WORD dbId;
} *PlogRecdItem;
#pragma pack (pop)

INT64 CdbId = 0;

_API_STDCALL PVOID domyWork_2(UINT_PTR Xdes, UINT_PTR rawData) {

    WORD dbid = *(WORD*)(Xdes + 0x460);
    if (dbid > 0 && dbid < 64 && (((INT64)1 << (dbid - 1)) & CdbId))
    {           
        DWORD lsn = *(DWORD*)(Xdes + 0x32c);
        PlogRecdItem LR = (PlogRecdItem)malloc(sizeof(logRecdItem));
        //PlogRecdItem LR = new logRecdItem;
        LR->LSN = lsn;
        LR->dbId = dbid;
        return LR;
    }
    else
        return NULL;

}

когда я разобрал dll, я обнаружил очень интересную вещь.

000007FEFAD01000 | 40 57               | push rdi                       
000007FEFAD01002 | 48 83 EC 20         | sub rsp,20                     
000007FEFAD01006 | 0F B7 B9 60 04 00 00| movzx edi,word ptr ds:[rcx+460]
000007FEFAD0100D | 8D 47 FF            | lea eax,qword ptr ds:[rdi-1]   
000007FEFAD01010 | 66 83 F8 3E         | cmp ax,3E                      
000007FEFAD01014 | 77 3C               | ja dll1.7FEFAD01052            
000007FEFAD01016 | 0F B7 C7            | movzx eax,di                   
000007FEFAD01019 | FF C8               | dec eax                        
000007FEFAD0101B | 0F B6 D0            | movzx edx,al                   
000007FEFAD0101E | 48 8B 05 1B 20 00 00| mov rax,qword ptr ds:[<CdbId>] 
000007FEFAD01025 | 48 0F A3 D0         | bt rax,rdx                     
000007FEFAD01029 | 73 27               | jae dll1.7FEFAD01052           
000007FEFAD0102B | 48 89 5C 24 30      | mov qword ptr ss:[rsp+30],rbx  
000007FEFAD01030 | 8B 99 2C 03 00 00   | mov ebx,dword ptr ds:[rcx+32C] 
000007FEFAD01036 | B9 06 00 00 00      | mov ecx,6                      
000007FEFAD0103B | FF 15 47 10 00 00   | call qword ptr ds:[<&malloc>]  
000007FEFAD01041 | 89 18               | mov dword ptr ds:[rax],ebx     
000007FEFAD01043 | 48 8B 5C 24 30      | mov rbx,qword ptr ss:[rsp+30]  
000007FEFAD01048 | 66 89 78 04         | mov word ptr ds:[rax+4],di     
000007FEFAD0104C | 48 83 C4 20         | add rsp,20                     
000007FEFAD01050 | 5F                  | pop rdi                        
000007FEFAD01051 | C3                  | ret      

в строке "000007FEFAD01002" он выделяет 20 байт в стеке.

но "000007FEFAD0102B" записать в [rsp + 30]

Почему! ??

согласно моему пониманию [rsp + 30] принадлежит родительской функции

почему он доступен здесь?

1 Ответ

0 голосов
/ 10 мая 2018

Память на [rsp+30] зарезервирована для сохранения параметров, которые были переданы регистром. В этом случае регистр rbx содержит значение для rawData. Это сохраняется, регистр используется, затем значение восстанавливается до rbx до того, как функция вернется.

...