Saturday 23 October 2021

Flare-on 8


            List:

 01 - credchecker

  • Đây là một bài bài rất đơn giản của flare-on như thường lệ.
  • Chạy thử file sẽ ra một trang web đăng nhập.
  • Như thường lệ, khi đã có source code và vào nhưng bài đăng nhập như này, mình sẽ nhảy thẳng vào phần nhập và check để mong sao lấy được thông tin gì đó từ nó.

  • Và đúng như thế, đã có được username là "Admin" và atob(password) là "goldenticket".
  • Thông qua search google thì atob là hàm base64 decode. Vậy tức password là base64 encode của "goldenticket".
  • Có user = "Admin", pwd = "Z29sZGVudGlja2V0". Đăng nhập vào là ra flag.

02 - known

  • Tiếp theo là một bài thuộc dạng đọc hiểu 1 chút.
  • Được cho một file exe 32bits và các file được encrypt

  • Mở trong IDA lên sẽ nhận ra được hàm chính.
  • < Start > : đọc key từ console rồi đem nó vào "sub_BD1370"
  • < sub_BD1370 > : Tìm các file dạng "*.encrypted" rồi đưa vào "decrypt"
  • < decrypt > : Lấy lần lượt 8 bytes và đem vào "cycle_decrypt" decrypt và lưu vào file mới.
  • < cycle_decrypt > : Hàm decrypt đơn giản với duyệt i 8 bytes, mỗi byte lấy data enc xor với key và rotate left i lần rồi trừ cho i  
                    ==>  data[i] = ROL( key[i] ^ enc[i] , i) - i
  • Vì tên file là dùng để decrpyt nên ta đã có được:
    • data output, với 8 bytes đầu là file format.  => chọn format file của png
    • enc input, chọn 8 bytes đầu file png.encrypted
    • Với mỗi enc[i], bruteforce kí tự chọn key[i] để kết quả của data[i] giống với 8 bytes đầu của data (png format).

  • Kết quả có được key, chạy lại exe với key này là lấy được file flag.


