Reverse

Binary 104: Methodology and Tools

category
Reverse
date
Mar 10, 2021
slug
binary-104-methodology-and-tools
author
status
Public
tags
binary analysis
reverse
summary
Các công cụ và phương pháp phân tích.
type
Post
thumbnail
updatedAt
Mar 1, 2023 08:54 AM

1. Quy trình phân tích

Phần này đi xây dựng một phương pháp hay chính xác là một quy trình các bước cần thực hiện khi phân tích binary, với mỗi bước sẽ đi kèm các công cụ cần thiết. Phân tích một Binary có thể không tuân theo một quy trình nào cả, tuy nhiên việc làm đó có thể sẽ khiến ta bỏ lỡ một bước hay một thông tin nào đó quan trọng, thậm chí có thể xảy ra những sự cố không mong muốn. Dưới đây sẽ là quy trình chung khi phân tích một tệp Binary, không bắt buộc và áp dụng cho mọi trường hợp, nói chung phải: "tùy cơ ứng biến"

1.1. Tìm kiếm, xác định binary

Mục tiêu của bước này là đi xác định được những tệp được cho là nguy hiểm, nghi ngờ độc hại xuất hiện trên hệ thống: Tiến trình nghi ngờ, Binary mới xuất hiện gần đây, Binary đã có trước đó nhưng bị sửa đổi - ghi đè gần đây hay các Binary có tên giống hoặc trùng với các chương trình chuẩn,.v.v...
Một số công cụ hữu ích và ví dụ sử dụng:
Lệnh find: Tìm kiếm các tệp thực thi trong một thư mục nào đó
$ find /home/osboxes/ -executable -type f | head -10 /home/osboxes/bac/xelfviewer_lin64_portable_0.02.tar.gz /home/osboxes/bac/Binary-Analysis-Cookbook/Chapter-06/32bit/ch06-bindshell32 /home/osboxes/bac/Binary-Analysis-Cookbook/Chapter-04/32bit/ch04-example /home/osboxes/bac/Binary-Analysis-Cookbook/Chapter-04/32bit/libhider.so
Lệnh file: Thông tin về một tệp
$ file /bin/bash /bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=6f072e70e3e49380ff4d43cdde8178c24cf73daa, stripped
Kết hợp các lệnh: find, file và một chút Bash Scripting ta được một lệnh bá đạo.
$ for i in $(find /home/osboxes/ -executable -type f);do file -i $i | grep -i 'x-executable; charset=binary';done /home/osboxes/bac/edb-debugger/build/edb: application/x-executable; charset=binary /home/osboxes/bac/edb-debugger/build/CMakeFiles/feature_tests.bin: application/x-executable; charset=binary /home/osboxes/bac/Binary-Analysis-Cookbook/Chapter-04/64bit/ch04-example: application/x-executable; charset=binary /home/osboxes/bac/Binary-Analysis-Cookbook/Chapter-03/64bit/ch03-helloworld64: application/x-executable; charset=binary /home/osboxes/bac/Binary-Analysis-Cookbook/Chapter-05/32bit/ch05-example-objcopy-stripped: application/x-executable; charset=binary ...
Lệnh ls: Liệt kê chi tiết về thời gian, kích thước, phân quyền của các tệp trong một thư mục.
$ ls -halt /usr/bin/ | tail -20 -rwxr-xr-x 1 root root 9.5K Feb 12 2014 lzmainfo -rwxr-xr-x 1 root root 66K Feb 12 2014 xz -rwxr-xr-x 1 root root 5.4K Feb 12 2014 xzdiff -rwxr-xr-x 1 root root 5.3K Feb 12 2014 xzgrep -rwxr-xr-x 1 root root 1.8K Feb 12 2014 xzless -rwxr-xr-x 1 root root 2.2K Feb 12 2014 xzmore -rwxr-xr-x 1 root root 27K Jan 10 2014 apgbfm -rwxr-xr-x 1 root root 276 Jan 10 2014 apg -rwxr-xr-x 1 root root 9.7K Jul 11 2013 scprofiler ...
Lệnh updatedb/locate: Sử dụng kết hợp
$ sudo updatedb $ locate bash /bin/bash /bin/rbash /etc/bash.bashrc /etc/bash_completion /etc/bash_completion.d /etc/apparmor.d/abstractions/bash ...
Lệnh ps: List các tiến trình đang chạy
$ ps -axu USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 24996 4992 ? Ss Mar29 0:03 /sbin/init splash root 2 0.0 0.0 0 0 ? S Mar29 0:00 [kthreadd] root 4 0.0 0.0 0 0 ? I< Mar29 0:00 [kworker/0:0H] root 6 0.0 0.0 0 0 ? I< Mar29 0:00 [mm_percpu_wq] root 7 0.0 0.0 0 0 ? S Mar29 0:00 [ksoftirqd/0] root 8 0.0 0.0 0 0 ? I Mar29 0:01 [rcu_sched] ...
Lệnh which: Thường tìm các vị trí trong biến môi trường $PATH. Một Binary độc hại có thể để tên theo một binary chuẩn nhằm đánh lừa người dùng đồng thời sửa đổi biến môi trường.
Khi hệ thống chưa bị tấn công:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin $ which ls cat ps /bin/ls /bin/cat /bin/ps
Khi hệ thống đã bị tấn công:
$ echo $PATH /opt/evil:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin $ which ls cat ps /opt/evil/ls /opt/evil/cat /opt/evil/ps
 

