Tesla123
VIP Members
-
25/03/2014
-
7
-
141 bài viết
[writeup] 31c3ctf mynx
Đây là một bài khá hay, mình phải mấy mấy tiếng đồng hồ để phân tích code.
Đầu tiên chương trình tổ chức bộ nhớ, cấp phát như sau:
Cấp phát 1 vùng nhớ 0x1000 bytes đầu tiên, và set 4 byte kế tiếp là length (1)
Vùng nhớ 0x1000 bytes này được chia nhỏ ra 16 phần, 1 phần là 256 bytes.
Nếu vùng nhớ 0x1000 bytes này hết , chương trình sẽ tạo 1 vùng nhớ khác tiếp theo như (1)
Cấu trúc của một ascii art được phân bố như sau:
Cấu trúc của một comment được phân bố như sau:
Xem xét đoạn mã sau:
Sau khi tạo 1 block comment, chương trình đọc vào vùng content với giá trị là 252 bytes (lố 1 byte) dựa vào đây mình sẽ khai thác được lỗi, ghi đè giá trị tag của block kế, biến block comment -> block ascii art, từ đó fake được filterfunc.
đoạn mã trên dùng để trigger bug khi biến block comment -> block ascii art
Các khai thác lỗi:
Trigger bug và ta có
Do mình có thể control được filter_func và content, cho nên mình sẽ dùng printf và fmt để leak được địa chỉ __libc_main_start ở trên stack, từ đó tính được địa chỉ của hàm system
Đầu tiên chương trình tổ chức bộ nhớ, cấp phát như sau:
Cấp phát 1 vùng nhớ 0x1000 bytes đầu tiên, và set 4 byte kế tiếp là length (1)
Vùng nhớ 0x1000 bytes này được chia nhỏ ra 16 phần, 1 phần là 256 bytes.
Nếu vùng nhớ 0x1000 bytes này hết , chương trình sẽ tạo 1 vùng nhớ khác tiếp theo như (1)
Cấu trúc của một ascii art được phân bố như sau:
PHP:
struct ascii_art{
char tag; // tag của ascii_art có giá trị bằng 'I'
int id;
void (*filter)(char* content);
char content[247];
};
PHP:
struct comment{
char tag; // tag có giá trị bằng '7'
int id;
char content[251];
}
Xem xét đoạn mã sau:
Sau khi tạo 1 block comment, chương trình đọc vào vùng content với giá trị là 252 bytes (lố 1 byte) dựa vào đây mình sẽ khai thác được lỗi, ghi đè giá trị tag của block kế, biến block comment -> block ascii art, từ đó fake được filterfunc.
đoạn mã trên dùng để trigger bug khi biến block comment -> block ascii art
Các khai thác lỗi:
PHP:
Tạo 1 block ascii art, tạo 2 block comment cho block ascii 1 , tạo block ascii art 2
+----------------------+
| Ascii Block 1 |
+----------------------+
| comment 1(1) |
+----------------------+
| comment 2(1) |
+----------------------+
| Ascii Block 2 |
+----------------------+
Xóa hết comment block 1, tạo lại comment cho block 1 và block 2, dùng comment block 2, overwrite giá trị tag của Ascii Block 2 thành comment, dùng comment block 1 để overwrite comment block 2 thì Ascii Block 2
+----------------------+
| Ascii Block 1 |
+----------------------+
| comment 1(1) |
+----------------------+
| comment 1(2) |
+----------------------+
| Ascii Block 2 |
+----------------------+
Trạng thái cần đạt được
+--------------------------------+
| Ascii Block 1 |
+--------------------------------+
| comment 1(1) |
+--------------------------------+
| comment 2(1),block 2 fake |
+--------------------------------+
| Ascii Block 2, comment 2 fake |
+--------------------------------+
Trigger bug và ta có
Do mình có thể control được filter_func và content, cho nên mình sẽ dùng printf và fmt để leak được địa chỉ __libc_main_start ở trên stack, từ đó tính được địa chỉ của hàm system
Chỉnh sửa lần cuối bởi người điều hành: