# **Flare-on9**
* [01] **Flaredle**

Chương trình kêu ta nhập một chuỗi nếu đúng thì sẽ ra flag
Sau khi mở file `script.js`

đoạn này chính là đoạn so sánh chuỗi người nhập và chuỗi flag.
`guessString là chuỗi người nhập`
`rightGuessString là đoạn so sánh`

như hình như ta thấy thì rightGuessString = WORDS[CORRECT_GUESS] mà CORRECT_GUESS = 57.
Nên sau khi mở file `words.js` `WORDS[57] = 'flareonisallaboutcats'` là chữ ta cần tìm

* [02] **PixelPoker**

Đầu tiên ta có một chương trình. Nó sẽ so sánh 2 tọa độ (x,y) và giới hạn 10 lần thử.
Dựa trên chữ `Womp womp... :(` tôi nhìn thấy hàm if này khá khả nghi có thể nó sẽ kiểm tra (x,y)

sau khi debug và được các giá trị


tiến hành tính toán và ohh! nó ra flag =))))

* [03] **03_magic8ball**
Chạy chương trình tôi được

Sau khi chạy chương trình tôi tóm lại là chương trình này có 2 input: nhập string và các phím up, down,left, right. nếu sai thì nó sẽ in ra dòng chữ ở giữa tam giác dòng chữ có thể khác nhau.
Sau khi decompile và dùng `shift + f12` để dựa theo các string tìm ra hàm cần phân tích. Tôi thấy hàm xử lý chính là hàm `sub_4027A0`.
Đi từ trên xuống ta thấy `sub_4012B0` tạo ra 1 ông list chứa các giá trị in ra khi mình sai. Nó cũng ko có gì đặc biệt bỏ qua. Tiếp theo hàm `sub_4018F0` khá giống set lable nên mình cũng bỏ qua.
Tiếp theo là hàm `sub_402090` thì mình thấy

Tạm thời mình chỉ thấy khả nghi đoạn này.

Nên mình tạm bỏ qua và tiếp tục phân tích. Trong hàm `sub_4024E0` có 1 đoạn if trong khá khả nghi vì nó chỉ compare vs chữ U,L,R,D nên từ đó mình có thể đoán được U = Up, L = Left, R = Right, D = Down.

Sau đó nó tiếp tục compare string vs `(this + 92)` mà t hàm trên t biết `(this + 92) = gimme flag pls?`
T nhập 2 input vào và ra flag.

* [04] **darn_mice**
`argc == 2` vd `./darn_mice.exe` thì 1 argc `./darn_mice.exe input` thì 2 argc. argc là tham số

Hàm `sub_401000` được decompile khá gọn nên sẽ dễ dàng cho việc phân tích.

ptr = argc[1] là input mình nhập.
`sub_401240()` khá dễ đoán đó là printf().
Hàm if đầu tiên khá dễ dàng là input = 0 or input > 35 thì sẽ in ra `No, nevermind.`
Tiếp đó ta gặp 1 vòng lặp for lúc đầu mình thấy khá lạ và cũng không hiểu v2() cho lắm. Nên mình tiến hành debug vs input = aaaaaa.

khi mình vào hàm v2() thì thấy (như hình) và f8 tiếp thì nó thoát ra :)))
Sau khi mình thay đổi input = raaaaa là nó in ra `Nibble...` và truy vào v2(v2) nó là chữ retn

À Okeee mình hiểu rồi như hình trên lệnh mov thì sẽ thực thi đoạn bên dưới trong vùng nhớ v2 mà bên dưới không có lệnh gì nên nó sẽ bị lỗi. Còn retn thì nó sẽ trả lại flow của chương trình không tiếp tục thực thi vùng nhớ bên dưới retn.
Mà sao ra được retn thì mình lại không biết nên tiếp tục tìm hiểu, debug thử xem sao.
v2 tương ứng vs ecx. Khi input = raaaaa, v2 = C2

input = aaaaaa thì v2 = B1

Okeee nó có thể liên quan gì đó đến retn, mov ko ta ? Và tôi tìm thấy bảng x86 opcode vừa hay opcode của retn là 0xC3 or 0xC2, mov thì nhiều .Chính là nó :))

và đây là kết quả rút gọn `0xC3(0xC2) = Str[i] + v5[i]`
bằng 1 script đơn giản vs 0xC3 thì tôi có đc input `see three, C3 C3 C3 C3 C3 C3 C3! XD`
và ra flag