1.2. Thu thập thông tin

Khi đã xác định được một Binary được cho là độc hại hay nghi ngờ, thì ở bước này mục tiêu là sẽ thu thập nhiều thông tin hữu ích nhất có thể về một Binary. Bước này cực kỳ quan trọng trong toàn bộ quy trình trình phân tích. Để biết được thông tin nào là hữu ích cần thu thập ta đi trả lời các câu hỏi sau:
Đối với mục đích Phân tích Binary
  • Tệp có thể thực thi được hay không?
  • Tệp có phải Binary (Executable) không?
  • Tệp được viết bằng ngôn ngữ gì? biên dịch bằng Compiler nào?
  • Tệp là ELF hay PE?
  • Tệp có bị Stripped để xóa đi bảng: .symtab, .strtab không?
  • Có thể trích xuất, xác định được bất kỳ strings nào hữu ích từ tệp không?
  • Tệp có đang được chạy không (Process)?
  • Lấy mã băm (SHA1, SHA256) và tìm kiếm xem trước đó đã bị phát hiện là độc hại không?
  • Có thể xác định được bất kỳ chức năng (function) của tệp đc cho là hữu ích không?
  • Các thư viện mà tệp sử dụng là gì?
  • Tệp xuất hiện trên hệ thống hay bị sửa đổi gần nhất vào thời điểm nào?
Đối với mục đích xác định lỗ hổng cần trả lời thêm
  • Ứng dụng có nhận đầu vào không?
  • Ứng dụng có kiểm tra đầu vào không?
  • Ứng dụng có quản lý bộ nhớ một cách an toàn không?
  • Ứng dụng có sử dụng thư viện, thành phần phụ thuộc của bên thứ 3 không, chúng version nhiêu, được cập nhật không?
  • Ứng dụng được biên dịch như thế nào, có enable/disable các cơ chế bảo vệ không?
  • Có strings nào chứa dữ liệu nhạy cảm được hardcode không?
Demo các công thu thập thông tin
Sử dụng file để lấy thông tin cơ bản về tệp:
$ file ch04-example ch04-example: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=be0fc51d5fa6803f3d477cd8eda1e41ecddab29a, not stripped
 
Sử dụng readelf hoặc objdump để tích xuất thông tin ELF Header
$ readelf -a ch04-example $ objdump -x ch04-example
 
