首页
社区
课程
招聘
[原创]新人ShellCode小总结,附带一个讨论问题
发表于: 2013-4-30 03:31 7178

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

2013-4-30 03:31
7178

写在前面:
新人总结,如有谬误,望请指正。
本人只是写给入门级或者为入门的童鞋的。如有误导,后面省略若干字

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应该怎么写?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (14)
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
如果想要跳到绝对地址,就转个弯
mov eax,0x00401000
jmp eax

相对跳转指令的话,楼主貌似没玩过inline hook(奇异)?
2013-4-30 07:41
0
雪    币: 15
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
收藏啦。。。。。。
2013-4-30 08:56
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
是哒~前面伦家都说了,入门级选手 嘿嘿~
3Q啦。
2013-4-30 10:57
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
5
shellcode提取可以写个自动处理的代码,结合反编译引擎瞬间搞定的说~
嘿嘿。有时间贴贴代码
2013-4-30 11:50
0
雪    币: 7271
活跃值: (5346)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
学习了,收藏一下
2013-4-30 12:56
0
雪    币: 153
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习一下,以后会用到
2013-4-30 13:10
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
OD插件的说?
2013-4-30 13:16
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
收藏了,学习一下
2013-6-3 11:15
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
10
用vc写ShellCode可以只用5条以内的内镶汇编指令,其他的可以完全用C语言去实现的!而且写ShellCode是完全非常的简单.
2013-6-3 12:52
0
雪    币: 1121
活跃值: (857)
能力值: ( LV5,RANK:66 )
在线值:
发帖
回帖
粉丝
11
WinHex选中shellcode,点右键,edit,Copy Block,C Source。省去了C32ASM,那玩意早抛弃了
2013-6-3 13:36
0
雪    币: 2528
活跃值: (2470)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
12
不知道有没有OD插件,可以直接保存成 0x90 0xcc 这样的shellcode。

没有的话,可以考虑写一个。
2013-6-4 12:07
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
蛇叔..求代码..
2013-6-6 10:42
0
雪    币: 101
活跃值: (43)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
jmp是跳相对地址,也就是他的机器码是应该代表jmp的eb或者e8之类的,然后后面跟的是当前地址离目标的距离,所以说因为这样,你在高级语言里根本不能确定当前地址是啥,自然不知道距离,当然也就不能跳。可用的方法有mov xxx,地址 jmp xxx,或者push xxx ret这类方法。
2013-6-10 00:00
0
雪    币: 222
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习学习...
2013-6-10 14:54
0
游客
登录 | 注册 方可回帖
返回