What's new
Tiêu Dật Tài / Forum

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Manual Unpack UPX PE File

tieudattai

Administrator
Staff member
UPX (Ultimate Packer for eXecutables) là một Packer, dùng để pack file thực thi giúp giảm kích thước và tránh bị phát hiện bởi AntiVirus đối với malware.

Trong toàn bộ bài này, Mình sử dụng phần mềm DroidCamApp.exe làm sample.

Các tool

  • IDA
  • Lord PE
  • Scylla
  • CFF Explorer
QUÁ TRÌNH PACKED PE FILE

packing.png

Quá trình pack

  • Nén và mã hóa các sections trong file PE gốc để đưa vào sections UPX0, UPX1 trong packed file.
  • Thêm Unpacking Stub (Đoạn mã dùng để giải nén và giải mã các sections bị nén và mã hóa) vào cuối section UPX1.
  • Đối với Resource section vẫn giữ nguyên, hơn nữa còn thêm 1 phần dữ liệu đại diện cho vùng import giúp Window Loader load đúng các thư viện dll cần thiết cho file gốc lên bộ nhớ.
  • Sau khi pack xong, entry point mới sẽ chỉ đến địa chỉ dòng code đầu tiên của Unpacking Stub.
1-1.png
new_entrypoint.png

QUÁ TRÌNH UNPACK

Thực chất toàn bộ dữ liệu nén và Unpacking Stub đều nằm ở section UPX1, UPX0 chỉ là các byte 0x0. Nếu nhìn vào CFF Explorer, Cả 2 section nằm chung tại vị trí raw address trên disk (UPX0 không chiếm bất kì không gian nhớ nào). Khi được load lên memory, UPX0 được load lên trước và toàn gồm bytes 0x0, UPX1 được load lên ngay sau UPX0, đoạn Unpacking Stub nằm sau cùng của UPX1 trên memory. Khi Unpacking Stub unpack dữ liệu sẽ ghi đè vào vùng nhớ được load của UPX0 theo chiều tăng của bộ nhớ. Mục đích là để trong quá trình Unpack không có sự ghi đè lên phần code đang thực thi.

Unpack được thực hiện bởi Unpacking Stub

  • Giải mã và giải nén các sections trong UPX0, UPX1
  • Resolving Imports
  • Trả entry point lại về cho chương trình ban đầu
Mở file bị Pack bằng IDA với lựa chọn “Manual load”

Phần giải mã và giải nén + Resolving Imports là của Unpacking stub, Việc của ta là tìm đoạn Tail jump (đoạn nhảy đến entry point gốc) bằng công cụ Graph trong IDA (F12).

graph.png
Unpacking Stub Graph
tail-jump-1.png
Tail Jump
Có 2 Tail Jump ở cuối Unpacking Stub. Nhưng chỉ có 1 cái nhảy đúng tới Entry point của file gốc là cái bên trái. Entry point gốc là 0x436FED. Đặt Break point vào lệnh Jmp

image.png

Sau khi chạy thì file đã được unpack thành công trên memory.

compare.png
Sau và trước khi unpack thành công
Việc của ta bây giờ là Dump Memory ra Binary. Sử dụng tool LordPE

dump-1.png
LordPE
Sau khi dump thành công, ta được file dumped.exe. Chạy thử file đó nhưng báo lỗi

dump_fail.png

Lỗi do 2 nguyên nhân: Entry point chưa thay đổi, chưa xử lí import table.

UPX trong quá trình pack đã lấy đại diện 1 hàm trong mỗi dll để giữ trong bảng Import của UPX tạo ra, giúp trình Window Loader khi load file PE lên memory có thể ánh xạ luôn các file dll lên bộ nhớ. việc của Unpacking Stub là tìm địa chỉ của các hàm cần thiết trong quá trình chạy rồi điền lại vào Import Address Table.

compare-1.png

Rõ ràng việc gọi hàm của thử viện ngoài là tĩnh (nằm trong code không thể thay đổi được) và thông qua bảng Import Address Table. Để chương trình gọi được các hàm ở thử viện ngoài thì Import Address Table phải được điền chính xác.

Lí do sau bước dump ta không chạy được bởi vì Import Address Table đã được điền bởi Unpacking Stub ở phiên làm việc trước. Nhưng do đặc điểm Window Loader, khi load dll lên bộ nhớ, mỗi lần load lại có địa chỉ khác nhau do vậy mỗi khi chạy, Window Loader phải điền lại Import Address Table. Nhưng file bị pack lại chỉ đến 1 Import Address Table khác khiến Window Loader không thể điền vào đúng Import Address Table được. Vì vậy ta phải sửa sao cho file dumped.exe của chúng ta chỉ đến Import Address Table gốc của nó. Để làm điều đó ta có công cụ Scylla

scylla-1.png
Scylla
Fix Dump và chọn file dumped.exe. Quá trình Resolve Import Address + fix OEP hoàn tất. File sau khi sửa đã chạy được. Quá trình Manual Unpacking hoàn tất.

Trên đây là những hiểu biết của tôi về UPX và cách để thực hiện Unpack thủ công. Kỹ thuật này là nền tảng để giúp các REer nghiên cứu các kỹ thuật Pack khác. Cảm ơn mọi người đã quan tâm theo dõi.

RE – VNMSEC
 

DouglasOceah

New member
I’ve started using CBD gummies like https://www.cornbreadhemp.com/products/cbda-oil , and they’ve made a noticeable disagreement in my routine. They’re easy to basis, motif great, and require a unembellished modus operandi to unite CBD into my day. I’ve found they support me moderate and improve my catch after a extensive period, which has been a stupendous benefit. The in keeping CBD dosage in each gummy is a noteworthy with an increment of in return managing intake. If you’re making allowance for CBD, gummies are an remarkable election to start with—proper draw up sure you determine a trustworthy brand looking for the most outstanding results!
 
Top