Sử dụng ldd để trích xuất thông tin các thư viện, các thành phần phụ thuộc:
$ ldd -v ch04-example
 
Sử dụng strings để trích xuất các chuỗi:
$ strings ch04-example /lib64/ld-linux-x86-64.so.2 libc.so.6 __isoc99_scanf __stack_chk_fail printf strcmp HardCodeH dPassworH Please enter the password to unlock the hidden message: The hidden message is '%s' Wrong, run the program again... ;*3$" GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609 ...
 
Sử dụng hexdump để trích xuất và hiển thị tệp dạng hex, ascii
$ hexdump -C ch04-example

1.3. Phân tích tĩnh

Mục tiêu của phần này là sẽ đi sâu vào phân tích code của binary. Ưu điểm của phân tích tĩnh là cho ta biết hết chương trình có những chức năng gì, hành động gì,.v.v.. mà không cần thực thi chương trình. Nhược điểm là nó đòi hỏi kỹ năng về dịch ngược mức thấp, mã nguồn sẽ được tháo gỡ và tái tạo lại ở dạng Assembly. Ngoài ra khi phân tích còn gặp khó khăn với các kỹ thuật chống phân tích: Packed, Obfuscate,.v.v..
Phần lớn các trường hợp phân tích tĩnh sẽ sử dụng objdump làm công cụ để disassembly. Một số tham số hữu dụng của công cụ này:
  • [d, --disassemble]: disassembly các section được gắn flag X, tức là có quyền thực thi
  • [D, --disassemble-all]: disassembly tất cả các section
  • [M, --disassembler-options=OPT]: định dạng đầu ra theo một dạng cú pháp nào đó, thường sẽ sử dụng cú pháp Intel.
Công cụ ndisasm chỉ hữu ích khi disassembly một đoạn byte, shellcode chứ khi disassembly một tệp tin nó không phân biệt được đâu là header, đâu là code, điều này dẫn đến việc ndisasm phân tích sai cú pháp assembly của chương trình. Ngược lại objdump phân biệt được các header và nó disassembly chính xác các section.
Ví dụ công cụ phân tích tĩnh
Disassemble Binary sử dụng ndisasm:
$ ndisasm -a -p intel ch04-example 00000000 7F45 jg 0x47 00000002 4C dec sp 00000003 46 inc si 00000004 0201 add al,[bx+di] 00000006 0100 add [bx+si],ax 00000008 0000 add [bx+si],al ...
Disassemble Binary sử dụng objdump:
$ objdump -d -M intel ch04-example ... 0000000000400646 <main>: 400646: 55 push rbp 400647: 48 89 e5 mov rbp,rsp 40064a: 48 83 ec 60 sub rsp,0x60 40064e: 64 48 8b 04 25 28 00 mov rax,QWORD PTR fs:0x28 ...

1.4. Phân tích động

Mục tiêu của bước này là đi thực thi chương trình một cách có kiểm soát, theo dõi hành vi của chương trình. Phân tích động có ưu điểm là dễ thực hiện, nhanh chóng thấy kết quả,.v.v.. Phân tích động nâng cao sẽ phải debugging Binary, kết hợp đọc mã Assembly, thực thi từng lệnh sau đó quan sát các Register, trạng thái Stack và cách Binary tương tác với hệ thống. Phân tích động cũng sẽ gặp phải các kỹ thuật Anti-Debug, Anti-Sandbox,.v.v..
Một số công cụ sử dụng trong quá trình phân tích động: gdb, edb, ltrace, strace
Ví dụ công cụ phân tích động
Cài đặt PEDA Plugin cho GDB:
$ git clone https://github.com/longld/peda.git ~/peda $ echo "source ~/peda/peda.py" >> ~/.gdbinit
Sử dụng PEDA cơ bản khi ở trong shell tương tác của GDB, tham khảo: http://ropshell.com/peda/Linux_Interactive_Exploit_Development_with_GDB_and_PEDA_Slides.pdf
  • peda help: Show các command mà peda hỗ trợ
  • pdis main: Disassembly hàm main
  • checksec: Show trạng thái các cờ: CANARY, FORTIFY, NX, PIE, RELRO
  • start: Bắt đầu chạy chương trình
  • break main, break * main+127: Đặt một breakpoint tại hàm main hoặc một vị trí tương đối trong hàm main.
  • p/d: Tính toán, như một trình calculator
  • x/wx $esp: Show giá trị các biến hoặc thanh ghi
  • next: Thực thi một lệnh, sẽ làm thay đổi EIP ⇒ trỏ đến lệnh tiếp theo.
  • watch $EAX: Theo dõi một thanh ghi hoặc biến
  • stack 50: In ra nội dung Stack trong khoảng 50
