当前位置: 首页 > wzjs >正文

专业网站设计建设服务域名收录

专业网站设计建设服务,域名收录,大鹏网站建设,wordpress会员注册模板引言 在网上搜索Windows平台的远程代码注入时,经常可以看到类似下面的代码,但在实际测试环节中,会发现以上代码执行时会出现目标进程崩溃的问题。 // 打开进程 HANDLE proc OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); // 申请可执行内…

引言

在网上搜索Windows平台的远程代码注入时,经常可以看到类似下面的代码,但在实际测试环节中,会发现以上代码执行时会出现目标进程崩溃的问题。

// 打开进程
HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
// 申请可执行内存
PDWORD pCodeRemote = (PDWORD)VirtualAllocEx(proc, 0, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// 写入shellcode
WriteProcessMemory(proc, pCodeRemote, &ThreadProc, 4096, NULL);
// 执行远程线程
CreateRemoteThread(proc, NULL, 0, (LPTHREAD_START_ROUTINE)pCodeRemote, NULL, 0, NULL);

分析

  • 开发环境 VS2022 + Win11 24H2

VS在编译时默认开启/GS安全编译选项。这个操作会给每个函数增加一些额外的数据和操作,用于检测栈溢出。在函数调用时,会在EBP之前压入一个额外的Security Cookie,函数执行完成后调用__security_check_cookie验证是否发生栈溢出。而由于Security Cookie是直接存储在.text段中,因此注入远程线程后会导致非法访问的错误。

DWORD WINAPI ThreadProc(FuncParamater* argvs)
{
006710C0 55                   push        ebp  
006710C1 8B EC                mov         ebp,esp  
006710C3 83 EC 58             sub         esp,58h  
006710C6 A1 00 50 67 00       mov         eax,dword ptr [__security_cookie (0675000h)]  
006710CB 33 C5                xor         eax,ebp  
006710CD 89 45 FC             mov         dword ptr [ebp-4],eax  if(argvs)
006710D0 83 7D 08 00          cmp         dword ptr [argvs],0  
006710D4 74 63                je          ThreadProc+79h (0671139h)  {**************************return 1;
00671132 B8 01 00 00 00       mov         eax,1  
00671137 EB 05                jmp         ThreadProc+7Eh (067113Eh)  }return 0
00671139 B8 02 00 00 00       mov         eax,0
}
0067113E 8B 4D FC             mov         ecx,dword ptr [ebp-4]  
00671141 33 CD                xor         ecx,ebp  
00671143 E8 38 08 00 00       call        __security_check_cookie (0671980h)  
00671148 8B E5                mov         esp,ebp  
0067114A 5D                   pop         ebp  
0067114B C2 04 00             ret         4  

从根源上来讲,导致远程线程失败的原因就在于注入的代码中访问了汇编指令中使用的相对或者绝对地址,而对应的地址在远程进程中不可访问。

类似问题

  • 常量字符串

由于字符串实际上存储在数据段,因此也会出现同样的问题。

    char buffer[] = { "1234" };
00A0171B A1 C8 61 A0 00       mov         eax,dword ptr ds:[00A061C8h]  
00A01720 89 45 F4             mov         dword ptr [ebp-0Ch],eax  
00A01723 8A 0D CC 61 A0 00    mov         cl,byte ptr ds:[00A061CCh]
00A01729 88 4D F8             mov         byte ptr [ebp-8],cl
  • 系统调用

正常情况下,外部函数调用都是通过读取进程导入表来间接完成的,因此远程注入后也会出现不可访问异常。
通常的做法就是先通过GetProcAddress找到函数的地址,然后通过参数传递给注入代码。

        CreateProcess(NULL, (LPWSTR)argvs->command,
009D19C8 8B F4                mov         esi,esp  
009D19CA 8D 45 EC             lea         eax,[ebp-14h]  
009D19CD 50                   push        eax  
009D19CE 8D 4D A0             lea         ecx,[ebp-60h]  
009D19D1 51                   push        ecx  
009D19D2 6A 00                push        0  
009D19D4 6A 00                push        0  
009D19D6 6A 10                push        10h  
009D19D8 6A 00                push        0  
009D19DA 6A 00                push        0  
009D19DC 6A 00                push        0  
009D19DE 8B 55 08             mov         edx,dword ptr [ebp+8]  
009D19E1 83 C2 04             add         edx,4  
009D19E4 52                   push        edx  
009D19E5 6A 00                push        0  
009D19E7 FF 15 14 60 9D 00    call        dword ptr ds:[009D6014h]  
009D19ED 3B F4                cmp         esi,esp  
009D19EF E8 4C 07 00 00       call        009D2140  
009D19F4 90                   nop  NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
  • 基本运行时检查RTC和支持仅我的代码调试

这两个选项是Debug模式下默认开启的,分别对应/RTC1/JMC,前者用于检测是否存在栈溢出和未初始化变量,后者用于检测是否本地代码,与/GS选项类似,由编译器在代码前后插入指令用于验证,因此注入后同样导致寻址异常。

  • 增量链接

Debug模式默认开启的增量链接将生成的汇编中对函数的直接call引用都转化为跳转指令jmp,避免全量重建,减少链接时间,但这也会导致注入远程的实际上变成了跳转指令,而非实际代码。

示例

struct FuncParamater
{BOOL(__stdcall* CreateProc)(__in_opt    LPCWSTR lpApplicationName,__inout_opt LPWSTR lpCommandLine,__in_opt    LPSECURITY_ATTRIBUTES lpProcessAttributes,__in_opt    LPSECURITY_ATTRIBUTES lpThreadAttributes,__in        BOOL bInheritHandles,__in        DWORD dwCreationFlags,__in_opt    LPVOID lpEnvironment,__in_opt    LPCWSTR lpCurrentDirectory,__in        LPSTARTUPINFOW lpStartupInfo,__out       LPPROCESS_INFORMATION lpProcessInformation);wchar_t command[MAX_PATH];
};// 原始函数
DWORD WINAPI ThreadProc(FuncParamater* argvs)
{if(argvs){PROCESS_INFORMATION pi;STARTUPINFO si;RtlZeroMemory(&pi, sizeof(pi)); // 使用/O2优化时,memset调用会被优化,不会导致非法访问RtlZeroMemory(&si, sizeof(si)); si.cb = sizeof(STARTUPINFO);si.wShowWindow = SW_SHOW;si.dwFlags = STARTF_USESHOWWINDOW /*|STARTF_USESTDHANDLES*/;argvs->CreateProc(NULL, (LPWSTR)argvs->command,NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);return 1;}return 2;
}FuncParamater fc;PVOID func = GetProcAddress(GetModuleHandleW(L"Kernel32.dll"), "CreateProcessW");wchar_t buffer[] = { L"ConsoleApplication1.exe" };memcpy(&fc, &func, sizeof(func));memcpy(fc.command, buffer, sizeof(buffer));DWORD pid = GetTargetProcessID(L"ConsoleApplication2.exe");DWORD err = 0;HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);if (proc == NULL) {return false;}void* pDataRemote = (char*)VirtualAllocEx(proc, 0, sizeof(fc), MEM_COMMIT, PAGE_READWRITE);
if (pDataRemote == NULL) {return false;
}err = WriteProcessMemory(proc, (byte*)pDataRemote, &fc, sizeof(fc), NULL);
if (err == NULL) {return false;
}PDWORD pCodeRemote = (PDWORD)VirtualAllocEx(proc, 0, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);if (pCodeRemote == NULL) {return false;}err = WriteProcessMemory(proc, (byte*)pCodeRemote, &ThreadProc, 4096, NULL);if (err == NULL) {return false;}HANDLE hThread = CreateRemoteThread(proc, NULL, 0, (LPTHREAD_START_ROUTINE)pCodeRemote, pDataRemote, 0, NULL);if (hThread == 0) {return false;}::WaitForSingleObject(hThread, INFINITE);DWORD h;::GetExitCodeThread(hThread, &h);std::cout << "remote function return : " << h;::CloseHandle(hThread);::VirtualFreeEx(proc, pCodeRemote, 0, MEM_RELEASE);::VirtualFreeEx(proc, pDataRemote, 0, MEM_RELEASE);CloseHandle(proc);

文章转载自:

http://M9Altp8n.jwpcj.cn
http://W9cUupIl.jwpcj.cn
http://KgggS4f4.jwpcj.cn
http://SLFSmpPg.jwpcj.cn
http://v74XLbSc.jwpcj.cn
http://IPBBFLte.jwpcj.cn
http://temdYuC0.jwpcj.cn
http://P2U6nZgj.jwpcj.cn
http://zXzFJqxY.jwpcj.cn
http://Djo6rvfU.jwpcj.cn
http://BXOv016i.jwpcj.cn
http://DgHMuqtE.jwpcj.cn
http://Foa9akuL.jwpcj.cn
http://zp6Ht2uU.jwpcj.cn
http://LXXnoMJc.jwpcj.cn
http://dOQv2nmN.jwpcj.cn
http://8kjooZOn.jwpcj.cn
http://IB1fjVYi.jwpcj.cn
http://fwpOYXMD.jwpcj.cn
http://krGqh5Nn.jwpcj.cn
http://t9RgaRQu.jwpcj.cn
http://P48JxDyj.jwpcj.cn
http://0ooSiYXT.jwpcj.cn
http://u8Ovrnyp.jwpcj.cn
http://aJFbV8V1.jwpcj.cn
http://e0ngemnN.jwpcj.cn
http://FuTQMG0v.jwpcj.cn
http://ip5YQuly.jwpcj.cn
http://kLWcv2FX.jwpcj.cn
http://fBTvDpQV.jwpcj.cn
http://www.dtcms.com/wzjs/745349.html

相关文章:

  • 好网站建设公司开发方案哪个网站公司做的
  • 企业网站改版计划书寮步镇网站建设公司
  • 郑州网站建设乚汉狮网络php个人网站怎么做
  • 网站建设中需求分析报告合肥建设官方网站
  • 织梦网站后台使用说明书手机版网站设计风格
  • 手机怎样建网站工信部网站备案用户名
  • 网站地图设计泰安网络推广
  • 许昌网站建设汉狮套餐如何编辑企业网站
  • 网站的形式wordpress刷量插件
  • 西安模板网站建设网络服务提供者有哪些
  • 手机网站建设模板下载不懂英文怎么做英文的seo网站
  • 怀柔谁会网站开发wordpress 分类模板插件
  • 微信建微网站基于 wordpress 商城
  • 网站备案证书国内wordpress案例
  • 网站做留言板wordpress页面添加js
  • 免费手机网页网站沈阳seo建站
  • 做环球资源网站有没有效果网站出现乱码的原因
  • 佛山外贸企业网站建设互联网网站开发合同范本
  • wordpress 站长工具青岛外贸公司联系方式
  • 网站开发后如何维护电子商务网站建设价格
  • 饿了么网站做生鲜吗沈阳建设工程项目审批
  • 官方网站查询高考分数成都市温江区建设局网站
  • 石家庄微网站建设公司wordpress 极简
  • 做数学题挣钱的网站wordpress集成dz
  • 网站布局类型如何修改wordpress手机模板
  • 做网站推广前途网络工程师工资一般多少的
  • 怎么在工商局网站查公司网页开发报价单
  • 海南景区网站建设方案wordpress文章如何分类添加
  • 诚信网站备案中心seo优化人员
  • 注册公司流程流程图搜索引擎优化的五个方面