Viết giải cho bài toán Reverse 'awa-jelly' tại vsCTF 2024

vsCTF là một trong những cuộc thi quốc tế mà tôi có thể tham gia, và đây là một bài toán reverse khá thú vị.

Bài toán JellyCTF có một số thử thách tuyệt vời về Jelly Hoshiumi, một trong số ít VTuber yêu thích CTF. Được truyền cảm hứng từ một thử thách, tôi đã tạo ra một bài dựa trên AWA5.0. Bạn có thể tìm thấy đầu vào bị che giấu nào khớp với ảnh chụp màn hình không?

Trình biên dịch AWA5.0 trực tuyến

Giải pháp chính thức

Đi xem thử ngôn ngữ AWA này là gì, kỳ dị thật. Ban đầu tôi nghĩ nó chỉ là một cách mã hóa đặc biệt, nhưng không, nó còn hơn thế.

Sau khi xem qua tài liệu và video chính thức, tôi đã vỡ mộng.

Video giới thiệu AWA

Kỳ dị thật. Điều này có nghĩa là chúng ta phải thực hiện các bước sau với đoạn mã AWA dài dòng và khó chịu này:

  1. Bỏ phần tiền tố "awa" ở đầu.
  2. Chuyển đổi AWA thành nhị phân, "awa" đại diện cho 0, "wa" đại diện cho 1.
  3. Nhị phân chuyển sang thập phân.
  4. Dựa vào bảng dài dòng này để liệt kê lệnh.
  5. Chuyển đổi chuỗi tương ứng dựa trên bảng awascii (Đúng rồi, nó tự định nghĩa một cách mã hóa, thay thế ASCII chỉ còn là vấn đề thời gian (bớt đùa)).
  6. Đọc kỹ tài liệu chính thức để hiểu ý nghĩa của từng lệnh.
  7. Đảo ngược đầu vào.

Tao mệt quá, làm cái này thì chịu không nổi. Hãy viết giải pháp chính thức cứng rắn trước đã, sau đó mới viết cách tôi giải bài này.

Giải pháp chính thức giống như các bước trên, chỉ cần nhìn thẳng vào lệnh.

red
pop
sbm 2
sbm 3
sbm 4
sbm 1
sbm 6
sbm 5
sbm 3
sbm 10
sbm 20
sbm 22
sbm 25
sbm 3
sbm 0
sbm 0
sbm 2
sbm 3
sbm 4
sbm 1
sbm 6
sbm 5
sbm 3
sbm 10
sbm 20
sbm 22
sbm 25
sbm 3
sbm 0
sbm 0
sbm 0
sbm 16
sbm 26
sbm 31
prn

Chú ý rằng đây là một mã hóa dịch chuyển. Viết kịch bản giải mã:

chuoi = list("1o1i_awlaw_aowsay3wa0awa!iJlooHi")
danh_sach_dich_chuyen = [2, 3, 4, 1, 6, 5, 3, 10, 20, 22, 25, 3, 0, 0, 2, 3, 4, 1, 6, 5, 3, 10, 20, 22, 25, 3, 0, 0, 0, 16, 26, 31]

for i in danh_sach_dich_chuyen[::-1]:
    if i != 0:
        ky_tu = chuoi.pop(i)
        chuoi.insert(0, ky_tu)

Giải pháp không mong muốn

Tốt, bây giờ hãy nói về cách tôi làm (chính thức quả nhiên rất 'cứng').

Chú ý rằng chuỗi "1o1i_awlaw_aowsay3wa0aa!iJlooHi" có dấu chấm than, có thể là mã hóa dịch chuyển (sự chú ý thật đáng kinh ngạc).

Do đặc tính của mật mã dịch chuyển, hãy nhập các ký tự không trùng lặp, lấy giá trị dịch chuyển tương ứng với mỗi vị trí.

Chú ý rằng, q, z, x, v sau khi nhập sẽ biến mất (Tôi cũng không biết tại sao, đừng hỏi tôi), hãy thử các ký tự khác.

Đầu vào: wertyuiopasdfghjlcbnm1234567890_

Đầu ra: jslcbnmr12u3p4d5ye67i890_gwtoafh

Viết kịch bản:

chuoi_dau_vao = 'wertyuiopasdfghjlcbnm1234567890_'
chuoi_dau_ra = 'jslcbnmr12u3p4d5ye67i890_gwtoafh'
thu_thach = '1o1i_awlaw_aowsay3wa0awa!iJlooHi'

ket_qua = [''] * len(thu_thach)
danh_sach_vi_tri = []

# Tạo một từ điển để tìm vị trí của ký tự
vi_tri_ky_tu = {ky_tu: i for i, ky_tu in enumerate(chuoi_dau_vao)}

# Lấy danh sách các vị trí dịch chuyển
for ky_tu in chuoi_dau_ra:
    danh_sach_vi_tri.append(vi_tri_ky_tu[ky_tu])

# Xây dựng chuỗi kết quả
for i, ky_tu in enumerate(thu_thach):
    vi_tri = danh_sach_vi_tri[i]
    ket_qua[vi_tri] = ky_tu

print('vsctf{' + ''.join(ket_qua) + '}')

Chắc chắn là đã 'làm ăn' thành công ヾ(≧▽≦)o

**vsctf{J3lly_0oooosHii11i_awawawawaawa!}**

Sau khi cuộc thi kết thúc, xem giải pháp chính thức của ban tổ chức, tôi đã không nói nên lời (Còn kém thì phải luyện tập nhiều hơn).

Thẻ: reverse-engineering CTF custom-language awa5.0

Đăng vào ngày 23 tháng 6 lúc 21:39