PicoCTF - Beginner picoMini 2022

OK xin chào mọi người, vừa mới hôm qua thôi có 1 anh đã giới thiệu cho mình một event có tên là Beginner picoMini 2022 của picoCTF. Đây là event dành cho những người mới bước chân vào con đường hacking với những thử thách rất hay và đa dạng giúp chúng ta hiểu sâu hơn về lập trình, linux, ... những thứ vô cùng quan trọng trong ngành an ninh mạng nói riêng và công nghệ thông tin nói chung.Và ngày hôm nay mình sẽ chia sẻ cho mọi người cách mình giải nó nha.

1) Codebook:

Với challenge đầu tiên họ cho chúng ta hai file: 1 file python và 1 file txt và họ yêu cầu chúng ta chạy đoạn mã python với đường dẫn của file txt. Với yêu cầu này chúng ta cần thực hiện hai việc:

  • Download hai file về máy
  • Chạy code
Ở đây mình sẽ sử dụng Visual Studio Code để mở những thứ liên quan đến python và notepad để mở txt:


Với đoạn code này chúng ta có thể thấy được 1 số thứ quan trọng: thứ nhất là file không có lỗi syntax nào - 1 điều kiện cần để có thể chạy chương trình, và thứ hai là ở dòng thứ 14 codebook.txt chưa có đường dẫn rõ ràng, và bây giờ việc của chúng ta chỉ là sửa lại dòng số 14 và chạy chương trình:


First blood!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

2) convertme.py:
Với thử thách này họ cũng cho chúng ta một file python cùng tên, vậy thì download về và phân tích thôi....:


Ok và chúng ta bắt đầu phân tích nào, ở đây chúng ta thấy từ dòng số 21 trở đi là đoạn để in flag ra, và đồng thời ta có thể biết được rằng là đây là chương trình chuyển từ cơ số 10 sang nhị phân, và chắc chắn nếu mình chuyển đúng thì sẽ in ra flag, còn không thì sẽ in ra đoạn except ValueError. Việc của ta chỉ cần nhập dạng nhị phân của cơ số 10 bất kì thôi là xong:


Double kills!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

3) fixme1.py:
Cũng lại là 1 đoạn mã python và không còn cách nào khác, tải về và phân tích thôi:


Ta có thể dễ dàng thấy được đoạn code cuối cùng bị lỗi, vậy nguyên nhân là do đâu? Rất đơn giản thôi, nếu như các bạn đã và đang học Python thì chắc chắn các bạn sẽ biết đến lỗi thụt lề, ngay trong này ta có thể thấy lệnh print bị lệch đi mà theo như lí thuyết thì print trong trường hợp này sẽ nằm sát lề bên trái, vậy việc của chúng ta chỉ việc chỉnh lại print sang lề bên trái:


Triple kills!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

4) fixme2.py:


Yeah, lại kiến thức cơ bản, chúng ta có thể dễ dàng biết được lỗi sai ở đâu, đó chính là dấu bằng ở dòng số 22, trong câu điều kiện thì đúng của nó phải là == chứ không phải là =, sửa và chạy code nào:


Quad kills!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

5) Glitch Cat:

Khác với các thử thách trước đó, thử thách này họ cho chúng ta 1 dòng như sau: nc saturn.picoctf.net 52680. Nhìn phát các bạn biết ngay là gì rồi đúng không, lệnh này writeup nào mình cũng dùng luôn, đó chính là lệnh netcat trong Linux, và dòng này có nghĩa chúng ta phải dùng linux để kết nối đến địa chỉ đã cho:


Ồ, flag này, nhưng nó vẫn chưa đúng định dạng, và ta lại thấy ở đây các dòng đằng sau đều có cấu trúc: chr(hex). Cho những bạn nào chưa biết thì lệnh chr là lệnh in ra những kí tự đại diện cho 1 mã ASCII nào đó, và trong trường hợp này chúng ta chỉ cần ném tất cả đoạn chr vào lệnh print của python:


Xong, đây chính là phần còn lại của flag mà chúng ta cần tìm, ta lần lượt ghép các mảnh ghép lại và ta thu được quà tặng cuộc sống.... à nhầm flag

Mega kill!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

6) HashingJobApp:

Ở đây ta lại thấy giống với challenge 5 ở đoạn nc, và bây giờ mình sẽ thử kết nối đến server xem có gì hay không:


