QuânSysAd's Blog: reverse
Hiển thị các bài đăng có nhãn reverse. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn reverse. Hiển thị tất cả bài đăng

04 tháng 8 2021

Tìm OEP (Original Entry Point) khi gặp cặp lệnh PUSH và RETN

 Khi gặp cặp lệnh PUSH và RETN ví dụ như dưới đây 

```

.aspack:0046B415 push    4271B0h

.aspack:0046B41A retn

```

Nó sẽ có tác dụng như lệnh JUMP là nhảy tới địa chỉ 0x2171B0 để thực thi mã code (sau khi phần code chính đã được nạp vào memory)


Đầu tiên địa chỉ này sẽ được nạp vào stack , vì thế cần tìm địa chỉ stack nơi chứa giá trị này bằng cửa sổ stack view trong IDA sau đó đặt break point read, write để bắt sự kiện thay đổi giá trị trong stack, và đặt break kèm trace để chương trình dừng ở vị trí Original Entry Point.

Vị trí trên stack thay đổi






27 tháng 7 2021

Reverse Engineering: Một số lưu ý khi thay đổi luồng thực thi

Khi thấy các câu lệnh nhảy rẽ nhánh, ví dụ là jb hoặc jnz để nhảy tới khối lệnh khác có thể thay bằng lệnh nop để không nhảy sang các nhánh không mong muốn mà sẽ thực thi tiếp theo luồng chính của chương trình.

Một cách thứ hai là đặt breakpoint ở câu lệnh nhảy và quan sát cờ ZF, nếu set cờ nảy nhảy thành 1 thì sẽ nhảy sang hướng ngược lại. Thường cờ này sẽ nhảy khi so sánh giá trị kết quả của lệnh cmp.

Ngoài ra ở chế độ debug, muốn nhảy tới lệnh kế tiếp mà không tuân theo logic flow của chương trình ta có thể dùng chức năng SetIP của IDA  để nhảy tới khối lệnh tiếp theo mà không cần patch chương trình
Như vậy có thể rút ra một kết luận là khi ta debug thì ta nên đặt các breakpoint ở trước câu lệnh rẽ nhánh và set IP ở các nhánh khác để chương trình chạy nhánh mà ta đã chọn