[逆向][Writeup]ISG2015 flagfinder - .NET程序逆向

这个题目同样是一道.NET的逆向题,.NET的逆向方法在之前的博文中已经介绍过,这里不做重复的说明。本题的源程序可以在我的github上下载:https://github.com/gsharpsh00ter/reverse

0x01 逆向

flagfinder为.NET编译的PE文件,用dnSpy反编译后,得到如下源码:

  1 using System;
  2 using System.IO;
  3 using System.Linq;
  4 using System.Security.Cryptography;
  5 using System.Threading;
  6 using Microsoft.VisualBasic.CompilerServices;
  7 
  8 namespace flagfinder
  9 {
 10     // Token: 0x02000007 RID: 7
 11     [StandardModule]
 12     internal sealed class Module1
 13     {
 14         // Token: 0x06000012 RID: 18 RVA: 0x000020D4 File Offset: 0x000002D4
 15         [STAThread]
 16         //遍历所有驱动器上的所有文件
 17         public static void Main()
 18         {
 19             DriveInfo[] drives = DriveInfo.GetDrives();
 20             checked
 21             {
 22                 for (int i = 0; i < drives.Length; i++)
 23                 {
 24                     DriveInfo driveInfo = drives[i];
 25                     if (driveInfo.IsReady)
 26                     {
 27                         Module1.SearchDir(driveInfo.RootDirectory);
 28                     }
 29                 }
 30             }
 31         }
 32 
 33         // Token: 0x06000013 RID: 19 RVA: 0x0000210C File Offset: 0x0000030C
 34         public static void SearchDir(DirectoryInfo dir)
 35         {
 36             checked
 37             {
 38                 try
 39                 {
 40                     FileInfo[] files = dir.GetFiles();
 41                     for (int i = 0; i < files.Length; i++)
 42                     {
 43                         FileInfo file = files[i];
 44                         //对于每一个文件,会进行检查,找到符合条件的文件会打印flag
 45                         Module1.CheckFile(file);
 46                     }
 47                     DirectoryInfo[] directories = dir.GetDirectories();
 48                     for (int j = 0; j < directories.Length; j++)
 49                     {
 50                         dir = directories[j];
 51                         Module1.SearchDir(dir);
 52                     }
 53                 }
 54                 catch (Exception expr_49)
 55                 {
 56                     ProjectData.SetProjectError(expr_49);
 57                     Console.WriteLine("Unable to search: " + dir.FullName);
 58                     ProjectData.ClearProjectError();
 59                 }
 60             }
 61         }
 62 
 63         // Token: 0x06000014 RID: 20 RVA: 0x00002198 File Offset: 0x00000398
 64         public static void CheckFile(FileInfo file)
 65         {
 66             try
 67             {
 68                 Console.WriteLine("Analyzing " + file.FullName + " ...");
 69                 //此处为判断条件,文件内容的MD5为指定值后会计算sha256哈希值,并打印flag
 70                 MD5CryptoServiceProvider mD5CryptoServiceProvider = new MD5CryptoServiceProvider();
 71                 if (mD5CryptoServiceProvider.ComputeHash(file.OpenRead()).SequenceEqual(Module1.target))
 72                 {
 73                     SHA256CryptoServiceProvider sHA256CryptoServiceProvider = new SHA256CryptoServiceProvider();
 74                     Console.WriteLine("We've found the flag on your hard drive:");
 75                     Console.WriteLine("ISG{" + BitConverter.ToString(sHA256CryptoServiceProvider.ComputeHash(file.OpenRead())).ToLower() + "}");
 76                     Environment.Exit(0);
 77                 }
 78                 Thread.Sleep(100);
 79             }
 80             catch (Exception expr_81)
 81             {
 82                 ProjectData.SetProjectError(expr_81);
 83                 Console.WriteLine("Unable to read: " + file.FullName);
 84                 ProjectData.ClearProjectError();
 85             }
 86         }
 87 
 88         // Token: 0x04000006 RID: 6
 89         private static byte[] target = new byte[]
 90         {
 91             108,
 92             203,
 93             97,
 94             69,
 95             90,
 96             216,
 97             146,
 98             25,
 99             144,
100             43,
101             58,
102             246,
103             10,
104             154,
105             45,
106             28
107         };
108     }
109 }

0x02 分析

程序逻辑比较简单,运行后会遍历驱动器上的所有文件,并对每一个文件进行检查。如果某个文件的内容经过MD5哈希后是指定的值(target),则该文件为flag文件,此时会计算器sha256的哈希值,并打印flag。