Debugging một Binary bằng PEDA:
$ gdb ch04-example break * main+127 Breakpoint 1 at 0x4006c5 gdb-peda$ start gdb-peda$ run
Kết quả ta dừng tại lệnh call đến hàm printf. Ta thấy PEDA nhận diện được tham số truyền vào hàm là chuỗi: "Please enter the password to unlock the hidden message: ". PEDA có giao diện rất trực quan, dễ hiểu, là một plugin không thể thiếu khi dùng GDB.
notion image
Ngoài ra còn có ltracestrace sẽ đề cập ở phần sau

1.5. Lặp lại các bước đã phân tích

Bước này sẽ lặp lại quá trình phân tích tĩnh, phân tích động cho đến khi chúng ta giải quyết được vấn đề. Đôi khi một chương trình đi kèm với các thự viện hoặc nó gọi một chương trình khác. Lúc này ta sẽ lặp lại các bước đã thực hiện đối với các chương trình con hoặc thư viện đó.

1.6. Tự động hóa các bước phân tích

Bước này đi xây dựng một công cụ để tự động hóa các bước phân tích tĩnh và thu thập thông tin. Công cụ sẽ tự động disassmbly theo yêu cầu của chúng ta, công việc còn lại sẽ chỉ là đi đọc hiểu kết đầu ra đã được lưu vào tập tin. Công cụ được viết bằng Bash Script
Source code bac-automation.sh
#!/bin/bash # BINARY ANALYSIS AUTOMATION # BY - Michael Born # DATE - 2019 if [ $# -lt 2 ] || [$# -gt 2 ] then echo "Not enough arguments: usage = $0 <binary file> <output file>"; else BINARY=$1; OUTPUTFILE=$2; # SETUP OUTPUT INFORMATION echo "This output created by $USER on $(date)" |tee $OUTPUTFILE; echo |tee -a $OUTPUTFILE; echo |tee -a $OUTPUTFILE; # FILE echo "FILE TYPE INFORMATION" | tee $OUTPUTFILE; echo |tee -a $OUTPUTFILE file $BINARY |tee -a $OUTPUTFILE; echo |tee -a $OUTPUTFILE; echo |tee -a $OUTPUTFILE; # STRINGS echo "STRINGS INFORMATION" |tee -a $OUTPUTFILE; echo |tee -a $OUTPUTFILE; strings -s " | " $BINARY |tee -a $OUTPUTFILE; echo |tee -a $OUTPUTFILE; echo |tee -a $OUTPUTFILE # READELF echo "READELF ALL" |tee -a $OUTPUTFILE; echo |tee -a $OUTPUTFILE; readelf -a -W $BINARY |tee -a $OUTPUTFILE; echo |tee -a $OUTPUTFILE; echo |tee -a $OUTPUTFILE; # OBJDUMP echo "OBJDUMP EXECUTABLE" |tee -a $OUTPUTFILE; echo |tee -a $OUTPUTFILE objdump -d -M intel $BINARY |tee -a $OUTPUTFILE; echo |tee -a $OUTPUTFILE; echo |tee -a $OUTPUTFILE; fi

