Đây là phần cuối của giải PicoGym Exclusive. Tập trung vào cách sử dụng GDB trên Linux. GDB là một tool reverse mạnh được sử dụng dưới dạng CLI và nhờ khả năng đọc tốt của nó thì hầu như bạn có thể giải hầu như tất cả các dạng bài.
#GDB baby step 1

Hints: gdb is a very good debugger to use for this problem and many others!
Tải file về và cấp quyền execute cho nó bằng lệnh:
sudo chmod +x [file]
Kiểm tra lại xem đã cấp quyền cho nó chưa. Điều này khá quan trọng vì mình từng quên check khiến cho việc phân tích bị ảnh hưởng.

Sau khi thử chạy file thì có vẻ không có gì được in ra và ngay lập tức exit code.

Sử dụng gdb nhằm kiểm tra thêm ở trong file thì như hint ta có thể có một số thông tin thông qua hàm main.

Để có thể đọc được bên trong hàm main có gì thì việc cần làm bây giờ là bung bên trong nó ra sử dụng câu lệnh disassemble [func].

Dựa vào đoạn code kia thì có thể nói rằng eax chứa giá trị 0x86342. Quy đổi qua python ta có:

Flag: picoCTF{549698}
#GDB baby step 2

Hints: You could calculate eax yourself, or you could set a breakpoint for after the calculcation and inspect eax to let the program do the heavy-lifting for you.
Đối với cảm nhận cá nhân của mình thì bài này chỉ là một phần cơ bản của việc sử dụng
breakpointvì các bài hiện tại mình được tiếp cận thì không bao giờ bạn có thể chạm đến được nó nếu không đọc được hoặc không nhận ra nó trong lúc phân tích file.
NOTEĐây là một trong những cốt lõi của các phần mềm reverse engineering.
Như bài đầu thì vẫn cấp quyền execute cho nó và chạy. Kết quả vẫn như bài đầu tiên > Không có output. Sử dụng gdb để phân tích.

Việc tính tay không ảnh hưởng tới kết quả nhưng biết cách sử dụng breakpoint sẽ giúp tiết kiệm thời gian và tránh bị tính sai khi đi qua nhiều vòng loop ở bên trong code.
Sử dụng cú pháp break [address] dựa vào trong hàm main thì ta có thể đọc được kết quả của eax ở dòng <+56>.
NOTEKhi sử dụng
breakthì cần phải cho nó ở trước đoạn code mình muốn lấy kết quả - vì nó phải ở trong khoảngbreak.
Ta sẽ break ở dòng <+59> nhằm lấy dữ liệu ở dòng trên.
Sau đó dùng print $register để in ra kết quả:

Flag: picoCTF{307019}
#GDB baby step 3

Ở đây sẽ liên quan tới memory layer vì lần này author cố tình giấu đi flag vào trong memory của hàm
main.
TIPĐể hiểu được về phần này thì mình khuyên bạn nên đọc qua trước về Endianess giúp hiểu hơn tại sao nó lại tồn tại giữa Big-endian(BE) và Little-endian(LE)
Bắt đầu với việc phân tích hàm main thì đúng như đề đã nói thì 0x2262c96b đã được load vào trong eax.

Break ở đúng nơi và bắt đầu đọc giá trị bên trong $eax.

Giờ để biết được trước khi đến với eax thì giá trị bên trong rbp-0x4 đang chứa gì - thật ra là 0x2262c96b. Nhưng có một điều khá hay ho là nó sẽ không được lưu trữ như giá trị ta đưa vào mà sẽ sử dụng kiến trúc Little-endian để lưu.
Sử dụng câu lệnh x/4xb có cấu trúc như sau:
- x - examine
- n - repeat count
- f - display format
- u - unit size
$addr - $ như ref và không dùng dấu ngoặc vuông []
Flag: picoCTF{0x6bc96222}
#GDB baby step 4

Hints: A function can be referenced by either its name or its starting address in gdb.
Lần này nếu để ý phần functions thì có thêm
func1. Mình sẽ nói đến nó trong quá trình phân tích hàmmain.

Khi đọc hàm main thì không có gì ngoài việc di chuyển giá trị 0x28e qua lại và cuối cùng gọi code segment 0x401106 ở đây là func1.

Vậy công việc tiếp theo là đọc qua hàm func1.

Bên trong func1 thì có một instruction mới với cú pháp là imul với nghĩa interger multiply
Phân tích đoạn này có ý nghĩa như sau:
- eax(1st) - nơi sẽ lưu
- eax(2nd) - số được nhân
- 0x3269 - số bị nhân
=> lấy eax(2nd) * 0x3269 rồi lưu vào eax(1st).
Flag mà author muốn đó là số bị nhân dưới dạng decimal.
Flag: picoCTF{12905}