Đây là ghi chú cá nhân trong quá trình luyện tập, rất mong nhận được sự chỉ bảo từ các cao thủ.
Link luyện tập BUUCTF: https://buuoj.cn/challenges
[GUET-CTF2019] File nén giả mạo
Bài này là một dạng "pseudo-encryption" (mã hóa giả). Sau khi sửa lỗi, ta có thể giải nén để lấy được file key.txt.
Nội dung file là một dạng tấn công RSA với số mũ nhỏ (small exponent) và văn bản gốc nhỏ (small plaintext).
c = m^e (mod n). Giá trị c = 26. Giả sử m = 5, thử nhập vào thì sai. À, "đáp án là 5".
Tiếp theo, ta sửa đổi chiều cao và chiều rộng của file ảnh giải nén được.
Thực hiện phép XOR với khóa 5 cho nội dung file "亦真亦假" (tạm dịch: Thật giả lẫn lộn).
# Đọc dữ liệu từ file văn bản
with open('亦真亦假', 'r', encoding='utf-8') as file_input:
raw_data = file_input.read().strip()
decrypted_content = ""
for char_hex in raw_data:
try:
# Chuyển đổi ký tự hex thành số nguyên, thực hiện XOR với 5
temp_int = int(char_hex, 16) ^ 5
# Chuyển kết quả về dạng hex, đảm bảo có 1 ký tự, thêm số 0 nếu cần
decrypted_content += hex(temp_int)[2:].zfill(1)
except ValueError:
# Nếu gặp ký tự không phải hex, giữ nguyên
decrypted_content += char_hex
# Chuyển đổi chuỗi hex đã giải mã thành dạng bytes
try:
binary_data = bytes.fromhex(decrypted_content)
# Ghi dữ liệu bytes vào file mới
with open('./data.doc', 'wb') as file_output:
file_output.write(binary_data)
print("Giải mã thành công!")
except ValueError as e:
print(f"Lỗi định dạng chuỗi hex: {e}")
Kết quả thu được file data.doc.
Phân tích tần suất ký tự không cho thấy điều gì bất thường. Ta nghi ngờ đây là kỹ thuật ẩn giấu dữ liệu trong file doc. Thử sao chép toàn bộ nội dung và dán vào trình duyệt.
flag{_th2_7ru8_2iP_}
[RCTF2019]draw
Sử dụng công cụ phân tích mã nguồn để xem xét.
Mã nguồn:
import turtle
import random
# ===================== Cải tiến cốt lõi: Tự động điều chỉnh cửa sổ =====================
screen = turtle.Screen()
# Cho phép thay đổi kích thước cửa sổ và theo dõi vị trí rùa
screen.screensize(canvwidth=2000, canvheight=2000) # Mở rộng kích thước canvas
screen.setworldcoordinates(-1000, -1000, 1000, 1000) # Thiết lập phạm vi tọa độ đủ lớn
# Khởi tạo đối tượng rùa
turt = turtle.Turtle()
turt.speed(0) # Tốc độ nhanh nhất
screen.colormode(255)
# Hàm chọn màu ngẫu nhiên
def get_random_color():
color_palette = ['red', 'orange', 'yellow', 'green', 'blue', 'violet']
return random.choice(color_palette)
# ===================== Thực thi theo đúng chỉ dẫn =====================
turt.reset() # cs -> Xóa màn hình và đưa rùa về vị trí ban đầu
# pu lt 90 fd 500 rt 90
turt.penup()
turt.left(90)
turt.forward(500)
turt.right(90)
# pd fd 100 rt 90
turt.pendown()
turt.forward(100)
turt.right(90)
# repeat 18[fd 5 rt 10]
for _ in range(18):
turt.forward(5)
turt.right(10)
# lt 135 fd 50 lt 135
turt.left(135)
turt.forward(50)
turt.left(135)
# pu bk 100 pd
turt.penup()
turt.backward(100)
turt.pendown()
# setcolor pick [red orange yellow green blue violet]
turt.color(get_random_color())
# repeat 18[fd 5 rt 10]
for _ in range(18):
turt.forward(5)
turt.right(10)
# rt 90 fd 60 rt 90 bk 30 rt 90 fd 60
turt.right(90)
turt.forward(60)
turt.right(90)
turt.backward(30)
turt.right(90)
turt.forward(60)
# pu lt 90 fd 100 pd rt 90 fd 50 bk 50
turt.penup()
turt.left(90)
turt.forward(100)
turt.pendown()
turt.right(90)
turt.forward(50)
turt.backward(50)
# setcolor pick [red orange yellow green blue violet]
turt.color(get_random_color())
# lt 90 fd 50 rt 90 fd 50
turt.left(90)
turt.forward(50)
turt.right(90)
turt.forward(50)
# pu fd 50 pd fd 25 bk 50 fd 25 rt 90 fd 50
turt.penup()
turt.forward(50)
turt.pendown()
turt.forward(25)
turt.backward(50)
turt.forward(25)
turt.right(90)
turt.forward(50)
# pu setcolor pick [red orange yellow green blue violet]
turt.penup()
turt.color(get_random_color())
# fd 100 rt 90 fd 30 rt 45 pd
turt.forward(100)
turt.right(90)
turt.forward(30)
turt.right(45)
turt.pendown()
# fd 50 bk 50 rt 90 fd 50 bk 100 fd 50 rt 45
turt.forward(50)
turt.backward(50)
turt.right(90)
turt.forward(50)
turt.backward(100)
turt.forward(50)
turt.right(45)
# pu fd 50 lt 90 pd fd 50 bk 50 rt 90
turt.penup()
turt.forward(50)
turt.left(90)
turt.pendown()
turt.forward(50)
turt.backward(50)
turt.right(90)
# setcolor pick [red orange yellow green blue violet] fd 50
turt.color(get_random_color())
turt.forward(50)
# pu lt 90 fd 100 pd fd 50 rt 90 fd 25 bk 25 lt 90 bk 25 rt 90 fd 25
turt.penup()
turt.left(90)
turt.forward(100)
turt.pendown()
turt.forward(50)
turt.right(90)
turt.forward(25)
turt.backward(25)
turt.left(90)
turt.backward(25)
turt.right(90)
turt.forward(25)
# setcolor pick [red orange yellow green blue violet]
turt.color(get_random_color())
# pu fd 25 lt 90 bk 30 pd rt 90 fd 25
turt.penup()
turt.forward(25)
turt.left(90)
turt.backward(30)
turt.pendown()
turt.right(90)
turt.forward(25)
# pu fd 25 lt 90 pd fd 50 bk 25 rt 90 fd 25 lt 90 fd 25 bk 50
turt.penup()
turt.forward(25)
turt.left(90)
turt.pendown()
turt.forward(50)
turt.backward(25)
turt.right(90)
turt.forward(25)
turt.left(90)
turt.forward(25)
turt.backward(50)
# pu bk 100 lt 90 setcolor pick [red orange yellow green blue violet]
turt.penup()
turt.backward(100)
turt.left(90)
turt.color(get_random_color())
# fd 100 pd rt 90 arc 360 20
turt.forward(100)
turt.pendown()
turt.right(90)
turt.circle(20)
# pu rt 90 fd 50 pd arc 360 15
turt.penup()
turt.right(90)
turt.forward(50)
turt.pendown()
turt.circle(15)
# pu fd 15 setcolor pick [red orange yellow green blue violet]
turt.penup()
turt.forward(15)
turt.color(get_random_color())
# lt 90 pd bk 50 lt 90 fd 25
turt.left(90)
turt.pendown()
turt.backward(50)
turt.left(90)
turt.forward(25)
# pu home bk 100 lt 90 fd 100 pd arc 360 20
turt.penup()
turt.home()
turt.backward(100)
turt.left(90)
turt.forward(100)
turt.pendown()
turt.circle(20)
# pu home
turt.penup()
turt.home()
# ===================== Tối ưu hóa thêm: Cửa sổ có thể kéo/thay đổi kích thước =====================
screen.title("Draw CTF - Hiển thị tất cả các hình")
screen.setup(width=1.0, height=1.0) # Cửa sổ chiếm toàn bộ màn hình (tùy chọn)
# Giữ cửa sổ không đóng
turtle.done()
Chạy mã nguồn, ta thu được kết quả:
flag{RCTF_HeyLogo}
[GKCTF 2021] Sign-in
Thực hiện theo dõi một luồng dữ liệu bất kỳ.
Phát hiện có vẻ như đang sử dụng các lệnh của Linux.
Xuất luồng HTTP.
Kiểm tra file tmpshell(19).php:
- Chuyển đổi từ hệ thập lục phân sang ký tự.
- Giải mã Base64.
- Đảo ngược thứ tự từng dòng.
- Giải mã Base64 từng dòng.
Kết quả thu được: ffllaagg{{}}WWeellcc))XX[Xóa] [Xóa] 00mmee__GGkkCC44FF__mm11ssiiCCCCCCCCCCCC!!
Sắp xếp lại và loại bỏ các ký tự trùng lặp, ta có:
flag{Welc0me_GkC4F_m1siCCCCCC!}
[CFI-CTF 2018] webLogon capture
Truy cập vào một gói tin mạng bất kỳ.
Có vẻ như đang thực hiện tấn công dò mật khẩu. Sau khi xem xét, hầu hết các lần thử đều báo mật khẩu sai. Tuy nhiên, quan sát kỹ ta thấy các mật khẩu này dường như giống nhau.
Chuỗi mã hóa: %20%43%46%49%7b%31%6e%73%33%63%75%72%33%5f%6c%30%67%30%6e%7d%20
Sau khi giải mã URL, ta thu được: CFI{1ns3cur3_l0g0n}.
Flag là: flag{1ns3cur3_l0g0n}.