C#程序的逆向
前言
本文将从简单C#入手,初步了解C#程序的逆向方式
1.认识C
C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework和.NET Core(完全开源)之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。
使用 .NET 框架提供的编译器可以直接将源程序编译为 .exe 或 .dll 文件,但此时编译出来的程序代码并
不是 CPU 能直接执行的机器代码,而是一种中间语言 IL(Intermediate Language)的代码。
将一个C#程序放IDA里看看
无法看反汇编,这时需要C#逆向神器——dnspy
2.dnspy
将程序拖入
加载了一些类
先来讲讲dnspy的基本使用方法
找到一个函数,右键
点击分析
相当于IDA的交叉引用
此外dnspy也支持动态调试和patch功能,功能十分强大
3.de4dot——去混淆
de4dot (https://github.com/de4dot/de4dot)是一个很强的.Net程序脱壳,反混淆工具,支持对于以下工具混淆过的代码的清理:如
Xenocode、.NET Reactor、MaxtoCode、Eazfuscator.NET、Agile.NET、Phoenix Protector、
Manco Obfuscator 、CodeWall、NetZ .NET Packer 、Rpx .NET Packer、Mpress .NET Packer、
ExePack .NET Packer、Sixxpack .NET Packer、Rummage Obfuscator、Obfusasm Obfuscator、
Confuser 1.7、Agile.NET、Babel.NET、CodeFort、CodeVeil、CodeWall、CryptoObfuscator、
DeepSea Obfuscator、Dotfuscator、 Goliath.NET、ILProtector、MPRESS、Rummage、
SmartAssembly、Skater.NET、Spices.Net 等
4.实战
[CFI-CTF 2018]IntroToPE
先运行一下
熟悉的flag检验器
Die识别出C#,果断dnspy分析
verifyPasswd这个类比较可疑
from base64就行,第一题比较简单
CFI{.NetC#1s@w3s0m3}
[ISC+2016]Classical+CrackMe
显然,这些类被混淆了,这时候就该上文提到的de4dot出场了
拖进去跑一下就行
成功去混淆
也是签到难度的题目 PCTF{Ea5y_Do_Net_Cr4ck3r}
[FlareOn5]Ultimate Minesweeper
flareon的题都挺质量的,来看一下这道题,先运行一下
扫雷游戏,踩到炸弹会显示失败页面然后退出
看到successpopup,右键分析,查看被使用
在这个if判断中被使用,没踩到雷就会弹出success界面
在上一个if判断中,如果踩到雷了,弹出fail界面
方法一:把含failpopup的if语句删掉,这样即使踩到雷也不会退出,就可以记录没有雷的区域
右键编辑类,删掉整个if,编译然后保存,但编译过程中报错:
error CS0266: Cannot implicitly convert type' double’ to 'byte’. An explicit conversion exists (are you missing a cast?)
上网搜了搜,错误原因是把int值赋给了byte,加一个强转类型即可
方法二:让每个区域都可见
跟进successpopup的判断条件
分析MineVisbile可视化函数,有两个方法get和set
看一下set被使用的情况
可见,初始化bool类型的MineVisbile时,默认的二维数组都是false,我们改为true
编译保存
重新下载一个新附件,照着这个点就行
这几道例题都可以在buuctf找到