客户端安全开辟基础-PC篇-附项目源码

打印 上一主题 下一主题

主题 777|帖子 777|积分 2331

客户端安全开辟基础-PC篇

   

   
   written by noxke
  
项目源码下载

https://download.csdn.net/download/Runnymmede/90079718
1.步伐分析

使用ida打开crackme.exe,进入到步伐的主逻辑函数,注意到有大量的xmm寄存器,但是不含call指令,先忽略,注意到两个特殊部门:

左图中调用了CreateThread函数创建子线程运行StartAddress处函数,右侧含有分支判断,完成判断后sleep并返回,猜测该处与步伐的判断逻辑有关
F5查看反编译代码
末尾进行了数据串的比力,后根据比力结果为v32地点处的4个字节赋值,紧接着两个字节赋值0x0a,0x0d,换行回车符号,猜测v32地点处为输出字符串,结合测试时的输出错误,猜测0xCBF9DBB4 0x8FFFCBD5经过异或后为gbk编码格式的字符串,在线编码工具测试,猜测成立
显然,v37处储存的内容影响最后的输出结果,对v32=v37下断点启动调试,随意输入字符串后在该处断下,查看v32内容

显然, v37为输入的原内容,根据比力部门可以得知,v37-48处为flag

得到步伐flagHiGWDUuXQS6wVHBTp0ERfJe6VqprMqD1
分析剩余部门得到步伐的输入函数和输出函数,后续将称其为printf scanf

2.DLL注入分析

题目要求使用CreateRemoteThreadapi进行注入
   最基础的代码注入方式, 使用CreateRemoteThread在目标历程下创建远程线程, 调用LoadLibraryA加载DLL到目标历程, DLL加载/卸载时调用DllMain函数, 执行注入DLL中的代码, LoadLibraryA参数必要先写入目标历程的内存, 使用VirtualAllocEx在目标历程内存下分配内存, 使用WriteProcessMemory将必要注入的DLL地点写入目标内
  1. hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
  2. pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);
  3. WriteProcessMemory(hProcess, pRemoteBuf, dllPath, dwBufSize, NULL);
  4. hMod = GetModuleHandleA((LPCSTR)"kernel32.dll");
  5. pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "LoadLibraryA");
  6. CreateRemoteThread(hProcess, NULL, 0, pThreadProc, pRemoteBuf, 0, NULL);
复制代码
  创建远程线程时传入的LoadLibraryA地点并不是直接获取目标历程中的函数地点, 因为体系DLL在差异历程中加载地点相同
  编写一个输出字符串的DLL进行注入测试


注入creackme.exe失败,但注入其他步伐正常,重新分析代码,分析CreateThread函数创建的线程执行的StartAddress处代码,找到关键位置

此处将LoadLibraryExW函数的内存权限修改为可写入,然后将第一个字节patch成-61(0xC3, ret指令),将指令第一行修改为ret指令,将LoadLibraryExW函数patch掉了,因此LoadLibraryA函数也无法正常使用

不外中间有10秒的sleep,在启动后就注入即可

3.hook代码

将输出结果修改称正确,patch一下分支语句或者将错误的gbk编码patch成正确就可以,但是题目要求用DLL注入hook步伐,因此此处用注入的DLL修改步伐,hook掉printf函数,思路如下
   将printf前几行指令修改为跳转指令,跳转到注入的shellcode中,在shellcode中判断printf的参数(即待输出的字符串)是否为错误,如果为错误,将其修改为正确,更换完成后在shellcode中执行printf前几行被更换的指令,然后返回到printf函数继承执行,输出修改后的字符串
  printf修改前后代码:
修改前前4条指令为将寄存器参数压入堆栈,此处将其修改为
  1. mov eax, $shellcode
  2. push rax
  3. ret
复制代码
将shellcode的地点压入堆栈中,使用ret指令跳转到shellcode代码出,shellcode代码如下(前后填充的nop省略)
主要代码为
  1. mov eax, [rcx]         ; 将printf第一个参数(输出字符串)的前四个字节传送到eax
  2. cmp eax, 0xF3CEEDB4    ; 判断这四个字节是否为错误两个字的gbk编码
  3. jne $+0x8              ; 不是错误两个字的gbk编码则跳过接下来两条指令
  4. mov eax, 0xB7C8FDD5    ; 如果是错误两个字的gbk编码,将其修改为正确两个字的gbk编码
  5. mov [rcx], eax         ; 将这四个字节写回输出字符串,完成替换
  6. ;原printf函数前4条指令    ; 为printf完成参数压栈
  7. mov rax, $printf+0x20  ; printf的指令位置,跳过修改的代码
  8. push rax               ; push ret压栈返回
  9. ret
复制代码
只必要在注入的DLL中盘算printf的地点,将地点写入shellcode,将shellcode写入可执行内存,再hook掉printf的代码即可完成修改操作
设置hook代码如下:
  1. void set_hook()
  2. {
  3.     // hook printf函数
  4.     DWORD64 pProc;
  5.     DWORD64 pProcOffset = 0x1020;
  6.     HMODULE hModule = GetModuleHandle(nullptr);
  7.     DWORD_PTR baseAddress = reinterpret_cast<DWORD_PTR>(hModule);
  8.     pProc = (DWORD64)baseAddress + pProcOffset;
  9.     printf("\nhook proc addr : 0x%llx\n", pProc);
  10.     // 修改shellcode中的返回地址 printf+0x10
  11.     *((DWORD64 *)((uint8_t *)shellcode + 0x50 - 0x1A)) = (pProc + 0x10);
  12.     // 写入shellcode
  13.     LPVOID shellcodeBuf = VirtualAlloc(NULL, 0x50, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  14.     memcpy(shellcodeBuf, shellcode, 0x50);
  15.     DWORD64 dwShellcodeBuf = (DWORD64)shellcodeBuf;
  16.     printf("\nshell code addr : 0x%llx\n", dwShellcodeBuf);
  17.     // 修改函数内存保护权限
  18.     VirtualProtect((LPVOID)pProc, 20, PAGE_EXECUTE_READWRITE, NULL);
  19.     // 修改hookcode中的shellcode地址
  20.     *((DWORD64 *)((uint8_t *)hookcode + 6)) = dwShellcodeBuf;
  21.     // 获取进程句柄
  22.     HANDLE hProcess = GetCurrentProcess();
  23.     // hook printf函数
  24.     WriteProcessMemory(hProcess, (LPVOID)pProc, hookcode, 20, NULL);
  25. }
复制代码
由于PE文件加载时会进行重定向操作,所以printf函数的地点不固定,必要通过PE文件加载的基地点+函数偏移量得到printf函数的正确地点,另外shellcode必要申请可执行内存块确保指令可以正常执行,必要修改printf函数的内存块可写,修改其前几行指令
注入后运行步伐,恣意输入均返回正确


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81428

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表