⚠ Spoiler: Đây là write-up cho các challenge của Flare-on 9 tổ chức vào khoảng tháng 11/2022 tại Website.
[08] backdoor
I'm such a backdoor, decompile me why don't you...
7-zip password: flare
Công cụ sử dụng:
- dnSpy/dnSpyEx
- Python
- Visual Studio (C# .NET)
Challenge yêu cầu tìm flag từ fileFlareOn.Backdoor.exe
có kích thước lớn ~ 11MB. CFF Explorer cho biết đây là một chương trình PE 32 .NET Assembly (tuy nhiên có thể CFF đã detect không chính xác do cần sử dụng dnSpy bản 64 bit để debug challenge) do vậy có thể sử dụng công cụ cực kì mạnh dành riêng cho .NET là dnSpy.
Với các thông tin gồm có tới hiện tại: kích thước file, số lượng và tên section header, tên class và method thì có thể thấy được file đang được làm rối (Obfuscate). Exception gây ra bởi lỗi decompile. dnSpy hỗ trợ xem dạng IL (MSIL) thay vì cố gắng decompile. Trong chế độ IL quan sát được những mã IL có tham số không xác định càng khẳng định thêm việc chương trình đã bị làm rối.
Click Start để bắt đầu Debug chương trình, chương trình thực thi không sử dụng tham số. Break at Entry Point
được chọn để dừng chương trình tại Entry Point (Program.Main)
public static void Main(string[] args)
{
try
{
try
{
FLARE15.flare_74();
Program.flared_38(args);
}
catch (InvalidProgramException ex)
{
FLARE15.flare_70(ex, new object[] { args });
}
}
catch
{
}
}
dnSpy decompile đượcFLARE15.flare_74();
nhưng không decompile được Program.flared_38
. Ngay khi Step Into (F11) chương trình nhận được Exception và chuyển luồng thực hiện vào trong khối catch để thực hiện FLARE15.flare_70
Lỗi gây ra bởi Runtime của .NET nhận thấy hàm được thực hiện không phải là một hàm hợp lệ. Vậy FLARE15.flare_70
sẽ làm gì? FLARE15.flare_70
sẽ gọi tới FLARE15.flared_70
nhưng do FLARE15.flared_70
vẫn gây ra lỗi do vậy sẽ xảy ra exception và Exception này được xử lý bởi FLARE15.flare_71
cùng 2 biến dữ liệu mới được truyền vào là FLARE15.wl_m
và FLARE15.wl_b
// Token: 0x060000BB RID: 187 RVA: 0x00013E68 File Offset: 0x0001AE68
public static object flare_70(InvalidProgramException e, object[] a)
{
object obj;
try
{
obj = FLARE15.flared_70(e, a);
}
catch (InvalidProgramException ex)
{
obj = FLARE15.flare_71(ex, new object[] { e, a }, FLARE15.wl_m, FLARE15.wl_b);
}
return obj;
}
// Token: 0x060000BC RID: 188 RVA: 0x00013EB8 File Offset: 0x0001AEB8
public static object flare_71(InvalidProgramException e, object[] args, Dictionary<uint, int> m, byte[] b)
{
StackTrace stackTrace = new StackTrace(e);
int metadataToken = stackTrace.GetFrame(0).GetMethod().MetadataToken;
Module module = typeof(Program).Module;
MethodInfo methodInfo = (MethodInfo)module.ResolveMethod(metadataToken);
MethodBase methodBase = module.ResolveMethod(metadataToken);
ParameterInfo[] parameters = methodInfo.GetParameters();
Type[] array = new Type[parameters.Length];
SignatureHelper localVarSigHelper = SignatureHelper.GetLocalVarSigHelper();
for (int i = 0; i < array.Length; i++)
{
array[i] = parameters[i].ParameterType;
}
Type declaringType = methodBase.DeclaringType;
DynamicMethod dynamicMethod = new DynamicMethod("", methodInfo.ReturnType, array, declaringType, true);
DynamicILInfo dynamicILInfo = dynamicMethod.GetDynamicILInfo();
MethodBody methodBody = methodInfo.GetMethodBody();
foreach (LocalVariableInfo localVariableInfo in methodBody.LocalVariables)
{
localVarSigHelper.AddArgument(localVariableInfo.LocalType);
}
byte[] signature = localVarSigHelper.GetSignature();
dynamicILInfo.SetLocalSignature(signature);
foreach (KeyValuePair<uint, int> keyValuePair in m)
{
int value = keyValuePair.Value;
uint key = keyValuePair.Key;
bool flag = value >= 1879048192 && value < 1879113727;
int num;
if (flag)
{
num = dynamicILInfo.GetTokenFor(module.ResolveString(value));
}
else
{
MemberInfo memberInfo = declaringType.Module.ResolveMember(value, null, null);
bool flag2 = memberInfo.GetType().Name == "RtFieldInfo";
if (flag2)
{
num = dynamicILInfo.GetTokenFor(((FieldInfo)memberInfo).FieldHandle, ((TypeInfo)((FieldInfo)memberInfo).DeclaringType).TypeHandle);
}
else
{
bool flag3 = memberInfo.GetType().Name == "RuntimeType";
if (flag3)
{
num = dynamicILInfo.GetTokenFor(((TypeInfo)memberInfo).TypeHandle);
}
else
{
bool flag4 = memberInfo.Name == ".ctor" || memberInfo.Name == ".cctor";
if (flag4)
{
num = dynamicILInfo.GetTokenFor(((ConstructorInfo)memberInfo).MethodHandle, ((TypeInfo)((ConstructorInfo)memberInfo).DeclaringType).TypeHandle);
}
else
{
num = dynamicILInfo.GetTokenFor(((MethodInfo)memberInfo).MethodHandle, ((TypeInfo)((MethodInfo)memberInfo).DeclaringType).TypeHandle);
}
}
}
}
b[(int)key] = (byte)num;
b[(int)(key + 1U)] = (byte)(num >> 8);
b[(int)(key + 2U)] = (byte)(num >> 16);
b[(int)(key + 3U)] = (byte)(num >> 24);
}
dynamicILInfo.SetCode(b, methodBody.MaxStackSize);
return dynamicMethod.Invoke(null, args);
}
Sử dụng tính năng Analyzer của dnSpy để tìm kiếm các vị trí sử dụng hàm FLARE15.flare_71
Ở mỗi vị trí đều sử dụng tham số truyền vào thứ 4, 5 khác nhau. Phân tích kĩ hơn bên trong hàm FLARE15.flare_71
, kết thúc hàm là lời gọi tớidynamicMethod.Invoke
. Tương tự như InvokeMethod, phương thức này được sử dụng để thực hiện hàm có IL được khởi tạo động trong quá trình thực thi. Vậy nếu dựa theo mô tả của hàm thì có thể trích xuất ra được IL code ở biến b
hay không? Câu trả lời là “CÓ”. Tuy nhiên IL khi này chỉ hợp lệ trong ngữ cảnh của dynamicMethod mà thôi (giống như trong document của Microsoft có đề cập). Trong lần đầu tiên tiếp cận chúng tôi đều đã gặp phải trường hợp sau khi sử dụng IL lấy được để ghi lại vào binary:
Dù có thể decompile được nhưng đây hoàn toàn không phải là những gì chương trình thực hiện.
Để ra mã nguồn sai như vậy bạn cần debug tới trước khi Invoke DynamicMethod và lấy IL. Ghi IL thông qua Hex editor của dnSpy (Copy memory → Paste → Save) - giả sử metadata của các phương thức đều đúng.
Load lại Assembly trong dnSpy.
Để lấy IL đúng chỉ cần bỏ qua các bước GetTokenFor mà sử dụng trực tiếp giá trị được cài đặt trong FLARE15.flare_74
. Bước này được làm thủ công kết hợp với Analyzer từ dnSpy.
Nếu xử lí đúng ta sẽ có:
// FlareOn.Backdoor.FLARE15
// Token: 0x060000BA RID: 186 RVA: 0x00013E04 File Offset: 0x0001AE04
public static object flared_70(InvalidProgramException e, object[] a)
{
StackTrace stackTrace = new StackTrace(e);
int metadataToken = stackTrace.GetFrame(0).GetMethod().MetadataToken;
string text = FLARE15.flare_66(metadataToken);
byte[] array = FLARE15.flare_69(text);
byte[] array2 = FLARE12.flare_46(new byte[] { 18, 120, 171, 223 }, array);
return FLARE15.flare_67(array2, metadataToken, a);
}
flared_70 thực hiện
-
Lấy stacktrace chứa thông tin về method gây ra exception → metadatatoken
-
FLARE15.flare_66 → tính sha256 sum từ metadatatoken và dữ liệu khác. Dưới đây là một cách để lấy MethodInfo từ file .NET assembly bằng MetadataToken
Assembly assembly = Assembly.LoadFrom(path); MethodInfo methodInfo = (MethodInfo)assembly.GetModules()[0].ResolveMethod(t);
-
FLARE15.flare_69 → lấy dữ liệu byte từ section nếu tên section là chuỗi bắt đầu của kết quả FLARE15.flare_66
-
FLARE12.flare_46 → giải mã dữ liệu bằng thuật toán RC4 key
{ 18, 120, 171, 223 }
và cipher là kết quả từ FLARE15.flare_69 -
FLARE15.flare_67 → tương tự cách hoạt động
FLARE15.flare_71
nhưng phức tạp hơn.
Dường như có 3 thuật toán sinh tên miền được sử dụng như C&C nhưng không cái nào đang hoạt động (sử dụng massdns). Sau khi đọc kĩ mã nguồn thì có một hàm thực hiện chức năng encrypt/decrypt và ghi vào file như sau:
// Token: 0x06000095 RID: 149 RVA: 0x00004B94 File Offset: 0x0000BB94
public static void flared_54()
{
byte[] array = FLARE15.flare_69(FLARE14.flare_54(FLARE14.sh));
byte[] hashAndReset = FLARE14.h.GetHashAndReset();
byte[] array2 = FLARE12.flare_46(hashAndReset, array);
string text = Path.GetTempFileName() + Encoding.UTF8.GetString(FLARE12.flare_46(hashAndReset, new byte[] { 31, 29, 40, 72 }));
using (FileStream fileStream = new FileStream(text, FileMode.Create, FileAccess.Write, FileShare.Read))
{
fileStream.Write(array2, 0, array2.Length);
}
Process.Start(text);
}
FLARE14.sh
được xây dựng tạiflared_55
public static void flared_55(int i, string s)
{
bool flag = FLARE15.c.Count != 0 && FLARE15.c[0] == (i ^ 248);
if (flag)
{
FLARE14.sh += s;
FLARE15.c.Remove(i ^ 248);
}
...
}
- array mang giá trị của section được tìm thấy dựa trên kết quả hàm FLARE15.flare_69
- array2 là nội dung được ghi vào file sau khi giải mã RC4 bằng hàm FLARE12.flare_46. Key giải mã được sử dụng là
FLARE14.h
thiết lập giá trị bằng cách dùng phương thứcIncrementalHash.AppendData
trong hàmFLARE14.flared_56
Trong FLARE14.flared_55
thực hiện FLARE15.c.Remove(i ^ 248);
sẽ kích hoạt hook FLARE15.c.CollectionChanged += FLARE14.flare_53;
→ flared_52
→ flared_55
→ flared_54
→ write to file.
Để lấy key giải mã cần có giá trị sh
và h
từ FLARE14.flared_56
. Do đã decompile toàn bộ method nên có thể tuần tự đọc hiểu tính năng của các hàm. Trong đó đáng chú ý là FLARE14.flared_57
được dùng để lấy giá trị tên hàm gọi tới nó. Lưu ý là do đang trong ngữ cảnh debug của file đã được chỉnh sửa thì stacktrace không giống như việc thực hiện qua các bước giải mã bằng exception và thực thi sử dụng DynamicMethod Invoke. Để lấy giá trị trả về của FLARE14.flared_57
chỉ cần thực hiện khôi phục mã đã bị obfuscate ban đầu để thu được giá trị là
System.Object InvokeMethod(System.Object, System.Object[], System.Signature, Boolean)System.Object Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)
Sử dụng điều kiện FLARE15.c[0] == (i ^ 248);
và khai báo ban đầu tính được h
dẫn đến section 5aeb2b97
FLARE15.c = new ObservableCollection<int>
{
250, 242, 240, 235, 243, 249, 247, 245, 238, 232,
253, 244, 237, 251, 234, 233, 236, 246, 241, 255,
252
};
Kết hợp lại ta có script giải ra flag cuối cùng
a = [250, 242, 240, 235, 243, 249, 247, 245, 238, 232,
253, 244, 237, 251, 234, 233, 236, 246, 241, 255,
252]
for i in a:
print(i^248)
import hashlib
import base64
def getsha256(s):
s = str(s).encode()
return hashlib.sha256(s).hexdigest()
ll = {19:("146", 1,"JChwaW5nIC1uIDEgMTAuNjUuNDUuMyB8IGZpbmRzdHIgL2kgdHRsKSAtZXEgJG51bGw7JChwaW5nIC1uIDEgMTAuNjUuNC41MiB8IGZpbmRzdHIgL2kgdHRsKSAtZXEgJG51bGw7JChwaW5nIC1uIDEgMTAuNjUuMzEuMTU1IHwgZmluZHN0ciAvaSB0dGwpIC1lcSAkbnVsbDskKHBpbmcgLW4gMSBmbGFyZS1vbi5jb20gfCBmaW5kc3RyIC9pIHR0bCkgLWVxICRudWxs")
,18:( "939", 1, "JAAoAHAAaQBuAGcAIAAtAG4AIAAxACAAMQAwAC4AMQAwAC4AMgAyAC4ANAAyACAAfAAgAGYAaQBuAGQAcwB0AHIAIAAvAGkAIAB0AHQAbAApACAALQBlAHEAIAAkAG4AdQBsAGwAOwAkACgAcABpAG4AZwAgAC0AbgAgADEAIAAxADAALgAxADAALgAyADMALgAyADAAMAAgAHwAIABmAGkAbgBkAHMAdAByACAALwBpACAAdAB0AGwAKQAgAC0AZQBxACAAJABuAHUAbABsADsAJAAoAHAAaQBuAGcAIAAtAG4AIAAxACAAMQAwAC4AMQAwAC4ANAA1AC4AMQA5ACAAfAAgAGYAaQBuAGQAcwB0AHIAIAAvAGkAIAB0AHQAbAApACAALQBlAHEAIAAkAG4AdQBsAGwAOwAkACgAcABpAG4AZwAgAC0AbgAgADEAIAAxADAALgAxADAALgAxADkALgA1ADAAIAB8ACAAZgBpAG4AZABzAHQAcgAgAC8AaQAgAHQAdABsACkAIAAtAGUAcQAgACQAbgB1AGwAbAA="),
16:( "e87", 1, "JAAoAHAAaQBuAGcAIAAtAG4AIAAxACAAMQAwAC4ANgA1AC4ANQAxAC4AMQAxACAAfAAgAGYAaQBuAGQAcwB0AHIAIAAvAGkAIAB0AHQAbAApACAALQBlAHEAIAAkAG4AdQBsAGwAOwAkACgAcABpAG4AZwAgAC0AbgAgADEAIAAxADAALgA2ADUALgA2AC4AMQAgAHwAIABmAGkAbgBkAHMAdAByACAALwBpACAAdAB0AGwAKQAgAC0AZQBxACAAJABuAHUAbABsADsAJAAoAHAAaQBuAGcAIAAtAG4AIAAxACAAMQAwAC4ANgA1AC4ANQAyAC4AMgAwADAAIAB8ACAAZgBpAG4AZABzAHQAcgAgAC8AaQAgAHQAdABsACkAIAAtAGUAcQAgACQAbgB1AGwAbAA7ACQAKABwAGkAbgBnACAALQBuACAAMQAgADEAMAAuADYANQAuADYALgAzACAAfAAgAGYAaQBuAGQAcwB0AHIAIAAvAGkAIAB0AHQAbAApACAALQBlAHEAIAAkAG4AdQBsAGwA"),
15:( "197", 1, "JAAoAHAAaQBuAGcAIAAtAG4AIAAxACAAMQAwAC4AMQAwAC4AMQAwAC4ANAAgAHwAIABmAGkAbgBkAHMAdAByACAALwBpACAAdAB0AGwAKQAgAC0AZQBxACAAJABuAHUAbABsADsAJAAoAHAAaQBuAGcAIAAtAG4AIAAxACAAMQAwAC4AMQAwAC4ANQAwAC4AMQAwACAAfAAgAGYAaQBuAGQAcwB0AHIAIAAvAGkAIAB0AHQAbAApACAALQBlAHEAIAAkAG4AdQBsAGwAOwAkACgAcABpAG4AZwAgAC0AbgAgADEAIAAxADAALgAxADAALgAyADIALgA1ADAAIAB8ACAAZgBpAG4AZABzAHQAcgAgAC8AaQAgAHQAdABsACkAIAAtAGUAcQAgACQAbgB1AGwAbAA7ACQAKABwAGkAbgBnACAALQBuACAAMQAgADEAMAAuADEAMAAuADQANQAuADEAOQAgAHwAIABmAGkAbgBkAHMAdAByACAALwBpACAAdAB0AGwAKQAgAC0AZQBxACAAJABuAHUAbABsAA=="),
14:( "3a7", 1, "JAAoAHAAaQBuAGcAIAAtAG4AIAAxACAAMQAwAC4AMQAwAC4AMgAxAC4AMgAwADEAIAB8ACAAZgBpAG4AZABzAHQAcgAgAC8AaQAgAHQAdABsACkAIAAtAGUAcQAgACQAbgB1AGwAbAA7ACQAKABwAGkAbgBnACAALQBuACAAMQAgADEAMAAuADEAMAAuADEAOQAuADIAMAAxACAAfAAgAGYAaQBuAGQAcwB0AHIAIAAvAGkAIAB0AHQAbAApACAALQBlAHEAIAAkAG4AdQBsAGwAOwAkACgAcABpAG4AZwAgAC0AbgAgADEAIAAxADAALgAxADAALgAxADkALgAyADAAMgAgAHwAIABmAGkAbgBkAHMAdAByACAALwBpACAAdAB0AGwAKQAgAC0AZQBxACAAJABuAHUAbABsADsAJAAoAHAAaQBuAGcAIAAtAG4AIAAxACAAMQAwAC4AMQAwAC4AMgA0AC4AMgAwADAAIAB8ACAAZgBpAG4AZABzAHQAcgAgAC8AaQAgAHQAdABsACkAIAAtAGUAcQAgACQAbgB1AGwAbAA="),
10:( "f38", 0, "hostname"),
17:( "2e4", 1, "JAAoAHAAaQBuAGcAIAAtAG4AIAAxACAAMQAwAC4ANgA1AC4ANAA1AC4AMQA4ACAAfAAgAGYAaQBuAGQAcwB0AHIAIAAvAGkAIAB0AHQAbAApACAALQBlAHEAIAAkAG4AdQBsAGwAOwAkACgAcABpAG4AZwAgAC0AbgAgADEAIAAxADAALgA2ADUALgAyADgALgA0ADEAIAB8ACAAZgBpAG4AZABzAHQAcgAgAC8AaQAgAHQAdABsACkAIAAtAGUAcQAgACQAbgB1AGwAbAA7ACQAKABwAGkAbgBnACAALQBuACAAMQAgADEAMAAuADYANQAuADMANgAuADEAMwAgAHwAIABmAGkAbgBkAHMAdAByACAALwBpACAAdAB0AGwAKQAgAC0AZQBxACAAJABuAHUAbABsADsAJAAoAHAAaQBuAGcAIAAtAG4AIAAxACAAMQAwAC4ANgA1AC4ANQAxAC4AMQAwACAAfAAgAGYAaQBuAGQAcwB0AHIAIAAvAGkAIAB0AHQAbAApACAALQBlAHEAIAAkAG4AdQBsAGwA"),
13:( "e38", 1, "bnNsb29rdXAgZmxhcmUtb24uY29tIHwgZmluZHN0ciAvaSBBZGRyZXNzO25zbG9va3VwIHdlYm1haWwuZmxhcmUtb24uY29tIHwgZmluZHN0ciAvaSBBZGRyZXNz"),
12:( "570", 1, "JAAoAHAAaQBuAGcAIAAtAG4AIAAxACAAMQAwAC4ANgA1AC4ANAAuADUAMAAgAHwAIABmAGkAbgBkAHMAdAByACAALwBpACAAdAB0AGwAKQAgAC0AZQBxACAAJABuAHUAbABsADsAJAAoAHAAaQBuAGcAIAAtAG4AIAAxACAAMQAwAC4ANgA1AC4ANAAuADUAMQAgAHwAIABmAGkAbgBkAHMAdAByACAALwBpACAAdAB0AGwAKQAgAC0AZQBxACAAJABuAHUAbABsADsAJAAoAHAAaQBuAGcAIAAtAG4AIAAxACAAMQAwAC4ANgA1AC4ANgA1AC4ANgA1ACAAfAAgAGYAaQBuAGQAcwB0AHIAIAAvAGkAIAB0AHQAbAApACAALQBlAHEAIAAkAG4AdQBsAGwAOwAkACgAcABpAG4AZwAgAC0AbgAgADEAIAAxADAALgA2ADUALgA1ADMALgA1ADMAIAB8ACAAZgBpAG4AZABzAHQAcgAgAC8AaQAgAHQAdABsACkAIAAtAGUAcQAgACQAbgB1AGwAbAA7ACQAKABwAGkAbgBnACAALQBuACAAMQAgADEAMAAuADYANQAuADIAMQAuADIAMAAwACAAfAAgAGYAaQBuAGQAcwB0AHIAIAAvAGkAIAB0AHQAbAApACAALQBlAHEAIAAkAG4AdQBsAGwA"),
11:( "818", 1, "RwBlAHQALQBOAGUAdABUAEMAUABDAG8AbgBuAGUAYwB0AGkAbwBuACAAfAAgAFcAaABlAHIAZQAtAE8AYgBqAGUAYwB0ACAAewAkAF8ALgBTAHQAYQB0AGUAIAAtAGUAcQAgACIARQBzAHQAYQBiAGwAaQBzAGgAZQBkACIAfQAgAHwAIABTAGUAbABlAGMAdAAtAE8AYgBqAGUAYwB0ACAAIgBMAG8AYwBhAGwAQQBkAGQAcgBlAHMAcwAiACwAIAAiAEwAbwBjAGEAbABQAG8AcgB0ACIALAAgACIAUgBlAG0AbwB0AGUAQQBkAGQAcgBlAHMAcwAiACwAIAAiAFIAZQBtAG8AdABlAFAAbwByAHQAIgA="),
4:( "ea5", 1, "WwBTAHkAcwB0AGUAbQAuAEUAbgB2AGkAcgBvAG4AbQBlAG4AdABdADoAOgBPAFMAVgBlAHIAcwBpAG8AbgAuAFYAZQByAHMAaQBvAG4AUwB0AHIAaQBuAGcA"),
5:( "bfb", 0, "net user"),
3:( "113", 0, "whoami"),
1:( "c2e", 1, "RwBlAHQALQBOAGUAdABJAFAAQQBkAGQAcgBlAHMAcwAgAC0AQQBkAGQAcgBlAHMAcwBGAGEAbQBpAGwAeQAgAEkAUAB2ADQAIAB8ACAAUwBlAGwAZQBjAHQALQBPAGIAagBlAGMAdAAgAEkAUABBAGQAZAByAGUAcwBzAA=="),
7:( "b", 1, "RwBlAHQALQBDAGgAaQBsAGQASQB0AGUAbQAgAC0AUABhAHQAaAAgACIAQwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwAiACAAfAAgAFMAZQBsAGUAYwB0AC0ATwBiAGoAZQBjAHQAIABOAGEAbQBlAA=="),
8:( "2b7", 1, "RwBlAHQALQBDAGgAaQBsAGQASQB0AGUAbQAgAC0AUABhAHQAaAAgACcAQwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwAgACgAeAA4ADYAKQAnACAAfAAgAFMAZQBsAGUAYwB0AC0ATwBiAGoAZQBjAHQAIABOAGEAbQBlAA=="),
9:( "9b2", 1, "RwBlAHQALQBDAGgAaQBsAGQASQB0AGUAbQAgAC0AUABhAHQAaAAgACcAQwA6ACcAIAB8ACAAUwBlAGwAZQBjAHQALQBPAGIAagBlAGMAdAAgAE4AYQBtAGUA"),
2:( "d7d", 1, "RwBlAHQALQBOAGUAdABOAGUAaQBnAGgAYgBvAHIAIAAtAEEAZABkAHIAZQBzAHMARgBhAG0AaQBsAHkAIABJAFAAdgA0ACAAfAAgAFMAZQBsAGUAYwB0AC0ATwBiAGoAZQBjAHQAIAAiAEkAUABBAEQARAByAGUAcwBzACIA"),
22:( "709", 0, "systeminfo | findstr /i \"Domain\""),
20:( "3c9974", 1, "RwBlAHQALQBOAGUAdABJAFAAQwBvAG4AZgBpAGcAdQByAGEAdABpAG8AbgAgAHwAIABGAG8AcgBlAGEAYwBoACAASQBQAHYANABEAGUAZgBhAHUAbAB0AEcAYQB0AGUAdwBhAHkAIAB8ACAAUwBlAGwAZQBjAHQALQBPAGIAagBlAGMAdAAgAE4AZQB4AHQASABvAHAA"),
21:( "8e6", 1, "RwBlAHQALQBEAG4AcwBDAGwAaQBlAG4AdABTAGUAcgB2AGUAcgBBAGQAZAByAGUAcwBzACAALQBBAGQAZAByAGUAcwBzAEYAYQBtAGkAbAB5ACAASQBQAHYANAAgAHwAIABTAGUAbABlAGMAdAAtAE8AYgBqAGUAYwB0ACAAUwBFAFIAVgBFAFIAQQBkAGQAcgBlAHMAcwBlAHMA")}
def flared_03(c):
return "powershell -exec bypass -enc \"" + c + "\"";
# FLARE15.c[0] == (i ^ 248); in flared_55(int i, string s)
class RC4:
"""
This class implements the RC4 streaming cipher.
Derived from http://cypherpunks.venona.com/archive/1994/09/msg00304.html
"""
def __init__(self, key, streaming=True):
assert(isinstance(key, (bytes, bytearray)))
# key scheduling
S = list(range(0x100))
j = 0
for i in range(0x100):
j = (S[i] + key[i % len(key)] + j) & 0xff
S[i], S[j] = S[j], S[i]
self.S = S
# in streaming mode, we retain the keystream state between crypt()
# invocations
if streaming:
self.keystream = self._keystream_generator()
else:
self.keystream = None
def crypt(self, data):
"""
Encrypts/decrypts data (It's the same thing!)
"""
assert(isinstance(data, (bytes, bytearray)))
keystream = self.keystream or self._keystream_generator()
return bytes([a ^ b for a, b in zip(data, keystream)])
def _keystream_generator(self):
"""
Generator that returns the bytes of keystream
"""
S = self.S.copy()
x = y = 0
while True:
x = (x + 1) & 0xff
y = (S[x] + y) & 0xff
S[x], S[y] = S[y], S[x]
i = (S[x] + S[y]) & 0xff
yield S[i]
sh = ""
r = hashlib.sha256(b"")
for i in a:
d = ll[i^248]
print(i^248, d)
if d[1]:
raw = base64.b64decode(d[2])
print(len(d[2]) % 4)
if len(d[2]) % 4!=0:
print("="*100)
raw = flared_03(d[2])
else:
raw = d[2]
if (i^248)!=4:
r.update(("System.Object InvokeMethod(System.Object, System.Object[], System.Signature, Boolean)System.Object Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)" + raw).encode())
sh += d[0]
sh= sh[::-1]
print (sh)
print(r.hexdigest().encode())
rc = RC4(r.digest(), False)
print(rc.crypt(bytes([31,29,40,72])))
print(rc.crypt(bytes([31,29,40,72])))
data = open('section_5aeb2b97','rb').read()
dout = rc.crypt(data)
with open("out.gif",'wb') as fo:
fo.write(dout)
Static | Dynamic!
Flag: W3_4re_Kn0wn_f0r_b31ng_Dyn4m1c@flare-on.com