Một vài thủ thuật - mẹo trong IDA Pro !

DiepNV88

VIP Members
24/09/2013
369
1.552 bài viết
Một vài thủ thuật - mẹo trong IDA Pro !
IDA Pro là phần mềm phổ biến nhất được thiết kế để dịch ngược 5 kiến trúc phần mềm phổ biến nhất là x86, x64, ARM, PowerPCm MIPS và hàng trăm kiến trúc hiếm. Bài viết là tuyển tập các mẹo ưa thích về IDA Pro chúng ta sẽ tìm hiểu dưới đây.

131036797_3775982515792125_911534688317748928_n.jpg
Data Structure Alignment

Các trình biên dịch thường đặt các trường cấu trúc ở khoảng cách căn chỉnh là 4 hoặc 8 byte, nhưng đây không phải là trường hợp hiếm.

Giả sử mã nguồn của phần mềm được kiểm tra có cấu trúc như sau:

Mã:
struct test_s {
    char ch1;
    QWORD qw1;
};

Thông thường, một trình biên dịch sẽ đệm trường ch1 có độ dài 8 byte, điều này sẽ làm cho tổng kích thước của cấu trúc là 16 byte.

Giả sử trình biên dịch không làm điều này và bạn phải đối mặt với cấu trúc 9 byte. Một cấu trúc như vậy có thể được tạo hoàn hảo trong cửa sổ Cấu trúc (Shift + F9), nhưng nếu bạn tạo nó trong cửa sổ kiểu cục bộ (Shift + F1), kết quả cú pháp được phân tích sẽ sai:

H2.png


Giá trị của qw1 sẽ được ánh xạ tới dữ liệu sau vùng đệm được tạo, nhưng giá trị thực của qw1 nằm trong chính vùng đệm đã tạo (db 1, 2, 3,…).

Để hiển thị chính xác cấu trúc, bạn cần sửa chữa căn chỉnh bằng cách thêm chỉ thị #pragma pack (1):

Mã:
#pragma pack(1)
struct test_s
{
    char ch1;
    QWORD qw1;
};


Điều này sẽ dẫn đến việc phân tích cú pháp chính xác của cấu trúc này:

H4.png

Full-Text Search

Nếu bạn đã từng cố gắng sử dụng Ctrl + F trong IDA Pro, bạn có thể nhận thấy rằng phím tắt này chỉ hoạt động trong cửa sổ Nhập, Xuất và Chuỗi.

Đối với tất cả các cửa sổ khác, có tổ hợp Alt + T.

H5.png

Sử dụng Alt + T, bạn có thể tìm kiếm thông tin trong cửa sổ Disassembler, Pseudocode và Structures.

Rebasing Binaries

Khi bạn mở một tệp nhị phân trong IDA Pro và tệp này không ở định dạng nổi tiếng (ví dụ: ELF hoặc PE), IDA sẽ hỏi bạn về địa chỉ mà nó cần để tải tệp. Thông thường, địa chỉ này không thể được biết trước khi hồ sơ được kiểm tra.

Hãy tải một chương trình cơ sở mẫu đến địa chỉ 0x0:

H6.png

Sau khi chương trình cơ sở được tải, có ba con trỏ tới bộ nhớ chưa khởi tạo tại địa chỉ 0x04: 0x80000145, 0x800002E7 và 0x800002DF. Do đó, bạn có thể đoán rằng độ lệch ban đầu là 0x80000000.

Để tránh tải lại chương trình cơ sở, bạn nên gọi chức năng Chương trình Rebase bằng cách sử dụng Edit → Segments → Rebase và chuyển chương trình cơ sở sang địa chỉ 0x8000000:

h7.png

Điều này sẽ hiển thị chính xác phần firmware:

h8.png

Chọn và xuất dữ liệu nhị phân

Có hai phím nóng có thể giúp bạn xuất dữ liệu từ các tệp IDB:

Alt + L. Chọn vùng dữ liệu có độ dài bất kỳ
Shift + E. Xuất dữ liệu đã chọn sang các định dạng khác nhau

Sau khi bạn nhấn Alt + L, IDA bắt đầu chọn dữ liệu và sửa điểm chọn ban đầu. Điều này sẽ giúp bạn di chuyển điểm chọn đích đến bất cứ nơi nào bạn muốn.

Khi vùng cần thiết được chọn, nhấn Shift + E để xuất dữ liệu ở định dạng được hỗ trợ, chẳng hạn như chuỗi, chuỗi HEX hoặc mảng C-byte. Sau khi dữ liệu được sao chép, dừng chọn bằng cách nhấn lại Alt + L.

Các kết hợp này hoạt động trong cửa sổ Disassembler và Hex-View.

Hiển thị các ký tự chuỗi trong trình biên dịch

Một số trình biên dịch cũ và trình biên dịch cho hệ điều hành thời gian thực, thường đặt dữ liệu chỉ đọc và đọc ghi trong cùng một phân đoạn. Điều này dẫn đến một tình huống trong đó trình dịch ngược hiển thị các biến thay vì các ký tự chuỗi.

h10.png

Cách đầu tiên để khắc phục sự cố này là thay đổi kiểu biến từ char * thành const char * bằng phím nóng Y.

h11.png

Cách thứ hai là vào cài đặt trình dịch ngược (Edit → Plugins → Hex-Rays Decompiler → Options); và bỏ chọn hộp kiểm “Chỉ in các ký tự chuỗi không đổi”:

h12.png

