=))) tí thì feed giải
Mình không biết giải thích như thế nào để mọi người dễ hiểu nhất, vậy nên mình sẽ viết tất cả những bước mình làm từ lúc download challenge về đến khi ra được script lua cuối cùng nhé.
Đầu tiên, mình đọc được miêu tả của challenge là phải cài game 22GB, và có thêm 1 plugin của tác giải tự code. Plugin sau khi extract như sau:
Mình nhận ra những file package là những file có trước của game (chắc thêm vào để load màu các thứ, maybe vì mình chưa run cái plugin này lần nào). (mình check md5sum nhé)
Mình tiếp tục coi đến file 3.lua
Mình thấy header đúng là các bytecode của lua, nhưng khi mình thử decompile (= luadec) thì nó bị lỗi 3.lua: bad header in precompiled chunk
Lúc này mình nghĩ đến khả năng file lua này bị custom opcode, để chắc chắn hơn thì mình tự compile 1 file lua bằng lua-5.1 để so sánh bytecodes (mình lấy luôn file a.lua từ challenge warmup).
=> chắc chắn bytecode của 3.lua bị encode rồi
Nhưng plugin mà mình tải về chỉ có 1 file lua này thôi => file encode nằm trong folder của của game CuuAmChankinh.
Mình đi đến folder của game, và grep tất cả những string mà mình nghĩ sẽ liên quan đến encode ví dụ như: encode, decode, encrypt, decrypt, .lua,… và check các file có matching. Mất một lúc không tìm được điều gì thì mình đọc lại file 3.lua
, kéo xuống gần cuối mình càng nhìn thấy càng nhiều chữ snail
, lgam
, gme
Thế là mình grep theo string snail
Chỉ có 1 số file nên cũng đơn giản, mình đi vào từ file và tìm grep theo snail
-> cuối cùng mình tìm được file fxcore.dll
là có những hàm xor bytecode với string snailgame
Nếu tất cả bytecode đều xor lần lượt với snailgame
thì mọi thứ khá là đơn giản nhưng rất buồn là sau khi xem qua file dll mình không phải vậy (dm lua :<). Mình đã quyết định đọc xem file dll này parse bytecode như thế nào.
Mình vừa đọc dll vừa map với paper của lua file này
Sau khi xref một vài lần, mình tìm được đến hàm bắt đầu của decode
Parse phần header
12 bytes đầu là signature của lua và được gán trực tiếp.
Tiếp đến phần body
Đi vào từng hàm nhỏ, đầu tiên từ hàm enc_get_filename
Hàm này sẽ encode 4 bytes là size của filename (từ offset 0xc), sau đó encode cả filename
Đi vào hàm enc_data_with_size
Gọi đến hàm enc_snailgame
, hàm này sẽ malloc thêm 1 vùng nhớ với size truyền vào từ hàm trên và encode xor với string snailgame
Đi tiếp từ cái enc_body
, sau khi encode size và string của filename thì chương trình encode tiếp các line
Các line có size là 4 -> encode 4 bytes
Sau đó là hàm enc_get_bytes
Các byte có size là 1 -> encode 1 bytes
Tiếp theo là hàm encode instructions
enc_get_line
encode 4 bytes đầu (chính là số các line), và sau đó encode 1 block với size là (giá trị của 4 byte trên * 4)
Tiếp nữa là hàm encode constants
Đầu tiên, chương trình lấy 4 bytes đầu tiên để biết số các constants trong file.
Tiếp đó, lấy 1 bytes để biết xem constant đó là loại nào, trong hàm trên có 3 loại constants:
1 -> byte, 3 -> double, 4 -> string
Với mỗi type khác nhau, chương trình sẽ encode với mỗi size khác nhau. Ví dụ nếu là byte thì chương trình encode 1 bytes, double là 8 bytes, còn string thì chương trình sẽ encode 4 bytes size trước và sau đó là encode n bytes size của string.
Sau khi kết thúc các constants, chương trình encode 4 bytes tiếp và gọi n lần (chính là giá trị 4 bytes vừa đọc được) hàm enc_body
(mình đoán là các hàm nhỏ hơn có cùng struct nên chương trình encode như vậy).
Cuối cùng là hàm encode funtion prototypes + source line positions + locals + upvalues
Phù, mệt vler :<. Hàm này cũng encode kiểu kiểu như trên nhé, đến đoạn này mình cũng lười đọc document rồi nên viết script decode luôn.
Script decode mình đi theo các hàm mình vừa parse được và thêm một đoạn xor với string snailgame
Sau đó mình dùng luadec
để decompile file bytecode này. Nhưng vẫn bị lỗi ./luadec64: 3.lua: bad header in precompiled chunk
Mình đọc đi đọc lại cái dll và script xem có sai ở đâu không và khá chắc là nó đúng. Tìm một hồi thì mình nhận ra các file dll đều là 32bit , xong mình nghĩ có khi nào do khác arch nên không decompile được không?
Compile lại luadec
ở 32bit thì done =)))). (cơ mà vẫn dm lua :<)