Ò ở đây ta thấy rằng yêu cầu của họ là chuyển 1 từ nào đó sang định dạng md5, và chắc chắn rồi là khi các bạn trả lời đến 1 câu hỏi thứ n + 1 thì nó sẽ in ra flag, và mình sẽ sử dụng trang https://www.md5online.org/md5-encrypt.html để encrypt từ đó sang md5:


7) PW Crack 1:

Với thử thách này chúng ta sẽ có 1 file python và file chứa flag:


Ta dễ dàng thấy được file chứa flag có tên level1_flag.txt.enc và thứ hai là điều kiện để in ra flag là user_pw phải bằng e9e8 mà user_pw là đầu vào của người dùng được nhập từ bàn phím. Vậy nên việc của ta bây giờ là:
  • Chỉnh sửa đường dẫn của file flag
  • Nhập password sao cho tương ứng với điều kiện

8) PW Crack 2:


Với những kinh nghiệm từ bài trên thì chúng ta rất dễ dàng giải được bài này:
  • Chỉnh đường dẫn file flag
  • Nhập password sao cho tương ứng với điều kiện
Và ta thấy ở đây chỉ có một chút xíu khác biệt là user_pw thì bị thay thế bằng 4 cái chr(hex) cộng vào với nhau. Nhưng mà nó cũng chẳng thể làm khó các bạn được, các bạn chỉ cần print cái user_pw ra xem nó ra kết quả như nào, từ đó thì mình nhập vào thôi là xong:


9) PW Crack 3:

Với thử thách này sẽ khác hơn 1 chút là chúng ta sẽ có thêm 1 file hash, và như mình đã nói, nó không khó, nó vẫn dựa trên hai nguyên tắc mình nêu trên và bây giờ mình sẽ giải cho các bạn xem nha:


Vẫn nguyên như cũ, chỉnh lại đường dẫn thay vì của 1 file thì là hai file, và ở đây có 1 sự khác biệt nho nhỏ là ở dòng cuối cùng của đoạn code có 1 mảng tên là pos_pw_list. Vậy các bạn biết phải làm gì rồi đó, BRUTE FORCING!!!!!!!!!! Ở đây mình sẽ sửa đoạn code 1 chút, thay vì mình ngồi tìm từng cái 1 thì mình sẽ dùng luôn vòng lặp, chạy từng phần tử trong mảng pos_pw_list, gắn vào user_pw và xóa điều kiện else đi để tránh rối mắt - sau khi xóa else thì màn hình chỉ in ra flag mà không in ra else, rất dễ nhìn cho các bạn:


10) PW Crack 4:

Cũng tương tự như trên nhưng mảng chứa password có 100 phần tử. Và như mình nói ở trên, vòng lặp đi:


11) PW Crack 5:

Cũng như vậy, chỉ khác hơn là có dictionary. Vậy thì với việc có dictionary thì chắc chắn các bạn sẽ không thể nào ngồi brute từng cái 1 bằng tay được rồi, ai rảnh đâu mà ngồi test từng cái 1 một cách thủ công. Thời đại tự động hóa hết rồi, vòng lặp đi. Và với trường hợp này ta chỉ cần thêm 1 cái là tạo đoạn mã mở file dictionary và chạy vòng lặp cái file đó là xong:


12) runme.py:

Thử thách này cũng không có gì, flag ở trong đó luôn rồi, chỉ là họ bảo mình chạy chương trình ở chỗ khác thôi:


13) Serpentine:


Một đoạn code khá dài, và mình thấy ấn tượng khi họ cố vẽ ra hình con rắn :)))
Rồi vào vấn đề chính này, khi mình đọc qua code thì mình thấy có chỗ này vô cùng vô lí:

 
Các bạn có thể nhìn thấy là có 1 dòng là "b) Print flag". Đồng thời các bạn lại thấy ở câu điều kiện if choice = b thì lại không thấy chức năng in flag đâu. Vậy tức là khả năng hàm in flag bị đặt sai chỗ, và nhiệm vụ của chúng ta chỉ việc tìm và xếp nó vào đúng chỗ:


OK, vậy là mình đã hoàn thành toàn bộ event Beginner picoMini 2022 của picoCTF. Bản thân mình nhận thấy event này cải thiện kĩ năng lập trình cho các bạn rất là tốt, nên các bạn có thể tự làm lại event này để nâng cao tay nghề code nha. Bye bye mọi người và buổi tối vui vẻ nha !!!!!!!!!!!






















































Nhận xét

Bài đăng phổ biến