856 words
4 minutes
PicoCTF Reverse Challenge - PicoGym Exclusive Part#2.

Phần trước mình đã solve 1 bài ascii và 4 bài về asm code để giúp cho các bạn hiểu hơn về lí thuyết cơ bản thì phần này sẽ liên quan đến cách hoạt động giữa các function và nâng cao khả năng tư duy cách khai thác nó tốt hơn ^-^.

#Picker I#

alt text

Hints: Can you point the program to a function that does something useful for you?

Đọc qua code thì nó có một số function nhưng chỉ tập trung vào 2 hàm : getRandomNumber()win()

  • getRandomNumber(): Hàm này chỉ có mỗi chức năng in ra 4 khi được gọi. Nên có thể sẽ bỏ qua
def getRandomNumber():
  print(4)  # Chosen by fair die roll.
            # Guaranteed to be random.
            # (See XKCD)

alt text

  • win(): ở đây ta thấy được flag đang nằm bên trong và khi chạy trên server thì ta có thể lấy được flag bằng cách gọi hàm win() này. Việc cần làm bây giờ là chạy và lấy flag thôi ~
def win():
  # This line will not work locally unless you create your own 'flag.txt' in
  #   the same directory as this script
  flag = open('flag.txt', 'r').read()
  #flag = flag[:-1]
  flag = flag.strip()
  str_flag = ''
  for c in flag:
    str_flag += str(hex(ord(c))) + ' '
  print(str_flag)

alt text

TIP

Luôn chạy và kiểm tra ở local trước khi thử trên server vì source code sẽ không có các file ta cần như flag.txt.

Gọi win() và ta được message như sau:

0x70 0x69 0x63 0x6f 0x43 0x54 0x46 0x7b 0x34 0x5f 0x64 0x31 0x34 0x6d 0x30 0x6e 0x64 0x5f 0x31 0x6e 0x5f 0x37 0x68 0x33 0x5f 0x72 0x30 0x75 0x67 0x68 0x5f 0x63 0x65 0x34 0x62 0x35 0x64 0x35 0x62 0x7d

alt text

Giờ thì sao? À thì … có 2 cách để bạn chọn:

  • Cách 1: Sử dụng các website convert từ hex sang ascii.

alt text

  • Cách 2 (Cách thú vị hơn): Viết code python tự convert.

Mindset: Lấy hex -> tách ra rồi cho vào list -> chuyển đổi từ hex sang ascii bằng chr()

hex = "0x70 0x69 0x63 0x6f 0x43 0x54 0x46 0x7b " \
      "0x34 0x5f 0x64 0x31 0x34 0x6d 0x30 0x6e " \
      "0x64 0x5f 0x31 0x6e 0x5f 0x37 0x68 0x33 " \
      "0x5f 0x72 0x30 0x75 0x67 0x68 0x5f 0x63 " \
      "0x65 0x34 0x62 0x35 0x64 0x35 0x62 0x7d"

print(''.join([chr(int(x, 16)) for x in hex.split()]))

Result:#

alt text

Flag: picoCTF{4_d14m0nd_1n_7h3_r0ugh_ce4b5d5b}

#Picker II#

Ở bài này thì ta biết chúng ta có thể làm gì trong này - Đó là gọi hàm để buộc nó phải in ra flag

Từ đó bài Picker II cũng vậy, tìm các để gọi hàm và ép nó phải đưa ra flag.

Trong đoạn code thì giờ đây ta đã có thêm hàm filter giúp xử lí các dữ liệu nhập vào của người dùng điều này có nghĩa là 4uth0r đang muốn ngăn ta gọi thẳng hàm win

Vậy là khống có cách nào để gọi hàm win ư? Thế thì làm gì còn cách nào để lấy được flag!

Mình khuyên bạn nên nghĩ sáng tạo hơn. Tại sao lại phải bắt buộc phải gọi hàm khi ta cũng có thể gọi các dòng bên trong nó ~

Đây là cách mình khai thác flag dựa trên các hàm con bên trong hàm win

alt text

Khi chỉ thả dòng open('flag.txt', 'r').read() vào thì bạn sẽ gặp lỗi invalid input vì trong hàm filter thì nó đang lọc một đoạn string có tên win ở bên trong nên buộc phần nhập vào cũng phải cùng dạng string. Nên cú pháp đúng phải là print(open('flag.txt', 'r').read()) mới là cú pháp chính xác biến tất cả phần code bên trong thành một dạng string.

Vậy là chúng ta đã bypass thành công phần này, giờ chỉ cần chạy trên server để lấy flag nữa thôi

Flag: picoCTF{f1l73r5_f41l_c0d3_r3f4c70r_m1gh7_5ucc33d_b924e8e5}

#Picker III#

Đây là dạng bài thứ 3 của việc tìm cách để có thể gọi được hàm. Dạng bài này sẽ hơi khác với những bài cũ là việc bạn phải thật sự hiểu code nhằm nắm được tất cả các hàm mà bạn sẽ tương tác và sử dụng nó để tạo ra lỗ hỗng.

alt text

Sau khi đọc qua các func thì đây là nơi sẽ giúp ta khai thác lỗ hổng - hàm reset_table. Tại sao ư? Việc đưa ra các hàm ifelse đã giúp mình liên kết các hàm con khi được gọi và từ đó cách khai thác lỗ hổng này như sau:

  • Khi chạy code thì ta có thể thấy được nó sẽ cho ta một số input như: quit, help, reset và 4 options khác. Mình đã thử chạy và sử dụng các options nhưng hầu như chỉ có một option duy nhất khiến mình để ý đó là write_variable. Vì mình nhận ra nó cho hầu như mọi quyền hạn mà không cần phải kiểm tra các input của user. Vậy nên mình đã thử đổi print_table với win và nó thực sự thành công!.

Cách làm như sau:

  1. Chọn opt 3 sau đó nhập print_table vào nhằm chọn nó là opt mình muốn đổi.

alt text

  1. Sau đó nhập win vào để chọn hàm ta sẽ lấy.

alt text

  1. Kết quả là một đoạn hex chứa flag.

alt text

  1. Giờ chỉ cần decode ra là xong

alt text

Flag: picoCTF{7h15_15_wh47_w3_g37_w17h_u53r5_1n_ch4rg3_c20f5222}

PicoCTF Reverse Challenge - PicoGym Exclusive Part#2.
https://stewmalwarehunter.id.vn/posts/picogym-exclusive-part2/picoctfgym2/
Author
Stew
Published at
2025-07-17
License
CC BY-NC-SA 4.0