Meepwn-CTF-2017

  • MeePwn-CTF

MeePwn-CTF là kì đầu tiên tôi chơi CTF của MeePwn, đây là một team khá tên tuổi ở VN cũng như đấu trường quốc tế.

Ở bài viết này tôi muốn gửi đến các bạn write up của những bài mà tôi làm được trong kì MeePwn-CTF vừa rồi, dù chỉ là vài bài ít ỏi nhưng với mức hiện tại của tôi thì đó cũng là một thành công nhỏ.

1 - Simpler than RSA?

Bài này thì đề bài có cho mình một đoạn code python:
simple.py
Và một vài dữ kiện khác là public key và encrypted.

Nhìn vào hàm encrypt có thể hiểu đơn giản là cipher được mã hóa theo cách sau:

Có thể thấy c chỉ phụ thuộc vào m mà không phụ thuộc vào số được random r, mà m lại nằm trong khoản từ 0 đến 255 nên dễ dàng brute force để tìm được flag.


2 - MATH

Ở bài này thì để bài cho rất ngắn gọn chỉ gồm một file code trong đó có chú thích kèm theo cipher:
Bài này cơ bản hack được tính với công thức sau:
Vì ord() kí tự của flag dự đoán được chỉ nằm trong khoảng từ 32 đến 127 nên có thể dùng phương pháp brute force để tìm nếu biết pad nhưng vấn đề đặt ra ở đây là pad không biết giá trị là bn nên việc brute force là rất khó.
Vì pad là ước của hack mà pad lại là hash md5 của flag nên giá trị của pad nên ta có:
Từ đó tôi giới hạn được pad trong khoảng 161 giá trị.
Từ đó tôi có đoạn code brute force sau: solve.py


3 - bs

Bài này chương trình thực tế là một dạng của binary search (bs).
Mã giả của chương trình như sau:
Có các hàm cần quan tâm ở đây là:
login()
check_root() 
review()
bubble_sort() - không cần quan tâm vì chỉ là sắp xếp.
edit()
Hàm login() có mã giả như sau:

Hàm check_root() có mã giả như sau:
Hàm  review()
Hàm dubble_sort() ta không cần quan tâm đến vì chỉ là sắp xếp lại các kí tự.

Hàm edit():
Sau một thời gian đọc code tôi nhận thấy có những vấn đề sau trong chuong trình này.
  1. Có thể leak được hàm login() và check_root()
  2. Hàm review có thể xem được nội dung ô nhớ ở một địa offset từ array từ (-128 đến 127)
  3. Hàm edit có thể sửa các giá trị ở các vùng nhớ mong muốn nếu giá trị được tìm thấy có địa chỉ nhỏ hơn địa chỉ cần sửa.

array[] có địa chỉ tại: 0x0804B060

Sau đây tôi sẽ đi sâu vào phân tích 3 vấn đề vừa nêu ở trên:
  1. Hàm login để có thể là root phải nhập vào một xâu 16 kí tự trùng với xâu được đọc ra từ file /dev/urandom điều này là không thể thế nên tôi chỉ có thể can thiệp vào giá trị trả về của hàm.
    Ở hàm check_root ta thấy lệnh: if ( !(_WORD)a1 ) chỉ kiểm tra giá trị của 2 byte nhớ nên nếu giá trị được kiểm tra là 0xffff0000 tức là chỉ cần 2 byte nhớ thấp có giá trị đều bằng 0 thì sẽ login được dưới dạng root.
    Như thế chỉ vài bước là ta đã có thể login với root rồi.
  2. Tiếp theo hàm review() tôi thấy không có hàm kiểm tra giá trị nhập vào thế nên tôi hoàn toàn có thể nhập vào các giá trị âm để có thể xem nội dung các ô nhớ chứa địa chỉ của các hàm read, printf, puts, open, .....
  3. Ở hàm edit() chỉ cần giá trị được truyền vào là một giá trị mong muốn ( nhỏ hơn hoặc bằng offset của giá trị cần sửa ) thì ta có thể  sửa được giá trị của ô nhớ mình mong muốn rồi. Nhưng vấn đề đặt ra ở đây nếu muốn giá trị đó âm thì phải làm thế nào? Tôi sẽ giải quyết vấn đề này sau đây.
  • Nhìn lại hàm main() trong phần tìm kiếm từ dòng thứ 32 nhận thấy nếu giá trị mid lớn hơn giá trị cần tìm (so sánh số không dấu) thì sẽ tìm tiếp ở nửa dưới, giá trị mid sẽ giảm liên tiếp tới 0 thế nên nếu rơi vào trường hợp này thì mid sẽ không thể nào là số âm.
    Tiếp tục nhìn vào trường hợp còn lại giá trị mid sẽ được tăng nên nhưng vì là kiểu char (1 byte) nên sẽ bị thành số âm nếu nó > 127 như vậy ta chỉ cần tính toán để cho giá trị mid bằng offset tại vị trí cần tìm.
    Để thuận tiện tôi nhập vào mảng array các phần tử đều bằng 0 và quét các giá trị từ -50 đến -13 và thấy tại -38 có giá trị khác 0.
  • Sau khi vào được phần sửa giá trị -38 tôi bỏ qua cho đến giá trị -13 (offset của hàm scanf) tôi điền vào đây địa chỉ 0x080488CE
  • Sau đó tôi cho chương trình chạy đến hàm scanf nhưng thực tế là gọi đến hàm read() và nhập giá trị vào địa chỉ ebp-buf = ebp-0x15 ( read(0,buf,0x08048D3D)) tham số thứ 3 của hàm read không còn là 2 nữa mà thay vào đó là địa chỉ của xâu "%u"
    Như vậy tôi hoàn toàn có thể ghi đề lên địa chỉ trả về của hàm tại ebp+4
    Tôi đưa địa chỉ hàm system vào ebp+4 là địa chỉ của xâu "/bin/sh" vào ebp+12
    Như vậy là đã overflow xong rồi.
Nhưng Không!!!!!!!!!!!!!!!
 Tôi gặp một chút vấn đề trong việc file thư viện của chương trình không được ban tổ chức cung cấp. Tôi đã thử một vài file mà mình tìm được nhưng đều không phải. Tôi đã đi vào ngõ cụt, nhưng trong lúc thất vọng nhất thì tôi lại nhận được một sự trợ giúp từ team Night Storm với một tool tìm kiếm file thư viện dựa vào địa chỉ của các hàm: libc-database
Sau khi clone và chạy tôi đã tìm ra file thư viện và sử lý xong bài pwn này và qua đây tôi cũng học thêm được một thứ đó là tìm file thư viện dựa trên địa chỉ của hàm.........
Thanks Night Storm!

Link file thư viện và file solve: link
___________________________________________________

Như vậy là tôi đã viết hết những bài mà mình làm được rồi. Khá là ít ỏi nhưng cũng giúp tôi học được nhiều thứ.
Thanks for MeePwn

Comments

Post a Comment

Popular posts from this blog

Exploit deaslr through _dl_runtime_resolve

WriteUp PWN 500pts - PwC Hackaday

[Night St0rm CTF] - WRITE UP PWN