1005 words
5 minutes
PicoCTF Reverse Challenge - PicoGym Exclusive Part#1.

Năm nay là năm cuối của mình và mình nghĩ rằng việc làm một website nhỏ để viết những trải nghiệm của bản thân qua nhiều năm học và thực chiến khá là quan trọng nên website này được tạo ra để phục vụ cho điều đó.

Mình đã giải qua những bài này sau 2 năm chỉ học lý thuyết và cẩm thấy các challenge này khá là ổn cho việc bắt đầu học Reverse Engineering. Mong là nó giúp ích được cho bạn nếu bạn là một người mới bắt đầu chơi mảng này O_o!

Các chall mà mình đã solved trước đó: alt text

# ASCII FTW#

alt text

Static analysic#

Bước đầu tiên cần kiểm tra dạng file:

alt text

ELF 64-bit LSB: Đây là dạng file thực thi tiêu chuẩn chạy trên Linux.

PIE executable: Position-Independent Executable. Nó giúp randomize các base-address nhị phân bởi ASLR mỗi lần chạy.

Not Stripped: Khi nó không được bật thì các symbol table sẽ được giữ nguyên và dễ nhận diện các hàm hoặc các function hơn.

Tiếp theo là đọc qua strings bên trong file:

alt text

Có vẻ không có hint hay flag nằm ở đây nên mình sẽ khoan dùng các tool để tiếp tục phân tích tĩnh mà thay vào đó mình sẽ quyết định chạy file để xem qua trước:

alt text

Tiếp tục đọc qua hàm main nhằm kiểm tra các instruction của file thì có vẻ đúng như nó đang cố nói tới flag là các mã hex bên trong của main

alt text

Mình khá thích python vì khi sử dụng nó dạng REPL(Read-eval-print loop) giúp việc tăng tốc độ phân tích - ở đây mình sử dụng nó để kiểm tra nhanh giá trị của hex đầu tiên 0x70 sang ascii thì có vẻ đây đúng là flag 'p'icoCTF

alt text

Nhờ việc xác định được điều này thì ta có thể lấy dần các hex ra để chuyển sang ascii để có được flag. Theo kinh nghiệm của mình thì các dạng bài muốn in ra dạng plain-text như này thì nên sử dụng radar2 vì đây là một công cụ phân tích tốt cho việc xử lí các dạng bài như này.

alt text

Dựa vào khả năng phân tích tốt của nó thì flag sẽ được in ra như trong hình

Flag: picoCTF{ASCII_IS_EASY_8960F0AF}

#Bit-O-Asm-1#

alt text

Tải file về và mở qua Notepad(opt) để đọc bên trong file.

Đây là một bài cơ bản của assembly code - mov instruction

Hint: As with most assembly, there is a lot of noise in the instruction dump. Find the one line that pertains to this question and don’t second guess yourself!

alt text

Dựa vào hint được cho thì chúng ta chỉ tập trung vào câu hỏi của đề - tìm giá trị bên trong register eax và chuyển nó từ dạng hex sang decimal

Đọc đoạn asm trên thì ta có thể chắc chắn rằng eax = 0x30 từ instruction mov eax,0x30. Chuyển 0x30 sang decimal là 48.

Flag: picoCTF{48}

#Bit-O-Asm-2#

alt text

Hints: PTR’s or ‘pointers’, reference a location in memory where values can be stored.

Tại đây thì các phần code có khác đi một chút và sử dụng một cách di chuyển các giá trị đi xung quanh trước khi tới với register eax

alt text

Để ý vào <+22> thì có vẻ eax đang được nạp vào một giá trị lạ không phải là dạng hex như bình thường!. Công việc của ta là tìm xem trước khi nó được truyền vào eax thì bên trong nó là gì?.

Sau một khoảng thời gian tìm kiếm thì có vẻ <+15> là nơi [rbp-0x4] được nạp giá trị.

<+15>: mov DWORD PTR [rbp-0x4],0x9fe1a

Sử dụng python để chuyển đổi sang decimal:

alt text

Flag: picoCTF{654874}

#Bit-O-Asm-3#

alt text

Hints: Not everything in this disassembly listing is optimal.

Ở đây thì có lẽ đã biết được sơ sơ cách hoạt động của assembly code nên mình sẽ nói nhanh qua cách phân tích bài này.

alt text

Xác định eax cho thấy nó đang nạp giá trị 0x1f5 vào trong nhưng ở đây thay vì lệnh mov thì nó lại sử dụng add, vậy thì nó là gì?.

- Add: Đây là cú pháp dùng để cộng hai giá trị lại với nhau.

Sau khi đã hiểu được thì ta nhận ra eax có chứa giá trị bên trong và cần phải truy ngược lại trước khi phép cộng được thực thi.

Để ý dòng <+15> thì thấy được 0x9fe1a được truyền vào bộ nhớ [rbp - 0x12] và tiếp tục từ đó truyền vào eax. Suy ra eax=0x9fe1a, đem nó cộng với 0x1f5 thì ta có kết quả là 0xa000f quy đổi ra dec 655375.

Flag: picoCTF{655375}

#Bit-O-Asm-4#

alt text

Hint1: Don’t tell anyone I told you this, but you can solve this problem without understanding the compare/jump relationship.

Hint2: Of course, if you’re really good, you’ll only need one attempt to solve this problem.

Đây là phần mình thích nhất: Jump

alt text

Để mà nói thì việc nhảy quanh giữa các câu lệnh khá là hay và cũng hiểu được sâu hơn về if else.

Như ba phần trước thì việc tìm eaxưu tiên. Nhờ vào chiến thuật này thì ta tìm kiếm được eax ở dòng <+41> mov eax,DWORD PTR [rbp-0x4] nhưng khi truy ngược lại thì chiến thuật này ngay lập tức bị đổ vỡ khi có đến 2 câu lệnh liên quan đến DWORD PTR [rbp-0x4].

Ta đã thấy qua mov,add,sub nhưng cmp,jle,jmp? Thắc mắc khi trong bài này lại có tận 3 cú pháp mới và bạn nghĩ bạn chưa sẵn sàng cho lượng kiến thức khổng lồ này? Tin mình đi ~ Những cú pháp này chỉ là một cú pháp nhưng được chia nhỏ công việc ra để nhằm khiến việc quản lí dễ dàng hơn.

Bạn có thể tham khảo qua đây.

Sau khi đã nắm được điều đó thì ta có thể quay lại với phần code đã tải xuống. DWORD PTR [rbp-0x4] nhận giá trị 0x9fe1a và sau đó so sánh với 0x2710.

alt text

0x2710<0x9fe1a nên thỏa mãn điều kiện jle nên tiếp tục thực thi dòng <+31> ta được kết quả là 654773 rồi sau đó nạp vào eax. Vậy eax có giá trị là 654773.

alt text

Flag: picoCTF{654773}

PicoCTF Reverse Challenge - PicoGym Exclusive Part#1.
https://stewmalwarehunter.id.vn/posts/picogym-exclusive-part1/picoctfgym1/
Author
Stew
Published at
2025-07-12
License
CC BY-NC-SA 4.0