显然我们不太可能根据已有的MD5值去逆向破解出文件的内容。可以用google查一下对应的MD5值。在http://www.herdprotect.com/a2cmd.exe-12fc1578b371d0847bf158eefb36f85f42cb9fb3.aspx这个页面,我们发现相关的信息:

MD5: 6ccb61455ad89219902b3af60a9a2d1c

Sha256: 4cbce92e74fc64dba2b0c5194dd54bf7d694d37fc758572f46bd5b3b8a0c1a80

这应该是一个恶意文件的MD5值,虽然我们没有该文件,但是没关系,我们已经得到了sha256的哈希值,根据程序逻辑,我们已经可以自己打印flag了。

打印flag的python代码如下:

 1 #!/usr/bin/python2
 2 
 3 #targets = [108, 203, 97, 69, 90, 216, 146, 25, 144, 43, 58, 246, 10, 154, 45, 28]
 4 md5="6ccb61455ad89219902b3af60a9a2d1c"
 5 sha256="4cbce92e74fc64dba2b0c5194dd54bf7d694d37fc758572f46bd5b3b8a0c1a80"
 6 flag="ISG{"
 7 
 8 for i in range(0, len(sha256), 2):
 9     flag = flag + sha256[i:i+2] + "-"
10 flag += "}"
11 flag = flag.replace("-}", "}")
12 print flag

运行结果如下:

Flag为:

ISG{4c-bc-e9-2e-74-fc-64-db-a2-b0-c5-19-4d-d5-4b-f7-d6-94-d3-7f-c7-58-57-2f-46-bd-5b-3b-8a-0c-1a-80}

转载于:https://www.cnblogs.com/gsharpsh00ter/p/6404940.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 编译原理 字符串_Java编译原理(javac)

Java中的编译分为两个部分&#xff1a;源码文件编译成字节码文件(前端编译)字节码文件被虚拟机加载以后编译成机器码(后端编译)对于开发来说接触的一般都是第一个步骤也就是源码编译成字节码文件(class文件)&#xff0c;第二个步骤开发几乎不会接触&#xff0c;因为这是虚拟机在…

sql2012一段时间无法连接报53错误

2019独角兽企业重金招聘Python工程师标准>>> 解决方案 在sqlserver网络配置下的msqlserver协议下改将ip3改成如下图所示 转载于:https://my.oschina.net/u/2511906/blog/840373

php生成图片验证码代码,PHP生成图片验证码以及点击切换的代码

这篇文章主要介绍了PHP生成图片验证码实例,同时介绍了点击切换(看不清&#xff1f;换一张)效果实现方法,需要的朋友可以参考下这里来看下效果:现在让我们来看下 PHP 代码<?php session_start();function random($len) {$srcstr "1a2s3d4f5g6hj8k9qwertyupzxcvbnm&quo…

php 字符型转变为数值,php怎么把字符串转换为数值?

php怎么把字符串转换为数值&#xff1f;下面本篇文章给大家介绍一下PHP把字符串转换为数值的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。PHP中的字符串可以很容易地转换成数值(float / int / double类型)。在大多数用例中&am…

解决rspec 生成报告时报utf-8错误的方法

找到gems\1.9.1\gems\rspec-core-2.14.3\lib\rspec\core\formatters\snippet_extractor.rb文件中的第27行&#xff1a; 在这边记录一下&#xff0c;防止以后再遇到。。。出现这个原因是因为ruby文件用utf-8格式的&#xff0c;但是源码都是GBK处理的&#xff0c;找到\lib\ruby\…

EFProf Entity Framework Profile 工具

SQL Server Profiler用来跟踪应用程序发送到SQL Server中的SQL语句&#xff0c;用于检测性能&#xff0c;查找问题。Entity Framework 也有它的跟踪工具EFProf&#xff0c;用于跟踪Entity Framework发送到SQL Server中的SQL语句。 首先在代码中添加对程序集HibernatingRhinos.P…

php面试中的问题,十个值得深思的PHP面试问题

十个值得深思的PHP面试问题过来人在以往的面试中总结的10个值得深思的 PHP 面试问题&#xff0c;希望对你现在的面试有用&#xff0c;少走弯路&#xff0c;更多内容请关注应届毕业生网!Q1第一个问题关于弱类型$str1 yabadabadoo;$str2 yaba;if (strpos($str1,$str2)) {echo &…

Android中ExpandableListView控件基本使用

本文採用一个Demo来展示Android中ExpandableListView控件的使用&#xff0c;如怎样在组/子ListView中绑定数据源。直接上代码例如以下&#xff1a; 程序结构图&#xff1a; layout文件夹下的 main.xml 文件源代码例如以下&#xff1a; <?xml version"1.0" encodi…

武林外史java游戏,武林外史_网络游戏专区_腾讯游戏频道

1 、武师用防御工具1) 武卫类> 用土布制作的防护工具。阶段图片名称说明1武威带所需功力值所需力量所需技艺所需体力所需智能所需敏捷性防御力防御成功率8013013021 %武威甲所需功力值所需力量所需技艺所需体力所需智能所需敏捷性防御力防御成功率4160150021 %武威长裤所需功…

