一、查看程序类型
PE32 无壳,库中显示其为.NET库,故为C#编写的程序,用dnspy打开
运行程序
二、用dnspy打开
1.定位关键代码段
左侧导航栏再此程序中逐个查看,最终再02000003中找到关键代码段
发现其定义个多个函数
逐个分析
2.查看各个函数
(1)private static int ᜀ(int A_0, int A_1)
定义了一个数组,将输入的两个参数异或后返回
(2)private static string ᜀ(string A_0)
srting()函数将传入的参数,进行MD5加密后返回
(3)private static void ᜀ(string A_0, int A_1, ref string A_2)
第65行,括号内的第一个单独的“.”,调用了第一个函数int()(可能因为dnspy反编译显示不完整)
将输入字符串与上面定义的数组进行逐位异或,得到的结果通过第三个参数A_2返回
(4)private static void ᜀ(string[] A_0)
对字符串a= "CreateByTenshine"进行一系列处理+调用第二个函数string()进行md5加密后,最终与b进行对比,若相等则输出正确提示,所以b的值即为flag
三、解题
方法一、动态调试
F9下和取消断点,F10单步步过,F11单步步⼊,shift+F11跳出函数
在第84行下断点后,直接运行查看b的值
查看局部变量窗口,找到flag为:flag{967DDDFBCD32C1F53527C221D9E40A0B}
方法二、编写脚本
import hashlib
a=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,
61,67,71,73,79,83,89,97,101,103,107,109,113]
str = "CreateByTenshine"
flag = ''
for x in str:
x = ord(x)
for i in range(1,15):
x ^= a[i]
flag += chr(x)
flag = hashlib.md5(flag.encode()).hexdigest().upper()
print("flag{" + flag +"}")
运行结果:
flag{967DDDFBCD32C1F53527C221D9E40A0B}
在程序中尝试