🍑Notes - TFCCTF2023

Source

file-download
29KB
file-download
2KB

Analysis

Đọc qua source code 1 hồi tôi thấy được 1 phần không kiểm tra input:

#define CONTENT_MAX (long long)256   // <--- here
...
note_t* add() {
    note_t* note = malloc(sizeof(note_t));
    note->content = malloc(sizeof(CONTENT_MAX));  //<--- here
    printf("content> \n");
    fgets(note->content, sizeof(CONTENT_MAX), stdin);
    return note;
}
void edit(note_t* note) {
    printf("content> \n");
    fgets(note->content, CONTENT_MAX, stdin);  // <---- here
}

Tôi đoán bài này sẽ ghi đè vào những phần dữ liệu nhảy cảm trên bộ nhớ heap và có thể chỉnh sửa tùy theo ý muốn.

Set break point tại add() và edit()

Đúng như tôi dự đoán ban đầu

Nhưng làm sao để win được bài này?

Cách duy nhất là GOT overrite thằng exit@plt ---> win()

Test:

ban đầu tôi gửi như bình thường 2 index 0 và 1 sau đó tôi sửa và gửi lại 1 đoạn dữ liệu lên index 0 trong heap

Sau khi tôi gửi tiếp lần nữa ở index 1 thì nhận được lỗi trên. Thay thế dòng chữ "Kinabler" --> thành got của exit và sau đó edit lại ở index1 và gửi lên địa chỉ của hàm win. Tôi được kết quả như sau:

Full payload:

Last updated