libdebug เป็นไลบรารี Python แบบโอเพ่นซอร์สเพื่อทำให้การดีบักของไฟล์ปฏิบัติการไบนารีเป็นแบบอัตโนมัติ
ด้วย libdebug คุณสามารถควบคุมโฟลว์ของไฟล์ปฏิบัติการที่แก้ไขจุดบกพร่องของคุณได้อย่างเต็มที่ ด้วยสิ่งนี้ คุณสามารถ:
เมื่อรันไฟล์ปฏิบัติการเดียวกันหลายครั้ง การเลือกใช้งานที่มีประสิทธิภาพสามารถสร้างความแตกต่างได้ ด้วยเหตุนี้ libdebug จึงจัดลำดับความสำคัญของประสิทธิภาพ
หน้าแรก: https://libdebug.org
เอกสารประกอบ: https://docs.libdebug.org
อูบุนตู:
sudo apt install -y python3 python3-dev libdwarf-dev libelf-dev libiberty-dev linux-headers-generic libc6-dbg
เดเบียน:
sudo apt install -y python3 python3-dev libdwarf-dev libelf-dev libiberty-dev linux-headers-generic libc6-dbg
อาร์คลินุกซ์:
sudo pacman -S python libelf libdwarf gcc make debuginfod
หมวกฟาง:
sudo dnf install -y python3 python3-devel kernel-devel binutils-devel libdwarf-devel
python3 -m pip install libdebug
รองรับ PyPy3 แต่ไม่แนะนำ เนื่องจากทำงานได้แย่กว่าในการทดสอบส่วนใหญ่ของเรา
หากคุณต้องการติดตามฟีเจอร์ที่ล้ำสมัยที่สุด (และคุณไม่รังเกียจที่จะอยู่ในสาขาที่ไม่เสถียร) คุณสามารถติดตั้งจากสาขาอื่น (เช่น dev)
python3 -m pip install git+https://github.com/libdebug/libdebug.git@dev
ตอนนี้คุณได้ติดตั้ง libdebug แล้ว คุณสามารถเริ่มใช้ในสคริปต์ของคุณได้ นี่คือตัวอย่างง่ายๆ ของวิธีใช้ libdebug เพื่อดีบักไบนารี:
from libdebug import debugger
d = debugger ( "./test" )
# Start debugging from the entry point
d . run ()
my_breakpoint = d . breakpoint ( "function" )
# Continue the execution until the breakpoint is hit
d . cont ()
# Print RAX
print ( f"RAX is { hex ( d . regs . rax ) } " )
# Write to memory
d . memory [ 0x10ad , 8 , "binary" ] = b"Hello! x00 x00 "
# Continue the execution
d . cont ()
สคริปต์ด้านบนจะรัน test
ไบนารี่ในไดเร็กทอรีการทำงานและหยุดที่ฟังก์ชันที่สอดคล้องกับสัญลักษณ์ "ฟังก์ชัน" จากนั้นจะพิมพ์ค่าของการลงทะเบียน RAX และปิดกระบวนการ
มีอะไรอีกมากมายที่สามารถทำได้ด้วย libdebug โปรดอ่านเอกสารประกอบเพื่อหาข้อมูลเพิ่มเติม
libdebug นำเสนอคุณสมบัติขั้นสูงมากมาย ดูสคริปต์นี้ที่ใช้เวทย์มนตร์พร้อมสัญญาณ:
from libdebug import debugger , libcontext
libcontext . terminal = [ 'tmux' , 'splitw' , '-h' ]
# Define signal catchers
def catcher_SIGUSR1 ( t : ThreadContext , catcher : SignalCatcher ) -> None :
t . signal = 0x0
print ( f"SIGUSR1: Signal number { catcher } " )
def catcher_SIGINT ( t : ThreadContext , catcher : SignalCatcher ) -> None :
print ( f"SIGINT: Signal number { catcher } " )
def catcher_SIGPIPE ( t : ThreadContext , catcher : SignalCatcher ) -> None :
print ( f"SIGPIPE: Signal number { catcher } " )
def handler_geteuid ( t : ThreadContext , handler : SyscallHandler ) -> None :
t . regs . rax = 0x0
# Initialize the debugger
d = debugger ( '/path/to/executable' , continue_to_binary_entrypoint = False , aslr = False )
# Register signal catchers
catcher1 = d . catch_signal ( "SIGUSR1" , callback = catcher_SIGUSR1 )
catcher2 = d . catch_signal ( "SIGINT" , callback = catcher_SIGINT )
catcher3 = d . catch_signal ( "SIGPIPE" , callback = catcher_SIGPIPE )
# Register signal hijackings
d . hijack_signal ( "SIGQUIT" , "SIGTERM" )
d . hijack_signal ( "SIGINT" , "SIGPIPE" , recursive = True )
# Define which signals to block
d . signals_to_block = [ "SIGPOLL" , "SIGIO" , "SIGALRM" ]
d . handle_syscall ( "geteuid" , on_exit = handler_geteuid )
# Continue execution
d . cont ()
# Disable the catchers after execution
catcher1 . disable ()
catcher2 . disable ()
catcher3 . disable ()
bp = d . breakpoint ( 0xdeadc0de , hardware = True )
d . cont ()
d . wait ()
d . gdb ()
libdebug ยังช่วยให้คุณดำเนินการคำสั่งทั้งหมดโดยเร็วที่สุด โดยไม่ต้องรอให้เหตุการณ์หยุด หากต้องการเปิดใช้งานโหมดนี้ คุณสามารถใช้ auto_interrupt_on_command=True
from libdebug import debugger
d = debugger ( "/path/to/executable" , auto_interrupt_on_command = True )
pipes = d . run ()
bp = d . breakpoint ( "function" )
d . cont ()
# Read shortly after the cont is issued
# The process is forcibly stopped to read the register
value = d . regs . rax
print ( f"RAX is { hex ( value ) } " )
system_offset = d . symbols . filter ( "system" )[ 0 ]. start
libc_base = d . maps . filter ( "libc" )[ 0 ]. base
system_address = libc_base + system_offset
d . memory [ 0x12ebe , 8 , "libc" ] = int . to_bytes ( system_address , 8 , "little" )
d . cont ()
d . wait ()
# Here we should be at the breakpoint
# This value is read while the process is stopped at the breakpoint
ip_value = d . regs . rip
print ( f"RIP is { hex ( ip_value ) } " )
d . kill ()
หากคุณตั้งใจจะใช้ libdebug ในงานของคุณ โปรดอ้างอิงพื้นที่เก็บข้อมูลนี้โดยใช้ biblatex ต่อไปนี้:
@software{libdebug_2024,
title = {libdebug: {Build} {Your} {Own} {Debugger}},
copyright = {MIT Licence},
url = {https://libdebug.org},
publisher = {libdebug.org},
author = {Digregorio, Gabriele and Bertolini, Roberto Alessandro and Panebianco, Francesco and Polino, Mario},
year = {2024},
doi = {10.5281/zenodo.13151549},
}