Un verdadero framework de emulación binaria instrumentable
El caso de uso de Qiling, blog y trabajo relacionado
Qiling es un framework avanzado de emulación binaria, con las siguientes características:
Qiling también ha estado presente en varias conferencias internacionales.
2022:
2021:
2020:
2019:
Qiling está respaldado por Unicorn Engine.
Visita nuestro sitio web para más información.
Este programa es software libre; puedes redistribuirlo y/o modificarlo bajo los términos de la GNU General Public License publicada por la Free Software Foundation; ya sea la versión 2 de la Licencia, o (a tu elección) cualquier versión posterior.
Hay muchos emuladores de código abierto, pero los dos proyectos más cercanos a Qiling son Unicorn y QEMU user mode. Esta sección explica las principales diferencias de Qiling con respecto a ellos.
Construido sobre Unicorn, pero Qiling y Unicorn son dos animales diferentes.
QEMU user mode hace algo similar a nuestro emulador, es decir, emular binarios ejecutables completos de manera entre arquitecturas. Sin embargo, Qiling ofrece algunas diferencias importantes frente a QEMU user mode:
Consulta la guía de instalación para saber cómo instalar Qiling Framework.
El siguiente ejemplo muestra cómo usar Qiling framework de la manera más directa para emular un ejecutable de Windows.
from qiling import Qiling
if __name__ == "__main__":
# initialize Qiling instance, specifying the executable to emulate and the emulated system root.
# note that the current working directory is assumed to be Qiling home
ql = Qiling([r'examples/rootfs/x86_windows/bin/x86_hello.exe'], r'examples/rootfs/x86_windows')
# start emulation
ql.run()
from qiling import Qiling
def force_call_dialog_func(ql: Qiling):
# get DialogFunc address from current stack frame
lpDialogFunc = ql.stack_read(-8)
# setup stack memory for DialogFunc
ql.stack_push(0)
ql.stack_push(1001) # IDS_APPNAME
ql.stack_push(0x111) # WM_COMMAND
ql.stack_push(0)
# push return address
ql.stack_push(0x0401018)
# resume emulation from DialogFunc address
ql.arch.regs.eip = lpDialogFunc
if __name__ == "__main__":
# initialize Qiling instance
ql = Qiling([r'rootfs/x86_windows/bin/Easy_CrackMe.exe'], r'rootfs/x86_windows')
# NOP out some code
ql.patch(0x004010B5, b'\x90\x90')
ql.patch(0x004010CD, b'\x90\x90')
ql.patch(0x0040110B, b'\x90\x90')
ql.patch(0x00401112, b'\x90\x90')
# hook at an address with a callback
ql.hook_address(force_call_dialog_func, 0x00401016)
ql.run()
El siguiente video de YouTube muestra cómo funciona el ejemplo anterior.
Qiling Framework realiza parches en caliente y emula el /usr/bin/httpd de un router ARM en
un host x86_64 Ubuntu.
Este video demuestra cómo el plugin de Qiling para IDA Pro permite que IDA Pro funcione con el motor de instrumentación de Qiling.
Resolviendo un desafío CTF simple con Qiling Framework e IDA Pro
Qiling Framework emula MBR
Qiling también proporciona una herramienta amigable llamada qltool para emular rápidamente shellcode y binarios ejecutables.
Con qltool, se puede realizar una ejecución fácil:
Con shellcode:
$ ./qltool code --os linux --arch arm --format hex -f examples/shellcodes/linarm32_tcp_reverse_shell.hex
Con archivo binario:
$ ./qltool run -f examples/rootfs/x8664_linux/bin/x8664_hello --rootfs examples/rootfs/x8664_linux/
Con binario y depurador GDB habilitado:
$ ./qltool run -f examples/rootfs/x8664_linux/bin/x8664_hello --gdb 127.0.0.1:9999 --rootfs examples/rootfs/x8664_linux
Con recolección de cobertura de código (solo UEFI por ahora):
$ ./qltool run -f examples/rootfs/x8664_efi/bin/TcgPlatformSetupPolicy --rootfs examples/rootfs/x8664_efi --coverage-format drcov --coverage-file TcgPlatformSetupPolicy.cov
Con salida JSON (principalmente Windows):
$ ./qltool run -f examples/rootfs/x86_windows/bin/x86_hello.exe --rootfs examples/rootfs/x86_windows/ --console False --json
Obtén la información más reciente de nuestro sitio web https://www.qiling.io
Contáctanos por correo electrónico a [email protected], vía Twitter @qiling_io.
Consulta CREDITS.md.