前言
本文就是写写Keystone咋用的
不涉及原理层面
地址
官方网站
https://www.keystone-engine.org/
Github
https://github.com/keystone-engine/keystone
我的博客(欢迎来踩)
https://kdajv.com/2021/07/21/capstoneengine/
介绍
Keystone是一个轻量级的多平台多架构的汇编框架,可以提供不少独特功能:
- 支持多框架:Arm, Arm64 (AArch64/Armv8), Ethereum Virtual Machine, Hexagon, Mips, PowerPC, Sparc, SystemZ & X86 (包括 16/32/64bit)。
- 干净/简单/轻量级/直观的API,同时不依赖任何架构。
- 以C/C++实现,可在众多语言里使用:Java、Masm、C#、PowerShell、Perl、Python、NodeJS、Ruby、Go、Rust、Haskell、VB6 和 OCaml。
- 原生支持Windows和*nix系统(以下系统已确认支持:Mac OSX, Linux, *BSD, Solaris)
- 线程安全的设计。
- 开源,具有双重许可证
使用
编译ShellCode(X86)
from keystone import *
import sys
Shellcode_instruction = '''
xor eax, eax
push eax
push 0x68732f2f
push 0x6e69622f
mov ebx, esp
push eax
push ebx
mov ecx, esp
mov al, 0xb
int 0x80
'''
KS = Ks(KS_ARCH_X86, KS_MODE_64)
code, count = KS.asm(Shellcode_instruction)
print(f"Source\t{code}")
print(f"Bytes\t{b''.join(map(lambda x: x.to_bytes(1, sys.byteorder), code))}")
print(f"Count\t{count}")
Output
Source [49, 192, 80, 104, 47, 47, 115, 104, 104, 47, 98, 105, 110, 137, 227, 80, 83, 137, 225, 176, 11, 205, 128]
Bytes b'1\xc0Ph//shh/bin\x89\xe3PS\x89\xe1\xb0\x0b\xcd\x80'
Count 11
编译ShellCode(X86-64)
from keystone import *
import sys
Shellcode_instruction = '''
xor rdx, rdx
mov rbx, 0x68732f6e69622f2f
shr rbx, 0x8
push rbx
mov rdi, rsp
push rax
push rdi
mov rsi, rsp
mov al, 0x3b
syscall
'''
KS = Ks(KS_ARCH_X86, KS_MODE_64)
code, count = KS.asm(Shellcode_instruction)
print(f"Source\t{code}")
print(f"Bytes\t{b''.join(map(lambda x: x.to_bytes(1, sys.byteorder), code))}")
print(f"Count\t{count}")
Output
Source [72, 49, 210, 72, 187, 47, 47, 98, 105, 110, 47, 115, 104, 72, 193, 235, 8, 83, 72, 137, 231, 80, 87, 72, 137, 230, 176, 59, 15, 5]
Bytes b'H1\xd2H\xbb//bin/shH\xc1\xeb\x08SH\x89\xe7PWH\x89\xe6\xb0;\x0f\x05'
Count 10