1.7. Điều chỉnh phương pháp phân tích

Phần này, tôi đi xây dựng một quy trình phân tích Binary chuẩn chung, nó không áp dụng cho mọi trường hợp. Trong quá trình phân tích, với mỗi giai đoạn trong quy trình thực hiện hoàn toàn có thể thay đổi, tùy chỉnh lại sao cho phù hợp.

2. Công cụ Phân tích tĩnh

2.1. Sử dụng FILE

Lệnh file cho biết các thông tin ban đầu về tệp như: loại tệp, trình biên dịch,.v.v.. Một số tham số hữu ích:
  • [i, --mime]: Hiển thị Mime Type của tệp
  • [f, --files-from FILE]: Đọc danh sách các file cần kiểm tra từ một tệp text
  • [F, --separator]: Định dạng đầu ra kết quả, thay vì ngăn cách nhau bằng dấu cách (mặc định) có thể định dạng theo ký tự tùy ý.

2.2. Sử dụng STRINGS

Trích xuất các chuỗi trong một tệp, tùy chỉnh được độ dài tối thiểu của mỗi chuỗi. Thông tin chuỗi đc hardcode vào trong Binary có thể là thông tin nhạy cảm. Một số tham số hữu ích:
  • [a - --all]: Mặc định khi chạy, quét toàn bộ tệp
  • [d --data]: Chỉ quét Data Section của tệp
  • [n --bytes=[number]]: Chỉ định độ dài tối thiểu của chuỗi, mặc định là 4 ký tự
  • [f --print-file-name]: Khi quét nhiều tệp cùng một lúc, tham số này sẽ hiển thị tên tệp đằng trước mỗi chuỗi tìm được.
  • [s --output-separator=<string>]: Định dạng lại đầu ra kết quả ngăn cách giữa các chuỗi, mặc định ký tự định dạng là \n - xuống dòng mới.
  • [t --radix={o,d,x}]: Hiển thị vị trí của chuỗi trong tệp. Vị trí hiển thị theo hệ 8, 10, 16

2.3. Sử dụng READELF

Công cụ đọc cấu trúc tệp ELF, có sẵn trên Linux. Một số tham số hữu ích:
  • [a --all]: Show toàn bộ thông tin mà công cụ có thể đọc
  • [e --headers]: Kết hợp của: -h -l -S
  • [h --file-header]: Show ELF Header
  • [l --program-headers]: Show Program Header hay Segment Header
  • [S --section-headers]: Show Section Header
  • [s --syms]: Show bảng Symbol
  • [x --hex-dump=<number|name>] hoặc [R --relocated-dump=<number|name>]: Dump một Section
  • [W --wide]: Không ngắt dòng kết quả khi vượt quá 80 ký tự.

2.4. Sử dụng NM

Liệt kê các Symbol của một tệp Binary/Object
  • [A, --print-file-name]: Dùng khi quét nhiều tệp, nó sẽ hiển thị tên tệp đầu dòng
  • [D, --dynamic]: Hiển thị các Dynamic Symbol, Khi tệp bị stripped nếu dùng tham số này vẫn có thể biết đc Binary gọi hàm nào
  • [S, --print-size]: Hiển thị cả kích thước khi định nghĩa Symbol
  • [f, --format=FORMAT]: Định dạng đầu ra các Symbol theo các hệ thống: Sysv, Posix, mặc định là BSD.
  • [n, --numeric-sort]: Sort các Symbol theo địa chỉ nó tìm thấy

2.5. Sử dụng OBJCOPY

Copy một tệp Binary và có thể tùy chỉnh tệp mới: loại bỏ ELF Header, Loại bỏ symbol,.v.v.. Một số tham số hữu dụng:
  • [I --input-target <bfdname>]: Tệp đầu vào
  • [O --output-target <bfdname>]: Tệp đầu ra
  • [B --binary-architecture <arch>]: Kiến trúc tệp
  • [S --strip-all]: Xóa bỏ tất cả các symbol và thông tin về relocation
  • [j --only-section]: Sao chép một Section đc chỉ định

