欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]新人ShellCode小总结,附带一个讨论问题

[原创]新人ShellCode小总结,附带一个讨论问题

写在前面:
新人总结,如有谬误,望请指正。
本人只是写给入门级或者为入门的童鞋的。如有误导,后面省略若干字
PS:我的小问题在最后面,牛牛们可以直接到帖子结尾处看看。
现在是2013年4月30日 相信从shellcode这东西被发明出来到现在,已经被无数大牛玩透了。
但是我觉得依然会有许许多多的入门级小菜与我一样苦苦挣扎再入门的边缘。
为了对得起我今天花了好几个小时写出的SHELLCODE,我觉得应该总结一下了。
1.从ShellCode的调用开始说起
((void(*)(void))&pFnShell)();
这应该是我们写完一个ShellCode后,第一次检测Shellcode的时候。
这里需要明白的一点是,我们所调用的不是一段代码,而是一个完整的函数。
既然是函数,那么首先我们就需要考虑堆栈平衡的问题。
我一个朋友喜欢用MASM写ASM然后再经过转换成Shellcode、
但是我还是觉得用VC写更加简单,原因就是对于入门级小菜的我这样的人来说,我们可以忽略堆栈平衡的问题。
我们可以这样来写代码
void Shellcode()
{
_asm
{
这里就是内联汇编了~~~
}
}
F10单步,然后按F10反汇编。
这时候我们会发现,作为还是需要处理堆栈和寄存器的代码已经由VC帮我们弄好了,
只要我们中间内联汇编的代码保持堆栈平衡就行了。
2。把整个Shellcode提取出来。
提取的方法很多,但是我只推荐一种最简单的,懒人专用嘛~
1:为了简化操作和减小ShellCode体积,Release编译,指定main函数为入口点。
2:OD载入,跟踪到我们Shellcode的那个函数。
3:直接二进制复制出来
4:WinHex用ANSI HEX方式粘贴进去 并保存
5:C32ASM打开之前保存的文件,用C语言方式拷贝出来
这时我们得到的就是0x22 , 0x33,.....这样的东西了,后面的我也不用说了~
3.东鳞西爪的ShellCode
大多数ShellCode都需要动态找Kernel32 LoadLibraryA这些东东
作为小菜的我们可能没有能力自己搞出来,肿么办呢?
很简单,百度然后复制粘贴调试吧~
这里要说的是,为了减小我们自己修改的难度,尽量找一些对堆栈操作较少的通用Shellcode来移植,尽量减少我们自己在平衡堆栈上需要做的工作。
ESI EDI之类的寄存器基本可以忽略,关键是就是保证EBP ESP
4.方便伸手党
我仅测试了WIN7SP1下可以正常用
Kernel32.dll
        _asm
        {
                push esi
                xor ecx, ecx
                mov esi, fs:0x30
                mov esi, [esi + 0x0c]
                mov esi, [esi + 0x1c]
        next_module:
                mov eax, [esi + 0x8]
                mov edi,[esi + 0x20]
                mov esi ,[esi]
                cmp [edi + 12 * 2],cx
                jne next_module
                pop esi
        }
GetProcAddress
        _asm
        {
                push ebp
                mov ebp, uKernel32 //前面得到的DLL基址再EAX 自己保存下
                mov eax, [ebp+3Ch]
                mov edx,[ebp+eax+78h]
                add edx,ebp
                mov ecx , [edx+18h
                mov ebx,[edx+20h]
                add ebx, ebp
        search:
                dec ecx
                mov esi,[ebx+ecx*4]
                add esi,ebp
                ;GetProcAddress
                mov eax,0x50746547
                cmp [esi], eax; 比较'PteG'
                jne search
                mov eax,0x41636f72
                cmp [esi+4],eax; 比较'Acor'
                jne search
                mov ebx,[edx+24h]
                add ebx,ebp
                mov cx,[ebx+ecx*2]
                mov ebx,[edx+1Ch]
                add ebx,ebp
                mov eax,[ebx+ecx*4]
                add eax,ebp
                pop ebp
        }
LoadLibrary
        _asm
        {
                push 0x0
                push dword ptr 0x41797261
                push dword ptr 0x7262694c
                push dword ptr 0x64616f4c ;在堆栈中构造LoadLibraryA字符串
                push esp
                push uKernel32
                call uGetProcAddress//和前面的uKernel32 同理
        }
5.我还有个小问题 求兄弟们来帮我解答下
一般的语句没啥问题,可是我想要在内联汇编里指定跳转到某个地址,应该肿么做?
比如
_asm jmp 0x00401000
这句在VC里不能编译
我再OD里直接写的话 得到的机器码好像是3个字节,这玩意到底怎么算的?
ShellCode应该怎么写?

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功