-
-
[原创]新人ShellCode小总结,附带一个讨论问题
-
发表于:
2013-4-30 03:31
7179
-
[原创]新人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应该怎么写?
[培训]科锐逆向工程师培训第53期2025年7月8日开班!