简单实现KeyChain实例

目录结构如下&#xff1a; AppDelegate.m 1 //2 // AppDelegate.m3 // KeyChain4 //5 // Created by apple on 14-12-26.6 // Copyright (c) 2014年 ll. All rights reserved.7 //8 9 #import "AppDelegate.h" 10 11 interface AppDelegate () 12 13 end 14 1…

JAVA入门[6]-Mybatis简单示例

初次使用Mybatis,先手写一个hello world级别的例子&#xff0c;即根据id查询商品分类详情。 一、建表 create table Category ( Id INT not null, Name varchar(80) null, constraint pk_category primary key (Id) ); 插入测试数据 INSERT INTO category VALUES (1,Fish); INS…

ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用

ASP.NET MVC5 EF6 入门教程 (6) View中的Razor使用 原文:ASP.NET MVC5 EF6 入门教程 (6) View中的Razor使用文章来源&#xff1a; Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-ef-6-get-started-model.html 上一节&#xff1a;ASP.NET MVC5 EF6 入门教程 (5) M…

递归--基于回溯和递归的八皇后问题解法

八皇后问题是在8*8的棋盘上放置8枚皇后&#xff0c;使得棋盘中每个纵向、横向、左上至右下斜向、右上至左下斜向均只有一枚皇后。八皇后的一个可行解如图所示&#xff1a; 思路 对于八皇后的求解可采用回溯算法&#xff0c;从上至下依次在每一行放置皇后&#xff0c;进行搜索&a…

matlab emf 读取,20140219-Emf_Demo EMF 矢量图 可以读取和保存EMF 的封闭类 非常实用 matlab 238万源代码下载- www.pudn.com...

文件名称: 20140219-Emf_Demo下载收藏√ [5 4 3 2 1 ]开发工具: Visual C文件大小: 6312 KB上传时间: 2014-07-10下载次数: 2详细说明&#xff1a;EMF 矢量图 可以读取和保存EMF矢量图的封闭类非常实用-EMF EMF vector can read and save the class very useful vector cl…

JS中popup.js

为什么80%的码农都做不了架构师&#xff1f;>>> //popup class 显示弹出窗口&#xff0c;。/*以下为使用popup对象&#xff0c;传入相应的配置参数&#xff0c;弹出不同类型的窗口 function ShowIframe() //显示iframe { var popnew P…

二阶振荡衰减 matlab,基于Matlab/Simulink的二阶控制系统仿真研究

1 二阶控制系统模型本文引用地址&#xff1a;http://www.eepw.com.cn/article/201612/328597.htm能够用二阶微分方程描述的系统称为二阶控制系统。在控制工程实践中&#xff0c;二阶控制系统十分常见&#xff0c;例如&#xff0c;电枢控制的直流电动机&#xff0c;RLC网络和弹簧…

CCF201409-5 拼图(30分)

试题编号&#xff1a; 201409-5 试题名称&#xff1a; 拼图 时间限制&#xff1a; 3.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述给出一个nm的方格图&#xff0c;现在要用如下L型的积木拼到这个图中&#xff0c;使得方格图正好被拼满&#xff0c;请问总共有…

C++ 0x

转载于:https://www.cnblogs.com/iiiDragon/p/3230006.html

Github for Windows使用介绍

Git已经变得非常流行&#xff0c;连Codeplex现在也已经主推Git。Github上更是充斥着各种高质量的开源项目&#xff0c;比如ruby on rails&#xff0c;cocos2d等等。对于习惯Windows图形界面的程序员来讲&#xff0c;Github的使用是需要点时间和耐心的&#xff0c;然而最近Githu…

matlab中udt函数,《MATLAB信号处理超级学习手册》——2.5 离散时间信号中的运算...

本节书摘来自异步社区《MATLAB信号处理超级学习手册》一书中的第2章&#xff0c;第2.5节&#xff0c;作者&#xff1a;MATLAB技术联盟 , 史洁玉著&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看2.5 离散时间信号中的运算MATLAB信号处理超级学习手册2.5.1 离散…