🍜FUSec - Brainf***

Explain:

Nhìn vào hàm brain_run có thể thấy 2 phần có chứa 1 lỗi overflow:

2 hàm case trên đều chứa lỗi không kiểm soát tốt buffer. Mà 2 con trỏ kia đều thuộc phân vùng heap.

Vậy nên ta có thể sử dụng 1 lỗi đó là Heap Overflow để khai thác.

Đây là phần tính size để overflow:

Nhưng làm thế nào để Overflow?

Thì do đây là phép nhân nên ta lấy 2 số đủ lớn thì allocated_block sẽ cực nhỏ (Unsigned Integer Overflow).

Sau đó chương trình còn malloc thêm cả đoạn code brainf*** nên ở đây mình cho size của nó cực lớn để nó sử dụng nmap thì sẽ không chèn vào giữa 2 chunk_pointer và object.

Attack:

  • Đầu tiên là in ra để leak mmapheap để khi overwrite sẽ không bị lỗi

  • Dựa vào đoạn code này thì overwrite machine->data_pointer thành elf.symbols['puts']

  • Setup các got sao cho malloc->system và gọi về exit->main

  • Khi malloc dã thành system thì làm cho allocated_size trỏ đến địa chỉ của /bin/sh là được. Ở đây mình set /bin/sh ở trên heap.

  • Sửa got

  • Get shell

circle-info

Lưu ý: Mình thấy libc.so.6 của đề bài cho bị sai do address local khác với address remote. Bạn có thể sử dụng file ở bên dưới.

Result:

Full Payload:

File:

file-download
2MB
file-download
7KB
file-download
17KB

Last updated