能力值:
( LV12,RANK:210 )
|
-
-
2 楼
shellcode最下面的部分有问题,的shellcode中对字符串的处理,push word 0x00这个指令不对,第二引用的地址不对,lea ecx,[esp] esp的内容就是当前栈顶,你加上[]它实际上把字符串的值当成了地址。参考下面修改后的代码,你加到vc内联汇编中就行,在od中能正常运行
push 0
push 0x41424344
push 31323334
mov ecx,esp
push 0
push 0X61486148
mov edx,esp
push 0
push edx
push ecx
push 0
call ebx
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
谢谢你哦,但是你的方法我试了,在内联汇编中使用仍然出现原来的错...
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
这是我修改后的代码
去掉了里面的一些堆栈平衡的 "add esp,7",不是所有的函数调用都用 add esp,7的
改成如下,红色是我加入的代码,去掉了你原来的堆栈平衡代码
__asm
{
shell: PUSHAD
mov ebp,esp
MOV EAX,DWORD PTR FS:[30H]
MOV EAX,DWORD PTR [EAX+0CH]
MOV EAX,DWORD PTR [EAX+1CH]
MOV EAX,DWORD PTR [EAX]
MOV EAX,DWORD PTR [EAX+08H]
MOV EBP,EAX
MOV EAX,DWORD PTR [EAX+3CH]
MOV EAX,DWORD PTR [EBP+EAX+120]
MOV ECX,[EBP+EAX+24]
MOV EBX,[EBP+EAX+32]
ADD EBX,EBP
PUSH WORD PTR 0X00
PUSH DWORD PTR 0X73736572
PUSH DWORD PTR 0X64644163
PUSH DWORD PTR 0X6F725074
PUSH WORD PTR 0X6547
MOV EDX,ESP
PUSH ECX
F1:
MOV EDI,EDX
POP ECX ;导出表中导出函数名字的数目
DEC ECX
TEST ECX,ECX
JZ EXIT
MOV ESI,[EBX+ECX*4] ;取出一个函数
ADD ESI,EBP ;函数真实地址
PUSH ECX
MOV ECX,15
REPZ CMPSB ;比较edi,esi是否相等
TEST ECX,ECX
JNZ F1
POP ECX
MOV ESI,[EBP+EAX+36]
ADD ESI,EBP
MOVZX ESI,WORD PTR[ESI+ECX*2]
MOV EDI,[EBP+EAX+28]
ADD EDI,EBP
MOV EDI,[EDI+ESI*4]
ADD EDI,EBP ;取得GetProcAddress函数的地址
;mov EDX, addr
;mov [EDX+aGetProcAddress],EDI
PUSH WORD PTR 0X00
PUSH DWORD PTR 0X41797261
PUSH DWORD PTR 0X7262694C
PUSH DWORD PTR 0X64616F4C
PUSH ESP
PUSH EBP
CALL EDI
;mov EDX, addr
;mov [EDX+aLoadLibrary], EAX
;mov EBX, [EDX+u32]
;push EBX
;CALL EAX
PUSH WORD PTR 0X00
PUSH DWORD PTR 0X6C6C642E ;.
PUSH DWORD PTR 0X32337265 ; .
PUSH WORD PTR 0X7355 ;
PUSH ESP
CALL EAX ;user32.dll的基址
MOV EDX,EAX
PUSH DWORD PTR 0X0041786F ;
PUSH DWORD PTR 0X42656761 ;
PUSH WORD PTR 0X7373;se ;
PUSH WORD PTR 0X654D ;
PUSH ESP
PUSH EDX
CALL EDI
MOV EBX,EAX ;MessageBox地址
PUSH WORD PTR 0X00
PUSH DWORD PTR 0X41424344 ;显示内容;
PUSH DWORD PTR 0X31323334
mov ECX,esp
PUSH WORD PTR 0X00
PUSH DWORD PTR 0X61486148 ; 标题;
mov EDX,esp
PUSH 40H+1000H
PUSH ECX
PUSH EDX
PUSH 0
CALL EBX ;调用MessagBoxA
EXIT:
mov esp,ebp
POPAD
}
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
学习学习~~~~~~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
太强大了!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
字符串地址有问题
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
shellcode中MessageBoxA的参数字符串是放在栈里面的 而add esp,7已经把esp弄成奇数了 所以MessageBoxA取参数时,字符串是在栈中,而且字符串的地址是栈中的
奇地址,所以出错了。在我的机子上,在LoadLibraryA("USER32.dll")时就出错了,原因也是一样。可以用这个测试一下
_asm
{
//int 3
inc esp
push 'oac'
mov eax,esp
push 0
push 0
push eax
push 0
call DWORD PTR MessageBoxA
}
弹出来的msgbox上面没字。把inc esp去掉就好了。 不知道LZ那么多add esp,7是怎么来的。
|