[NT230]PE file Injection
Đây là một bài viết phục vụ cho môn "Cơ chế mã độc" của mình bằng tất cả những gì mình tìm hiểu được. Enjoy it!!!
Last updated
Was this helpful?
Đây là một bài viết phục vụ cho môn "Cơ chế mã độc" của mình bằng tất cả những gì mình tìm hiểu được. Enjoy it!!!
Last updated
Was this helpful?
Vào một ngày đẹp trời dựa trên tìm hiểu được từ reference trên và có tham khảo source code trên mạng và đặc biệt là một tiền bối khóa trên mà ngay cả em cũng không biết tên :< Cuối cùng sau vài giờ đọc hiểu và cắt ghép các soucre trên (không đụng tay vào code) em đã tạo được 1 mã nguồn mở dùng để chèn, xóa section của 1 pe file
.
Sau đây mình bắt đầu inject file putty.exe
Ở đây chúng ta sẽ quan tâm 2 việc:
Tìm hiểu các bước thêm 1 section
Đảm bảo chương trình vẫn hoạt động bình thường
Dưới đây là cách chương trình hoạt động trước và sau khi injected.
Có 2 cách để chúng ta inject vào 1 pe file
:
Tạo mới section, gán shellcode vào section đó (sẽ làm tăng kích thước pe file
)
Chèn vào giữa những section trống (code cave) (cách này không làm tăng kích thước pe file
nhưng không cẩn thận sẽ làm cho chương trình broken)
Tại bài này sẽ hướng dẫn đơn giản là tạo section mới và tạo shellcode thế nào khi chạy xong sẽ không thoát mà sẽ jump lại entry point gốc.
Sử dụng Stud_PE để xem thông tin của của 1 fpe file, hỗ trợ đối chiếu trong quá trình code và thực hiện việc jump lại entrypoint gốc:
Tạo một section ta gồm các bước:
STEP 0x01 - Resize lại file exe
STEP 0x02 - Thêm section header mới
STEP 0x03 - Định nghĩa lại header
STEP 0x04 - Inject shellcode vào section mới tạo
Lúc này file inject được lưu mới là putty66_0.exe và nhớ lưu ý đến Original Entry Point vì sẽ cần khi thực hiện đảm bảo chương trình hoạt động bình thường.
Để tương quan ta so sánh 2 shellcode được sưu tầm (cùng chức năng pop-up lên một thông báo):
Shellcode1: Sau khi kết thúc section là xong thoát khỏi chương trình
Shellcode 2: Sau khi kết thúc thì y "cố gắng" jump tới 1 nơi để chương trình được chạy bình thường
Chú ý đến 6 byte cuối của shellcode1 và 7 byte cuối của shellcode2
Vậy khác nhau gì ở đây??? Hãy xem assembly của 2 shellcode:
Như vậy, ta thấy rằng ở shellcode2 vì "cố gắng" để chương trình hoạt động bình thường nên nó jump tới 1 địa chỉ là 004550F0 (có lẽ là entry point của section 1 của pe file nào đó của người tạo trên mạng).
Đặc điểm chung của 2 shellcode trên là sau khi inject vào thì chương trình vẫn dừng sau khi pop-up thông báo lên. Nhưng ở shellcode2 dừng là vì jump đến 1 địa chỉ không có tồn tại.
Việc của ta sẽ làm là sửa lại địa chỉ jump tới khi kết thúc của shellcode2.
Để biết được jump tới đâu thì ta nhớ lại Original Entry Point ở phía trên:
Vậy mình sẽ sửa 7 byte cuối của shellcode2 thành \xB8\xb0\x4e\x05\x00\xFF\xD0
Kết quả thật ngạc nhiên :))))) Không chạy mọi người ạ :< (Trường hợp này bạn mình thành công khi sử dụng hđh linux
và phần mềm hỗ trợ wine
)
Sau khi mình tìm hiểu thì biết được rằng muốn jump đến entrypoint thì sử dụng địa chỉ sau:
EntryPoint (raw) + ImageBase = 0x00054EB0 + 0x00400000 = 0x00454EB0
Để xem được EP raw và ImageBase thì sử dụng Stud_PE:
7 byte cuối là \xB8\xb0\x4e\x45\x00\xFF\xD0
Và kết quả done chạy thành công!!!
Để ngoài việc xóa section ta cần phải gán lại entry point cho chương trình như ban đầu.
Xóa thành công!!!
Tại phần này em dùng msfvenom để tạo shellcode
Kết quả:
Sửa 6byte cuối thành 7byte như sau: \xB8\xb0\x4e\x45\x00\xFF\xD0