2.6. Sử dụng OBJDUMP

Dùng để Disassembly một Binary, sử dụng phần lớn trong quá trình phân tích tĩnh. Một số tham số hữu dụng:
  • [x, --all-headers]: Show tất cả các thông tin về header của tệp, tính năng tương tự READELF
  • [D, --disassemble-all]: Disassembly tất cả các Section
  • [d, --disassemble]: Disassembly những Section được gắn cờ X, có quyền thực thi
  • [w, --wide]: Không ngắt dòng khi đầu ra quá 80 ký tự
  • [M, --disassembler-options=OPT]: Định dạng cú pháp mã lệnh Assembly của đầu ra, thường dùng cú pháp Intel

2.7. Sử dụng DD

Công cụ này sao chép chính xác từng byte hoặc từng khối bytes tại một thời điểm từ một disk sang thẻ nhớ hoặc sang disk khác. Công cụ này rất hữu dụng khi muốn copy một phần của tệp ra tệp khác. Lấy ví dụ một tệp thực thi ELF được nhúng bên trong một tệp ảnh, lúc này muốn trích xuất tệp ELF ra có thể sử dụng DD để copy đúng các byte của tệp ELF nằm trong tệp ảnh. Ngoài ra DD cũng được dùng để Clone một ổ cứng, một phân vùng, backup dữ liệu,.v.v.. phụ vụ điều tra số máy tính. Ví dụ:
$ dd ibs=1 skip=17087 cbs=1 if=ch05-ctf.png of=ch05-ctf
Giải thích:
  • [ibs]: Số byte đọc cùng 1 lúc, mặc định là 512
  • [skip]: Số byte bỏ qua
  • [cbs]: Số byte sẽ sao chép trong cùng 1 lúc
  • [if]: Tệp đầu vào
  • [of]: Tệp đầu ra
Việc trích xuất một tệp được nhúng trong một tệp khác có nhiều cách và nhiều công cụ có thể thực hiện, bản chất vẫn là phải xác định được đúng header của tệp, tính toán được kích thước của tệp nhúng bên trong.

3. Công cụ Phân tích động

3.1. Sử dụng LTRACE và STRACE

Hai công cụ này dùng rất nhiều trong giai đoạn đầu của phân tích động, cũng hữu ích trong một số các bài CTF. Chúng theo dõi và logs lại các API Call của một chương trình, một tệp Binary.
LTRACE - Trace library calls: Theo dõi và logs lại các cuộc gọi hàm có trong thư viện. Tham số hữu ích:
  • [-T hoặc -t, -tt, -ttt]: Hiển thị thời gian thực hiện cuộc gọi
  • [-r]: Hiển thị thời giang tương đối
  • [-c]: Đếm thơi gian và số lượng cuộc gọi
  • [-f]: Trace cả các cuộc gọi lồng bên trong
  • [-i]: Hiển thị địa chỉ lệnh trong thời gian gọi hàm
  • [-o]: Lưu kết quả ra file
  • [-S]: Trace các cuộc gọi hệ thống (Giống Strace)
  • [-e]: Trace theo nhóm các API, tránh nhiễu kế quả. VD: $ ltrace -e opendir+readdir+closedir ./malware.bin
  • [-p]: Trace một Process
Một vài ví dụ:
$ ltrace -it -o malware.txt ./malware.bin $ ltrace -Sit -o malware.txt ./malware.bin
STRACE - Trace system calls and signals: Theo dõi và logs lại các cuộc gọi hệ thống. Các Tham số hữu ích:
  • [-r]: Hiển thị relative timestamp
  • [-i]: Hiển thị Instruction Pointer
  • [-T, -t, -tt]: Hiển thị thời gian
  • [-c]: Count, đếm thời gian, số cuộc gọi, lỗi,.v.v..
  • [-f, -ff]: Follow forks
  • [-x]: In ký tự non-ascii dạng hex
  • [-o]: Lưu kết quả ra file
  • [-p <PID>]: Trace một Process
  • [-e]: trace các api theo một nhóm. VD: $ strace -e trace=open,close,read,write df -h hay $ strace -e trace=process,file,memory,network,signal df -h
