Post

Need For Speed

The name of the game is speed. Are you quick enough to solve this problem and keep it above 50 mph? need-for-speed.

Need For Speed

Cách mình làm

Soi source code

Đầu tiên mình sẽ thử mở file trong Binary Ninja để xem nó có gì hot

img-description Sau khi mở file với Binary Ninja

Nghịch

Mình thấy ở đây có 2 hàm get_key()print_flag() khá thú vị, nên bây giờ mình sẽ chạy thử bằng gef và đặt breakpoint xem có gì

img-description Sau khi xem source

Mình sẽ đặt thử breakpoint 2 địa chỉ là 0x555555400942 và 0x55555540094c

Flag

Sau khi mình continue 2 breakpoint này thì nó nhả flag cho mình luôn ảo vkl =)))

img-description WOW

Flag: PICOCTF{Good job keeping bus #190ca38b speeding along!}

Kết luận

Sau khi tham khảo một vài Writeup khác thì mình có kết luận như sau:

Bản chất

Chương trình khởi tạo một biến lớn rồi giảm dần trong một vòng lặp vô nghĩa để tốn thời gian; nếu chậm sẽ alarm() và crash — mục tiêu chỉ là bỏ qua vòng lặp để in flag.

Cách làm nhanh:

Debug & sửa biến tại runtime: dừng ở calculate_key, gán trực tiếp rbp-0x4 = rồi continue.

Patch tĩnh: thay lệnh mov dword [rbp-0x4], 0xd8c2… thành giá trị gần đích để vòng lặp kết thúc ngay.

Override alarm (LD_PRELOAD): ghi đè alarm()/setitimer() để vô hiệu hóa bộ hẹn giờ.Gọi thẳng print_flag() nếu có symbol — cứ gọi là xong.Kết quả: chương trình không chậm, in flag: PICOCTF{…}

Vì sao đặt 2 breakpoint lại lòi flag ra?

Breakpoint dừng tiến trình, nên SIGALRM bị trì hoãn — chương trình không bị nổ.

Debugger chèn INT3 và thay đổi timing/control-flow, khiến vòng lặp delay không hoạt động như khi chạy bình thường.

Và mình vô tình gọi print_flag() khi stop, thế là flag lòi ra =)))

Lời kết

Chúc các bạn đánh CTF vui vẻ!!!

This post is licensed under CC BY 4.0 by the author.