首页 > 其他分享 >攻防世界 debug

攻防世界 debug

时间:2024-04-10 12:33:06浏览次数:20  
标签:11 攻防 脱壳 string int 世界 flag smethod debug

题目


分析过程

丢到PE里面

 一开始,我看到下面的脱壳提示,以为是我没见过的壳,下载了相关工具脱壳——发现脱了后又出现没见过的脱壳提示,根据提示脱壳弄出来的东西怪怪的

卡题,查了资料

学到一个新知识点:这是一个.NET文件,不脱壳也是可以的,不能用IDA

关于.NET的工具,我下了几个体验了一下同时询问了群里的大佬,在这里提供两个:ILSpy和dnSpy

工具下载:爱盘里面都有  爱盘 - 最新的在线破解工具包 (52pojie.cn)

个人比较喜欢ILSpy的代码

可以看出函数名字都是乱码,总体上不影响阅读与理解

我看大佬的wp,发现佬直接拿原文件调试,将dnSpy(辅助)与ILSpy(主体)结合分析解出flag

但是,我在瞎倒腾脱壳过程中意外发现了一件事

根据PE的脱壳提示,使用de4bot,再丢进ILSpy里面,函数名字竟然出现了

 这里了解到了一点:de4dot是一个很强的.Net程序脱壳,反混淆工具,可以利用de4dot解密被混淆的.NET代码

更多:[入门级]de4dot参数详解 - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

乱码的函数名字应该是混淆的结果,利用工具反混淆后就恢复了

 

先看看main函数

 1 private static void Main(string[] args)
 2 {
 3     string string_ = null;//初始化一个字符串string_
 4     string value = $"{DateTime.Now.Hour + 1}";//获取当前时间的小时部分加1,得到的结果转换成字符串并赋给value
 5     string string_2 = "CreateByTenshine";//string_2里面放了字符串 CreateByTenshine
 6     smethod_2(string_2, Convert.ToInt32(value), ref string_);//发生了函数调用,Convert.ToInt32(value)是将value字符串转换成整数
 7     string text = Console.ReadLine();//获得用户的输入,储存在text
 8     if (text == string_)
 9     {
10         Console.WriteLine("u got it!");
11         Console.ReadKey(intercept: true);
12     }
13     else
14     {
15         Console.Write("wrong");
16     }
17     Console.ReadKey(intercept: true);
18 }

调用了以下函数

 1 private static void smethod_2(string string_0, int int_0, ref string string_1)
 2 {
 3     int num = 0;
 4     if (0 < string_0.Length)
 5     {
 6         do
 7         {
 8             char c = string_0[num];
 9             int num2 = 1;
10             do
11             {
12                 //发生函数调用,将c的整数值和num2作为参数传递给它,然后将返回值转换为字符并赋给c
13                 c = Convert.ToChar(smethod_0(Convert.ToInt32(c), num2));//注意这里,下标是从1遍历到14,不是15,不懂的可以简单写一个程序实验一下
14                 num2++;
15             } while (num2 < 15);
16             string_1 += c;
17             num++;
18         } while (num < string_0.Length);
19     }
20     string_1 = smethod_1(string_1);//函数调用
21 }

调用了下面函数,以及下下一个函数

 1 //string_1 = smethod_1(string_1)
 2 private static string smethod_1(string string_0)
 3 {
 4     byte[] bytes = Encoding.ASCII.GetBytes(string_0);//将输入的字符串变为ASCII编码的字节数组,储存在bytes
 5     return "flag{" + BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(bytes)).Replace("-", "") + "}";
 6     //创建一个新的MD5CryptoServiceProvider实例
 7     //调用ComputeHash方法来计算给定字节数组bytes的MD5哈希值,赋值给MD5CryptoServiceProvider
 8     //BitConverter.ToString(...):将计算得到的MD5转换为一个由十六进制字符组成的字符串,每个字节用两个字符表示,并且字节之间没有分隔符
 9     // .Replace("-", ""): 将生成的十六进制字符串中的所有连字符"-"替换为空字符串""
10 }
 1 //smethod_0(Convert.ToInt32(c), num2)
 2 private static int smethod_0(int int_0, int int_1)
 3 {
 4     return (new int[30]//根据上面下标是1~14,而数组里面有30个,记得去掉不需要的
 5         {
 6             2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
 7                 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
 8                 73, 79, 83, 89, 97, 101, 103, 107, 109, 113
 9         })[int_1] ^ int_0;//将输入异或
10 }

解密脚本

在这里我犯了一个错误,真是被自己蠢笑了

给你们看看我第一次写的错误代码

 1 import hashlib
 2 
 3 str2 = "CreateByTenshine"
 4 str1 = [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]  # 1~14
 5 flag = ""
 6 
 7 for i in str2:
 8     for j in str1:
 9         c = chr(j ^ ord(i))
