• 1025阅读
  • 2回复

7.asm-shellcode流程 [复制链接]

上一主题 下一主题
离线啊冲
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-12


shellcode就是汇编的opcode,一般以子函数形式出现:
取得shellcode的方便方式是:
1.写一个函数如:


[cpp] view plain copy

  1. void __stdcall code(LONG &a,  
  2.                     LONG &b,  
  3.                     DWORD &c,  
  4.                     LONG &d,  
  5.                     DWORD &e)  

取得它的汇编码:如:


[cpp] view plain copy

  1. push    ebp  
  2.     mov     ebp,esp  
  3.     sub     esp,14h  
  4.     push    ebx  
  5.     push    esi  
  6.     push    edi  
  7.     mov     dword ptr [ebp-4],0FFFFFFFFh  
  8.     mov     dword ptr [ebp-0Ch],0  
  9.     mov     dword ptr [ebp-8],0  
  10.     mov     dword ptr [ebp-14h],0  
  11.     mov     dword ptr [ebp-10h],0  
  12.     pushad  
  13.     mov     eax,22E4CCh  
  14.     int     0FFh  
  15.     mov     dword ptr [ebp-4],eax  
  16.     mov     dword ptr [ebp-0Ch],ecx  
  17.     mov     dword ptr [ebp-14h],edx  
  18.     mov     dword ptr [ebp-8],esi  
  19.     mov     dword ptr [ebp-10h],edi  
  20.     popad  
  21.     mov     eax,dword ptr [ebp+8]  
  22.     mov     ecx,dword ptr [ebp-4]  
  23.     mov     dword ptr [eax],ecx  
  24.     mov     edx,dword ptr [ebp+0Ch]  
  25.     mov     eax,dword ptr [ebp-0Ch]  
  26.     mov     dword ptr [edx],eax  
  27.     mov     ecx,dword ptr [ebp+10h]  
  28.     mov     edx,dword ptr [ebp-14h]  
  29.     mov     dword ptr [ecx],edx  
  30.     mov     eax,dword ptr [ebp+14h]  
  31.     mov     ecx,dword ptr [ebp-8]  
  32.     mov     dword ptr [eax],ecx  
  33.     mov     edx,dword ptr [ebp+18h]  
  34.     mov     eax,dword ptr [ebp-10h]  
  35.     mov     dword ptr [edx],eax  
  36.     pop     edi  
  37.     pop     esi  
  38.     pop     ebx  
  39.     mov     esp,ebp  
  40.     pop     ebp  
  41.     ret     14h  

转换成机器码:


[cpp] view plain copy

  1. unsigned char *asm_code()  
  2. {  
  3.     __asm  
  4.     {  
  5.         lea eax,__code  
  6.         jmp __ret  
  7.     }  
  8.   
  9.     // shellcode   
  10.     __asm  
  11.     {  
  12. __code://要加的汇编  
  13.     //TODO  
  14.     }  
  15.     __asm nop//标志位,一般是int 3,即0xcc  
  16.     __asm {__ret:}  
  17. }  


[cpp] view plain copy

  1. int main()  
  2. {  
  3.     unsigned char temp;  
  4.     int i=1;  
  5.     unsigned char* asm_p = asm_code();  
  6.     FILE *fd = fopen("code.txt","w");  
  7.     fprintf(fd,"unsigned char shellcode[] = \"");  
  8.     while((temp = *asm_p) != 0x90)//标志位,一般是int 3,即0xcc  
  9.     {  
  10.         fprintf(fd,"\\x%.2x",temp);  
  11.         asm_p ++;  
  12.         if(i % 8 == 0) fprintf(fd,"\"\n\"");  
  13.         i ++;  
  14.     }  
  15.     fprintf(fd,"\";");  
  16.     fclose(fd);  

运行得到shellcode[]数组在code.txt中,取出
调用方式一般采用:


[cpp] view plain copy

  1. #define  QSHELLCODE {0x55, 0x8b, 0xec, 0xcd, 0xff, 0x5d, 0xc3}  
  2. #define  SHELLCODE_SIZE 0x7  


[cpp] view plain copy

  1. PVOID  m_pShellCode = VirtualAlloc(NULL, SHELLCODE_SIZE, MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);  
  2. if (m_pShellCode)  
  3. {  
  4.     byte ptr_shellcode[] = QSHELLCODE;  
  5.     memcpy(m_pShellCode, ptr_shellcode,SHELLCODE_SIZE);  
  6. }  

最后调用有两种方式,一种是:


[cpp] view plain copy

  1. pfn_Q pfn = (pfn_Q)m_ShellCode;  
  2.         pfn(填参数);//函数直接调  

另一种是汇编:


[cpp] view plain copy

  1. lea ecx, pfn  
  2.     mov ecx, [ecx]  
  3.     call ecx  

当然,有参数就先push参数







善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
离线im86165507

只看该作者 沙发  发表于: 2016-02-24
离线v2680267313

只看该作者 板凳  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个