Một vài ví dụ:
$ strace -itx -o report.txt ./malware.bin $ strace -itxC -o report.txt ./malware.bin $ strace -itx -e trace=process,network -o report.txt ./malware.bin

3.2. Sử dụng GDB

GDB là một công cụ phân tích động nâng cao, một số command hữu ích:
Thiết lập trước khi Debug: Bước này mặc định sẽ làm cho GDB hiển thị theo cú pháp Intel.
$ sudo su $ echo "set disassembly-flavor intel" >> /etc/gdb/gdbinit $ exit
Khởi chạy ở TUI Mode - Chế độ có thể tương tác dòng lệnh, trực quan hơn chế độ mặc định:
$ gdb --tui -q ch05-example
Thiết lập các layout và tham số:
(gdb) layout asm (gdb) layout regs (gdb) set args rot13 TheBrownFoxJumpsThroughTheForest (gdb) break main (gdb) run
Hiển thị giá trị các thanh ghi, vùng nhớ:
  • (gdb) x/x $eip: Hiển thị dạng Hex giá trị hiện tại của một thanh ghi hoặc ô nhớ
  • (gdb) x/wx $eip hoặc (gdb) x/xw $eip: Hiển thị tối đa 4 bytes
  • (gdb) x/gx $eip: Hiển thị tối đa 8 bytes
  • (gdb) x/ws $eip: Word + String ⇒ Hiển thị dạng chuỗi với địa chỉ bắt đầu là một ô nhớ hay giá trị mà thanh ghi đang trỏ đến
  • (gdb) x/4x $eip: Xem 4 đối tượng trong bộ nhớ dạng hex với thanh ghi hoặc địa chỉ ô nhớ là nơi bắt đầu.
Một số lệnh hữu ích khác:
  • info all-registers: Show giá trị của tất cả các thanh ghi ở thời điểm hiện tại
  • info sources: Show thông tin về các tệp source code
  • nexti: Thực thi lệnh kế tiếp
Sử dụng GDB với PEDA Plugin sẽ hỗ trợ hiển thị tốt hơn rất nhiều, giúp tự động rất nhiều các bước thủ công phải làm ở trên. Xem lại phần trước để biết cách cài đặt, sử dụng PEDA cơ bản.

3.3. Sử dụng EDB

EDB - Evan's Debugger với giao diện người dùng hiện đại, được ví như Ollydbg trên Windows. EDB cũng đi kèm với nhiều Plugin hỗ trợ rất nhiều trong quá trình phân tích binary.
Sử dụng EDB cơ bản:
Chạy EDB với nhiều cách bằng dòng lệnh:
  • $ edb --run ./ch05-example: Load một Binary vào EDB theo cách thông thường
  • $ edb --run ./ch05-example rot13 TheBrown: Load một Binary vào EDB với tham 2 số đi kèm.
Hệ thống các Plugin đi kèm: Analyzer, Call Stack, Binary Info, Binary Search, Bookmarks, Breakpoint Manager, DumpState, FasLoader, Function Finder, Heap Analyzer, ROPTool, Symbol Viewer,.v.v..
Để Patching một lệnh: Tại Disassembly Windows > Righ Click > Asemble hoặc nhấn phím Space
Một vài lệnh cơ bản:
  • F2: Đặt Breakpoint
  • F3: Mở một tệp
  • Shift+F3: Attack mọt Process
  • F7: Step into
  • F8: Step over
  • F9: Run
  • F11: Pause
  • Ctrl+F9: Run until Return
  • Alt+X: Thoát