Kết quả là, tất cả các biến chứa dữ liệu được hiển thị dưới dạng chuỗi ký tự:

h13.png

Little-Endian Code, Big-Endian Data

Một số trình biên dịch ARM tạo mã Little-Endian nhưng tạo dữ liệu ở định dạng Big-Endian.

Để hiển thị các mã nhị phân như vậy một cách chính xác, hãy chuyển đến General Options → Analysis → Processor-Specific Analysis Options → Edit kiến trúc ARM và chọn hộp kiểm “mã BE-8 (ARMB)”

h14.png

Điểm ngắt: Đặt điều kiện

IDA Pro hỗ trợ các điểm ngắt có điều kiện, bao gồm mã bằng IDC / Python được chạy ở một vị trí cụ thể.

h15.png


Lưu ý rằng mã IDC / Python có thể được chạy trong quá trình gỡ lỗi để sửa đổi các giá trị đăng ký và cả dữ liệu bộ nhớ.

Breakpoints: Disabling Stepping Support

Khi gỡ lỗi các tệp nhị phân qua máy chủ GDB trong IDA Pro thường gặp lỗi trong đó các điểm ngắt ngừng hoạt động sau khi một trong các điểm ngắt được kích hoạt thành công.

Trong trường hợp này đi tới Debugger → Debugger Options → Set Specific Options bỏ chọn check box “Use stepping support”:

h16.png

Sau khi hỗ trợ bước bị vô hiệu hóa, các điểm ngắt bắt đầu hoạt động bình thường.

Cấu hình này không được lưu vào tệp IDB. Để tắt tính năng này, hãy thêm dòng "SINGLE_STEP = 0" vào tệp cấu hình " % IDADIR% \ cfg \ dbg_gdb.cfg "

Remote Debugging: IDA Debugging Servers

IDA Pro có các máy chủ gỡ lỗi từ xa riêng cho Windows, Linux, Mac và Android. Chúng có thể được sử dụng thay cho các máy chủ GDB hoặc WinGDB thông thường.

h17.png

Các tệp này nằm trong thư mục "% IDADIR% \ dbgsrv"

Gỡ lỗi từ xa: ASLR

Nếu bạn gắn vào máy chủ GDB từ xa trên hệ thống có ASLR, IDA Pro sẽ không thể tìm thấy vị trí của bài kiểm tra nhị phân trong bộ nhớ. Do đó, IDA Pro sẽ cố gắng làm việc với các địa chỉ trỏ đến không gian bộ nhớ không hợp lệ.

Để làm cho IDA Pro sử dụng địa chỉ nhị phân thực, hãy căn cứ lại IDB trước khi gắn vào quy trình đích.

Thu gom rác trong IDAPython

Trình thông dịch Python tích hợp của IDA Pro liên tục chạy trong nền IDA và không bao giờ khởi động lại. Do đó, tất cả các biến và đối tượng bạn tạo trong mã sẽ tích lũy lại và điều này có thể dẫn đến rò rỉ bộ nhớ và các tác dụng phụ không mong muốn.

Ví dụ: hãy tạo một tệp test.py với mã sau:

Mã:
import logging

def main():
    logger = logging.getLogger('test1-script')
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('[TEST 1] %(name)s - %(message)s')
    ch = logging.StreamHandler()
    ch.setFormatter(formatter)
    logger.addHandler(ch)
    logger.debug("Log message!")

if __name__ == "__main__":
    main()

Sau khi bạn chạy tệp này hai lần, bạn sẽ thấy rằng hai trình xử lý ghi nhật ký bắt đầu hoạt động đồng thời:

H19Fix.png

Vì vậy, bạn cần phải chú ý đến mã để ngăn chặn các hành vi không mong muốn như vậy.

Trong trường hợp của lớp ghi nhật ký, tôi khuyên bạn nên sử dụng một trong các cách sau để xóa các trình xử lý:

Mã:
# Python 2/3
logging.Logger.manager.loggerDict.clear()

# Python 3
from importlib import reload
reload(logging)

# Python 2
reload(logging)

Vài mẹo IDA Pro 7.4
  • Thu gọn cài đặt biến cục bộ
Các biến cục bộ có thể được thu gọn theo mặc định nếu bạn đặt tham số COLLAPSE_LVARS thành CÓ trong tệp% IDADIR% \ cfg \ hexrays.cfg.

h21.png

Điều này từng có thể thực hiện được thông qua phím tắt Numpad + - hoặc bằng tùy chọn Collapse Declarations Khai báo trong menu.
  • Nhảy giữa các dấu ngoặc / ngoặc phù hợp
Dấu ngoặc / ngoặc phù hợp hiện được đánh dấu trong mã giả và bạn có thể nhanh chóng chuyển giữa chúng bằng phím% (Shift + 5).

h22.png
  • Sao chép mã giả vào danh sách gỡ bỏ
Phím nóng / có thể sao chép mã giả vào danh sách gỡ bỏ dưới dạng nhận xét.

h23.png

Trên đây là một vài thủ thuật có thể sẽ khác so với các phiên bản IDA Pro khác nhau nhưng tổng thể các tips này sẽ giúp bạn thuần thục trong quá trình dịch ngược debug lỗi phần mềm.

Via:....... IDA Pro website
.........Swarm
..........twitter.com/ptswarm
..........github.com/ptswarm

+ tool google dịch
 
Chỉnh sửa lần cuối bởi người điều hành:
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  • Thích
Reactions: p3t3r_p4n
Thẻ
ida pro trick ida pro
Bên trên