Cha nào rảnh đi cướp acc umamusume trong ctf v =)))) Ok nay cùng nhau giải bài CTF này nhé !

image.png

  1. Coi File pref.pcap :

    Giao diện chính của wireshark

    Giao diện chính của wireshark

    “W” chat , chúng ta có 9888 hàng dữ liệu ở đây . Protocol là USB ⇒ có khả năng là các thiết bị ngoại vi như chuột hoặc bàn phím ,…

    image.png

    Ở cột Info chúng ta có dữ liệu là URB_INTERRUPT in ⇒ search gg trên mạng có tấm ảnh dưới , nó là transfer-type , URB_INTERRUPT IN = yêu cầu host đọc dữ liệu interrupt từ thiết bị USB ( có lẽ là chuột hoặc là bàn phím =))) này tôi phải ngồi mò )

    image.png

    image.png

    Đây là phần data của 1 cái dữ liệu tôi bắt được ,thường là nó sẽ hiện URB id: keyboard/mouse ,nhưng ở đây nó ko hiện gì cả nhưng chúng ta có 1 cách nữa là đọc Leftover Capture Data

    Ví dụ ảnh trên ta có là : 01 00 00 00 00 00 00

    image.png

    dựa vào bảng này mà tui lụm được ở tài liệu này (https://www.usb.org/sites/default/files/documents/hid1_11.pdf ) thì mình sẽ đọc được là

    2 số đầu là phím chuột , 2 số tiếp theo là vị trí của X , 2 số tiếp theo là vị trí của Y , từ 2 số tiếp theo đến hết là đặc trưng thiết bị kiểu như firmware , setting lưu trong chip nhớ , bla bla ( có gì anh em google có hết nhé <(”) )

    Bây giờ câu hỏi là làm thế nào để tìm được flag ?

    ok bây giờ mình đi xuất hết dữ liệu của 9888 dòng này nhé :

    Dùng lệnh :

    tshark -r pref.pcap -T fields -e usb.capdata

    và chúng ta có 1 đống data ở dưới :

    image.png

    Lúc tôi giải thì chưa biết xử lý thế nào với đống này , nên là tui đã dùng tạm con Claudie , và chúng ta có cái này :

    image.png

    Cha admin viết xấu vc , Flag là : ECSC{wh4t_c0l0ur_15_th3_fl4g}

    Tham khảo thêm vibing code của Cha Admin :

    import matplotlib.pyplot as plt
    import struct
    
    x, y = 0, 0
    strokes, current = [], []
    scale, spacing = 1.5, 150
    
    with open("data.txt", "r") as f:
        for line in f:
            line = line.strip()
            if len(line) < 14:
                continue
            
            data = bytes.fromhex(line)
            dx = struct.unpack('<h', data[2:4])[0]
            dy = struct.unpack('<h', data[4:6])[0]
            
            new_x, new_y = x + dx, y + dy
            dist = (dx**2 + dy**2)**0.5
            
            if dist < 50:
                current.append((new_x * scale, -new_y))
            else:
                if current:
                    strokes.append(current)
                    x += spacing
                current = [(new_x * scale, -new_y)]
            
            x, y = new_x, new_y
    
    if current:
        strokes.append(current)
    
    plt.figure(figsize=(20, 10))
    for stroke in strokes:
        if len(stroke) > 2:
            xs, ys = zip(*stroke)
            plt.plot(xs, ys, linewidth=2, color='blue')
    
    plt.axis('equal')
    plt.grid(True, linestyle='--', alpha=0.5)
    plt.title("Khôi phục Flag - CTF Challenge", fontsize=16, fontweight='bold')
    plt.show()
    

    kết luận đây là đây là mouse movement CTF ( vẽ hình r capture = wireshark )

    tham khảo thêm tại đây:

    https://github.com/WangYihang/USB-Mouse-Pcap-Visualizer/tree/main?tab=readme-ov-file

    và thế là bạn đã giải thành công mật mã Extra #1

    written by s3n_ch4n

    CatOrangeCatGIF.gif