攻防世界 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}
攻防世界 debug的更多相关文章
- 【攻防世界】高手进阶 pwn200 WP
题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...
- 【攻防世界】 高手进阶区 Recho WP
0x00 考察点 考察点有三个: ROP链构造 Got表劫持 pwntools的shutdown功能 0x01 程序分析 上来三板斧 file一下 checksec --file XXX chmod ...
- pwn篇:攻防世界进阶welpwn,LibcSearcher使用
攻防世界welpwn (搬运一篇自己在CSDN写的帖子) 链接:https://blog.csdn.net/weixin_44644249/article/details/113781356 这题主要 ...
- 攻防世界pwn高手区——pwn1
攻防世界 -- pwn1 攻防世界的一道pwn题,也有一段时间没有做pwn了,找了一道栈题热身,发现还是有些生疏了. 题目流程 拖入IDA中,题目流程如图所示,当v0为1时,存在栈溢出漏洞.在gdb中 ...
- 攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup
攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup 题目介绍 题目考点 模板注入 Writeup 进入题目 import flask import os a ...
- CTF--web 攻防世界web题 robots backup
攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...
- CTF--web 攻防世界web题 get_post
攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...
- 攻防世界 web进阶练习 NewsCenter
攻防世界 web进阶练习 NewsCenter 题目是NewsCenter,没有提示信息.打开题目,有一处搜索框,搜索新闻.考虑xss或sql注入,随便输入一个abc,没有任何搜索结果,页面也没有 ...
- XCTF攻防世界Web之WriteUp
XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...
- 攻防世界 | CAT
来自攻防世界官方WP | darkless师傅版本 题目描述 抓住那只猫 思路 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经 ...
随机推荐
- Task Manager 的设计简述
讲解 Task Manager 之前,在这里先介绍一些 Task Manager 会使用到的概念术语. 图数据库 Nebula Graph 中,存在一些长期在后台运行的任务,我们称之为 Job.存储层 ...
- Server-side template injection 模板注入问题总结
概念: 服务器模板注入(Server-side template injection) 攻击者能够使用本地的模板语法去注入一个恶意的payload,然后在服务器端执行该攻击,当与欧股直接输入数据到模板 ...
- CPNtools协议建模安全分析---实例(二)
首先,token值是变迁的内部的,当变迁点火触发的时候token才会在网络中移动.在颜色Petri网中token是有区分的. 1.我么现在举一个学生吃饼的例子 ,颜色这样定义. s表示一个学生类 ...
- 【技术积累】Java 8 新特性
一.Lambda表达式 Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风格,使J ...
- Scala学习历险记(第一天)
Scala学习笔记(一) 前言:由于最近要整大数据相关的东西,所以java开发的我很苦逼的来学习Scala了,为接下来的工作做知识储备,今天是2021年8月19号,是我接触scala语言的第一天,因此 ...
- 使用 Docker 部署 Fiora 在线聊天室平台
一.Fiora 介绍 Fiora 简介 Fiora 是一款开源免费的在线聊天系统. GitHub:https://github.com/yinxin630/fiora Fiora 功能 注册账号并登录 ...
- css class 操作列 按钮 之间加 竖线 | class="your-handleBtn" :last-child::after
思路:botton 加一个class 每个右边加个竖线,最后一个不加. 用起来很方便 <template slot="handle" slot-scope="{ r ...
- Miracast技术详解(二):RTSP协议
目录 RTSP概述 抓包准备 WFD能力协商(Capability Negotiation) RTSP M1 Messages RTSP M2 Messages RTSP M3 Messages RT ...
- 自己动手做一个批量doc转换为docx文件的小工具
前言 最近遇到了一个需求,就是要把大量的doc格式文件转换为docx文件,因此就动手做了一个批量转换的小工具. 背景 doc文件是什么? "doc" 文件是一种常见的文件格式,通常 ...
- ItemsControl和ListView、ListBox的区别
1.ItemsControl用来显示一个数据项的集合,它的底层是一个列表,它可以非常灵活的展示布局和数据 以下是例子 <ItemsControl ItemsSource="{Bindi ...