C#程序逆向简单分享

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找到

0 条评论
某人
表情
可输入 255