5 - T8

  • Reverse C++ binary

  • Khi phân tích các C++ binary cộng thêm quan sát hàm main thì thứ nên quan tâm là vftable

image

  • Sau khi phân tích một số hàm cùng với việc dùng plugin findcrypt-yara thì mình xác định chức năng của cơ bản của một số hàm như trên

Reverse hàm http_process:

image

  • Ta thấy đầu tiên http_process gọi hàm RC4

  • Reverse hàm RC4 ta thấy hàm dùng một key có format “F09 + 1_số_random_gồm_5_chữ_số” để encypt một string “ahoy”

  • Sau đó kết quả encrypt sẽ được đi base64 encode

  • Sau đó thực hiện kết nối http thông qua một số winAPI gì đó mà các bạn có thể thấy kết quả thông qua debug

  • Kết quả là chuỗi được lưu giống trong file pcap:

image

  • Tiếp tục debug ta biết được chỗ số 1 là “F09 + 1_số_random_gồm_5_chữ_số” và chỗ số 2 là kết quả sau khi base64 encode ở trên

-> Từ đó ta test thử xem dùng “FO911950” có thể decrypt “ydN8BXq16RE=” ra được “ahoy” giống phân tích ở trên hay không

from base64 import b64decode, b64encode
from Crypto.Cipher import ARC4
from hashlib import md5

data=b'ydN8BXq16RE='
data=b64decode(data)    

key_format=f"FO911950"
li1=b''
for j in key_format:
    li1+=str(j).encode()+b'\x00'

md5_res=md5(li1).hexdigest()
li2=b''
for j in md5_res:
    li2+=str(j).encode()+b'\x00'

res=ARC4.new(li2).decrypt(data)
print(res)
  • Kết quả : b’a\x00h\x00o\x00y\x00’

Phân tích số random

  • Giờ ta cần xem nguồn gốc số random là từ đâu

image

  • Có vẻ nó được tạo ra từ hàm random với seed là time

Phân tích tiếp hàm http_process

image

  • Hàm WinHttpReadData là hàm ta cần quan tâm tiếp

  • Hàm nhận data response sau khi kết nối đến http server

  • Hàm này được gọi 2 lần:

image

-> Cả 2 lần đều trả về source của 1 webpage

  • Tới đây mình lại không biết làm tiếp thế nào nhưng mình khá chắc là muốn tìm flag thì phải decode được đoạn base64 trong file pcap.

  • Suy nghĩ thêm một lúc thì mình thấy đoạn base64 đó nằm trong phần response của file pcap nhưng tại sao lại trả về source web chứ không phải một chuỗi base64 nào đó. Tới đây mình đoán có lẽ cái số random để nó trả về đoạn base64 lúc kết nối chắc chỉ có số 11950

  • Tới đây mình tiến hành patch cái số random lại thành 11950 trong lúc debug (patch giá trị EAX):

image

-Tiếp đó patch tiếp kết quả trả về của WinHttpReadData tại lần gọi thứ 2 thành đoạn base64 trong file pcap bằng IDApython

import idaapi

data=b'TdQdBRa1nxGU06dbB27E7SQ7TJ2+cd7zstLXRQcLbmh2nTvDm1p5IfT/Cu0JxShk6tHQBRWwPlo9zA1dISfslkLgGDs41WK12ibWIflqLE4Yq3OYIEnLNjwVHrjL2U4Lu3ms+HQc4nfMWXPgcOHb4fhokk93/AJd5GTuC5z+4YsmgRh1Z90yinLBKB+fmGUyagT6gon/KHmJdvAOQ8nAnl8K/0XG+8zYQbZRwgY6tHvvpfyn9OXCyuct5/cOi8KWgALvVHQWafrp8qB/JtT+t5zmnezQlp3zPL4sj2CJfcUTK5copbZCyHexVD4jJN+LezJEtrDXP1DJNg=='

for i in range(len(data)):
    idaapi.patch_byte(0x95EE40+i,data[i])    #thay đổi giá trị 0x95EE40 thành địa chỉ của "lpBuffer" trong lúc debug

image

  • Sau khi patch và debug thêm 1 lúc nữa ta thấy flag được load trong memory

image

6 - à la mode

Phân tích file .NET

1

  • Code khá đơn giản: thực hiện kết nối đến các pipe gì đó rồi đem vào password là tham số vào sau đó đọc 0x40 bytes từ pipe chuyển thành UTF-8 rồi trả về.

  • Vấn đề là ta không thấy được các hàm xử lí kết nối (server side) hay bất kì hàm nào khác hữu dụng.

Phân tích C code

  • Tới đây thì mình load vào IDA xem thử

  • Phân tích một hồi mình tới được đây:

image

  • Hàm đầu tiên (create_PEB):

    image

    • Sử dụng hàm decode_string để resolve lại đúng mấy cái tên hàm

    • Có thể viết lại hàm để decode(khá đơn giản) hoặc debug để thấy

    • Kết quả sau khi decode mình đổi tên lại như trên

  • Hàm thứ 2 (connect_and_write_file):

    image

    • Thực hiện kết nối PIPE gì đó (tương tự như phần .NET)

    • Hàm cần quan tâm là Authorization

  • Hàm Authorization:

    • Hàm này có thể dùng để check password của bên .NET

    image

    • Phân tích ta thấy hàm thực hiện 2 lần RC4

    • Tiến hành decrypt ở hàm RC4 thứ nhất:

      from Crypto.Cipher import ARC4
    
      key=b'\x55\x8B\xEC\x83\xEC\x20\xEB\xFE'
      data=b'>9Q\xfb\xa2\x11\xf7\xb9,'
      print(ARC4.new(key).decrypt(data))
    
    • Ta thu được: b’MyV0ic3!\x00’

    • Nhưng thực hiện tương tự đối hàm RC4 thứ 2 lại không được (đã thử mọi cách)

    • Tới lúc này mình quyết định debug để coi nó là cái gì (dùng rundll32.exe)

    image

    image

    • Có vẻ phần đầu mình đã làm đúng

    image

    • Yay hàm RC4 thứ 2 đã decode flag bằng cách nào đó

    image