03 - antioch

  • Chúng ta được cho 1 file .tar, đem mở ra thì thấy hàng loạt các file cộng theo file config "manifest.json", lấy được file chính.
  • Dùng IDA đọc từng hàm, biết được các function như dưới:

  • < start > :
    • Nhập input trong "sysread", tương ứng với các giá trị của "v2" sẽ nhảy vào hàm tương ứng.
    • Có hai hàm thực thi là "fun_approach" và "fun_consult".
  • < fun_approach > : input là 'approach'
    • Gợi ý sẽ được lấy trong "type_approach":
    • Đó là một đoạn cut film trên youtube, coi xong sẽ thấy được phải trả lời 3 câu hỏi tương ứng với truyện: 
    • Sau khi nhập đúng sẽ được trả về 1 số:
    • Theo code, chỉ có câu trả lời 1 và 3 là được checksum bằng CRC32, còn câu thứ 2 type cho có chữ là được.
    • Còn con số được trả về nó đi kèm theo checksum nên phải trả lời đúng "name" và "color" để lấy được.
    • Đến đây thì đi lòng vòng các folder khác xem thử, thấy một trường "author" trong các file tên json. Đoán được đó chính là câu trả lời cho câu hỏi "name" nên lấy các author đó ra.
    • Việc còn lại là bruteforce tìm color cho từng cái tên, vì quá lười lên mình đặt condition breakpoint trong IDA, set zeroflag luôn về 1 để nó bypass luôn khúc so sánh đó và lấy được các con số.
    • Sau khi lấy được hết số thì trùng hợp là nó có từ 1 đến 30, vậy nó chính là thứ tự các folder, đổi tên folder luôn để đỡ so sánh nhiều.
    • Tiếp theo là reverse hàm "fun_consult"
  • < fun_consult > : input là 'consult'
    • Hàm này cũng đưa ra gợi ý nhưng mình cũng chưa vội xem.
    • Đầu tiên, đọc các file từ 'a.dat' đến 'z.dat' rồi so chúng lại với nhau
    • Sau đó dùng một string có sẵn, dùng lần lượt các giá trị sau khi xor lấy ra các kí tự trong string đó. Tạo thành một thứ nhìn như là ascii art.
    • Trong mỗi folder là các .tar chứ các file .dat.
    • Việc quan trọng là lấy file nào.
    • Ban đầu mình đã nghĩ đến việc extract toàn bộ các file theo thứ tự. 
    • Nhưng sau đó lại thôi vì nghĩ dễ như thế thì cho gợi ý để làm gì? Và chuỗi 11 ngày chẳng được gì cả bắt đầu =))
    • Mình đã đọc đoạn văn này, nghiền ngẫm nó 11 ngày trời để xem nó muốn mình làm gì. Từ việc extract từ file 9 đến 21, extract 1 trong 2 loại file trong .tar, đến việc consult từng .tar và ghép các kết quả đó lại vẫn không thấy gì. Mình bắt đầu kiếm các đoạn tự luận, phân tích liên quan đến topic đó và ngồi đọc =))
    • Sau khi bất lực, mình đi xin hint và được bảo rằng ghép hết nó lại (: Del hiểu kiểu gì (:
    • Và đúng như vậy, sau khi extract theo thứ tự folder thì mình được 1 tập data, dùng consult sẽ tạo được một ascii art có flag


04 - myaquaticlife

  • Bài này cho một file game exe 32bit, bị UPX. Bằng cách chọn con nào đó rồi nhấn vào dòng chữ thì nó sẽ chuyển đến một page khác.

  • Dùng CFF để unpack và bỏ vào IDA bắt đầu debug.
  • Sau vài ngày debug ngoài việc thấy nó lấy resource ra mình không thấy thêm thông tin gì nữa cả, về phần resource trong PE thì cũng không thấy có gì là data.
  • Sau đó mình mới nhớ rằng các resource có thể load được load và chạy song song, vì thế nên ngó xung quanh và thấy một module tên fathom.dll được load lên khi chạy game lên.

  • Có được resource, bắt đầu đọc các file liên quan,
    • "index.html" : load các gif lên, mỗi lần click vào gif sẽ thực thi 1 script nào đó.
    • "index2.html" : Load page kết quả.
    • Và một dll để chạy game. Bây giờ thì setup để debug dll.

  • Setup debug dll:
    • Mở dll bằng IDA ở máy thật.
    • Dùng chế độ " Remote Windows debugger "
    • Mở win32/win64_remote.exe tương ứng với ver của exe. (file remote ở \IDA 7.5\dbgsrv)
    • Setup để remote qua máy ảo:
      • application: path đến exe load dll trong máy ảo.
      • input file: path đến dll trong máy ảo
      • directory: folder path của exe
      • parameters: parameter của dll (nếu có)
      • hostname: ip của máy ảo. port có sẵn.
  • Khi debug một .dll, mình sẽ xem qua một lượt toàn bộ các export rồi mới đến DllEntryPoint.
  • Khi xem đến "PluginFunc19" thì thấy ở cuối có dòng thông báo fail, vậy đó chính là function đang cần, có thể phân tích từ nó đi lên.
  • Thấy ở trên return fail này có một if, vậy trong if này đúng là thứ mình cần vào.
  • Điều kiện để vào hàm if này là MD5(v11) bằng 1 giá trị.
    • "v11" lại là "v13" được tính từ "v1" và "v9", "v1" và "v9" được lấy từ địa chỉ "77C" và "774".
    • Đặt breakpoint (write access) tại 2 địa chỉ đó thể theo dõi sự biến đổi tác động bởi giá trị nào.
    • Ngoài ra còn 1 điều kiện check true false để pass qua if goto LABEL_18.
    • Đặt thêm breakpoint tại đầu vào các export khác để theo dõi.

  • Debug thấy được:
    • Khi click vào bất kì gif nào sẽ dừng lại tại export 13. SetFile
    • Mỗi gif có một trong 4 loại kèm string tương ứng, sau đó được copy chuỗi sau dấu ":" vào một địa chỉ nào đó.
    • Nhưng chỉ có 2 loại string là được ghi vào địa chỉ mà sau đó lưu vào memory đã đánh dấu breakpoint.
      • 0x73CC5774 (v9):


      • 0x73CC577C (v1):
      • Mỗi loại trong 2 loại trên có 3 gif, ghép lại sao đó để được 2 strings


    • Dòng "What's your favorite aquatic animal?" call đến "PluginFunc19":
      • Dùng "v13" là data có sẵn, tính với "v1" và "v9" (v9 có len 17)

      • "v9" thấy được có 17 chars, là lấy hết 3 gif.
      • Rút kinh nghiệm từ bài trước, lấy hết luôn 3 cái gif kia, không phải nghĩ phức tạp làm gì.
      • Nếu đúng thứ tự "v1" "v9" sẽ cho ra được 1 chuỗi có MD5_hash như yêu cầu.
      • Vì MD5 không reverse được nên sửa zeroflag tại 0x73A72F78 đi tiếp vào if xem chuỗi biến đổi thế nào thành flag.

string sau khi xor
show ra giống string sau khi xor
  • Vậy sau khi tính xong thì đó là flag.
  • Dùng chuỗi "v13" và hoán vị thứ tự của 3 gif ghép thành chuỗi "v1" và "v9" để tìm trong toàn bộ các string ra được string có dạng @flare-on.com


**Note: lưu ý nhỏ tại dòng 27 đó là do thực hiện phép trừ nên có thể ra số âm (0xFFFF....), khi đổi ra char thì không được nên cần phải bao thêm điều kiện 1 bytes vào.

Flare-on 8

               List: 01 - credchecker 02 - known 03 - antioch 04 - myaquaticlife   01 - credchecker 01_credchecker.7z Đây là một bài ...