10     flag += c
11 
12 flag = hashlib.md5(flag.encode()).hexdigest()
13 print(flag)
14 
15 ##d539a7cd4194bebe05e544521c9c2405

在第9行,c只会包含每次外部循环迭代中最后一个异或操作的结果,每循环一次c都会刷新

我们再看看反汇编代码:c = Convert.ToChar(smethod_0(Convert.ToInt32(c), num2))——c就是str2

是拿str2的元素作为参数进行函数调用,再赋值回去

修改后的正确代码:

 1 import hashlib
 2 
 3 str2 = "CreateByTenshine"
 4 str1 = [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]  # 1~14
 5 flag = ""
 6 
 7 for i in str2:
 8     for j in str1:
 9         i = chr(j ^ ord(i))##这里由c变为i
10     flag += i
11 
12 flag = hashlib.md5(flag.encode()).hexdigest()
13 print(flag)

flag

flag{967dddfbcd32c1f53527c221d9e40a0}

标签:11,攻防,脱壳,string,int,世界,flag,smethod,debug
From: https://www.cnblogs.com/demo41/p/18125776

相关文章

  • 如何用加密技术守护你的数字世界(9):SSL/TLS
    该文章Github地址:https://github.com/AntonyCheng/encryption-notes【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template【有条件的情况......
  • HTML重要标签重点及属性——之转生在异世界学前端
    表格标签table是用于定义表格的标签tr是用于定义表格的行td是用来定义表格的列,th是表头一般只有一个表头会加粗表格属性border是设置边框值为1;1是有边框,align设置居中对齐方式center,left,rightcellpadding设置文字跟单元格的间隔cellspacing设置单元格直接的间隔  ......
  • 【攻防实操系列+内网渗透】--第1章:内网渗透测试基础①
    内网也指局域网(LocalAreaNetwork,LAN),是指在某一区域内由多台计算机互连而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等。内网是封闭的,可以由办公室内的两台计算机组成,也......
  • 网络攻防中黑客常用的信息收集手段以及信息泄漏途径,详细方法以及工具介绍
    网络攻防中黑客常用的信息收集手段以及信息泄漏途径,详细方法以及工具介绍。网络攻防中的信息收集是黑客攻击前的重要步骤,其目的是通过各种手段获取目标网络的详细信息,以便为后续的攻击活动提供支持。信息收集的手段多种多样,包括但不限于网络扫描、社会工程学、数据挖掘等。......
  • 中间件漏洞攻防学习总结
    前言面试常问的一些中间件,学习总结一下。以下环境分别使用vulhub和vulfocus复现。Apacheapache文件上传(CVE-2017-15715)描述:Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行......
  • 【攻防实操系列+域渗透】--域内主机(win7)配置
    1.设置静态IP,将DNS指向域控DNS的作用:定位域控2.创建域用户密码③❗❗❗至此,域内用户已经创建完成。3.把用户加入域❗会让你立即重启。切换用户,输入:new.com\lyj密码③❗❗❗至此,就是域内主机(win7)的大概配置了。......
  • 【攻防实操系列+域渗透】--安装域控(Windows-Server-2008-R2-x64)教程
    1.创建windows2008R2虚拟机选完全安装。第一个是标准版功能很少。不建议选。另外两个任意选。我选的是Enterprse企业版。❗❗❗注意:需要提前了解域控的密码复杂度规则。密码一定要自己记住!!!密码①可以看到界面非常小,不方便操作。❗❗❗需要安装vm......
  • 深入理解PHP+Redis实现布隆过滤器(亿级大数据处理和黑客攻防必备)
    布隆过滤器极简概括英文名称BloomFilter,用于判断一个元素是否在一个大数据集合中,如果检测到存在则有可能存在,如果不存在则一定不存在。Redis官网对于布隆过滤器的说明:https://redis.io/docs/data-types/probabilistic/bloom-filter/使用场景防止缓存穿透:用于快速判断某个商......
  • vivado 使用“Set Up Debug”Wizard 来插入调试核
    使用“SetUpDebug”Wizard来插入调试核标记要调试的信号线(net)后,下一步是将其分配到调试核。VivadoDesignSuite提供了易于使用的“设置调试(SetupDebug)”Wizard,以帮助逐步指导您完成自动创建调试核并将调试信号线分配至核的输入的整个过程......
  • 攻防世界 Mine- IDA静调或x64dbg动调 两种方式
    刷攻防世界的最后一道二星题,记录一下,大佬请飘过 题目分析过程我很勇,我先双击看看这是什么是一个扫雷游戏,第一下运气好没踩雷,发现无法继续输入了;如果运气不好,会输出“您踩雷啦!”丢到PE里面 无壳,64位丢到IDA里面,shif+F12查看字符串,追踪可疑字符串,发现main函数1in......