RE_lab3
- Question 1
- Question 2
- Question 3
- 3.1 题目要求
- 3.2 解答
- 3.2.1 修改exe使得出现成功提示
- 3.2.2 不修改exe输入正确的密码达到成功的目的
- Question 4(选做)
- Question 5
组长 | 组员 | 组员 |
---|
E41714007 | E41714001 | E41714020 |
Question 1
1.1 题目要求
- 阅读
然后回答问题:
What does this code do?
一样的代码,只不过换成了Java语言
Java 1.8 compiler:public boolean f(char);descriptor: (C)Zflags: ACC_PUBLICCode:stack=2, locals=2, args_size=20: iload_11: bipush 973: if_icmplt 146: iload_17: bipush 1229: if_icmpgt 1412: iconst_113: ireturn14: iload_115: bipush 6517: if_icmplt 2820: iload_121: bipush 9023: if_icmpgt 2826: iconst_127: ireturn28: iconst_029: ireturn
1.2 解答
由于Java语言类似,故以下只解释一种
Optimizing csc .NET compiler from MSVS 2015 (/o switch), ildasm output:.method public hidebysig static bool f(char a) cil managed{.maxstack 8 IL_0000: ldarg.0 IL_0001: ldc.i4.s 97 IL_0003: blt.s IL_000c IL_0005: ldarg.0 IL_0006: ldc.i4.s 122 IL_0008: bgt.s IL_000c IL_000a: ldc.i4.1 IL_000b: ret IL_000c: ldarg.0 IL_000d: ldc.i4.s 65 IL_000f: blt.s IL_0018 IL_0011: ldarg.0 IL_0012: ldc.i4.s 90 IL_0014: bgt.s IL_0018 IL_0016: ldc.i4.1 IL_0017: ret IL_0018: ldc.i4.0 IL_0019: ret }
Question 2
2.1 题目要求
- 2017bath这张图片有一些文字片段,可能简单加密了,是某人说的,此人的姓名是什么?
hint:hex editor
2.2 解答
尝试打开2017bath.jpg
文件,发现可以以图片格式正常打开
根据题目所给的提示信息,通过十六进制编辑器(hex editor)打开2017bath.jpg文件
我使用的是notepad++的HEX-Editor插件
一直看到文件末尾,发现出现Rail-Fence
字样,因此,我们可以知道,图片的某些信息可能采用了栅栏密码加密的方式
根据上面的分析,将2017bath.jpg文件的后缀名修改为zip
,并且进行解压
,得到以下文件
打开可以发现以下内容
即一串字符串,具体内容如下
CrudreasrsheheanaulhfouCmhlaopiaeifltouermrtdpiyeCntpmafhnpbgmbaoagspeuteuwtecwokpetwutileolctnreoicottievhetepriogoseIretodaiithgottfeorhersnueualtebtfamtnseetehrnieipooilrshashyhsrmttmanariaictntgutdeeonmotaudeowuselctnfeoghrtsbaCrgarhtbprthcirarQktodbeatees
接下来,根据得到的文本内容,破解栅栏密码,此处采用暴力破解
代码如下
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include int main(void)
{char c[] &#61; "CrudreasrsheheanaulhfouCmhlaopiaeifltouermrtdpiyeCntpmafhnpbgmbaoagspeuteuwtecwokpetwutileolctnreoicottievhetepriogoseIretodaiithgottfeorhersnueualtebtfamtnseetehrnieipooilrshashyhsrmttmanariaictntgutdeeonmotaudeowuselctnfeoghrtsbaCrgarhtbprthcirarQktodbeatees";int len &#61; strlen(c);char tmp_c[50][50] &#61; { 0 };int index &#61; 0;int i, j, k;for (i &#61; 1; i < 11; &#43;&#43;i){printf("ตฺ%dื้:\n", i);index &#61; 0;for (j &#61; 0; j < len % i; &#43;&#43;j){for (k &#61; 0; k < ceil(len / (double)i); &#43;&#43;k){tmp_c[j][k] &#61; c[index];&#43;&#43;index;}}for (; j < i; &#43;&#43;j){for (k &#61; 0; k < ceil(len / (double)i) - 1; &#43;&#43;k){if (index > len){break;}tmp_c[j][k] &#61; c[index];&#43;&#43;index;}}index &#61; 0;for (k &#61; 0; k < ceil(len / (double)i); &#43;&#43;k){for (j &#61; 0; j < i; &#43;&#43;j){if (index > len){break;}printf("%c", tmp_c[j][k]);&#43;&#43;index;}}printf("\n\n");}printf("\n");system("pause");return 0;
}
运行结果如下
根据运行结果可以知道,只有第9组最符合逻辑思维,所以可以知道,解密后明文如下
CppisahorriblelanguageItsmademorehorriblebythefactthatalotofsubstandardprogrammersuseittothepointwhereitsmuchmucheasiertogeneratetotalanduttercrapwithitQuitefranklyevenifthechoiceofCweretodonothingbutkeeptheCppprogrammersoutthatinitselfwouldbeahugereasontouseC
为了方便阅读,适当断句
Cpp is a horrible language Its made more horrible by the fact that a lot of substandard programmers use it to the point where its much much easier to generate total and utter crap with it Quite frankly even if the choice of C were to do nothing but keep the Cpp programmers out that in itself would be a huge reason to use C
通过断句,阅读之后,可以发现这句话是Linux之父Linus Torvalds说的,所以本题的答案就是Linus Torvalds
Question 3
3.1 题目要求
- 运行CrackMe1.exe&#xff0c;提示 “
嗯&#xff0c;对了
” 代表成功。首先修改exe使得出现成功提示&#xff0c;其次不修改exe输入正确的密码达到成功的目的。
hint
3.2 解答
首先尝试运行CrackMe1.exe,发现出现以下结果
随便输入一些信息,看看出现什么结果
3.2.1 修改exe使得出现成功提示
使用IDA分析CrackMe1.exe,根据题目的提示信息,可以知道”嗯,对了
”是我们需要跳转的地方
根据查看,可以知道,需要跳转到指定的位置,就需要修改判断语句brtrue.s的跳转条件
- brtrue.s表示如果value的值为true/非空/非零,则将控制转移到目标指令&#xff08;短格式&#xff09;
- brfalse.s表示如果value的值为false/空引用/零,则将控制转移到目标指令
所以&#xff0c;把此处brtrue.s改为brfalse.s
就可以了
修改之前
brtrue.s的十六进制是2D&#43;跳转地址, brfalse.s的十六进制是2C&#43;跳转地址
由于跳转地址是不会改变的,只需要将2D修改为2C
即可
使用十六进制编辑器修改,修改之后的文件另存为CrackMe1_1.exe
修改之后
运行程序CrackMe1_1.exe,输入一样的信息,发现已经修改了
3.2.2 不修改exe输入正确的密码达到成功的目的
用.NET Reflector软件分析CrackMe1.exe&#xff0c;在button1_Click函数
中里能看到
可以知道,只要字符串加密的结果和给定的一致,就会成功,所以接下来查看加密函数
由于分析之后可以知道加密方式是3DES加密,使用在线解密工具进行解密
在线解密工具
所以可以知道输入wctf{dotnet_crackme1}
就可以成功了,接下来进行尝试
Question 4(选做)
4.1 题目要求
- &#xff08;选做&#xff09;修改CrackMe1.exe使得&#xff1a;只有输入你的学号才能出现成功提示。并且把“大家好…net”这段话全部换成自己自定义的英文。
4.2 解答
首先使用在线工具,将学号E41714007
使用3DES加密
加密结果为fGnUImcGhy9TEXPa7W2bZw&#61;&#61;
通过十六进制编辑器将密码判断处的字符串修改为fGnUImcGhy9TEXPa7W2bZw&#61;&#61;
使用十六进制编辑器修改,修改之后的文件另存为CrackMe1_2.exe
修改前
需要注意的是,加密字符串的前一个字节表示的是加密字符串的长度&#43;结束标志0x01
,最后还有一个结束标志符00
修改后
运行,输入学号进行检测,发现成功
接下来进行自定义字符串的修改
首先将需要的字符串的16进制表示出来(此处用的是notepad&#43;&#43;插件)
接下来开始转换
字符串“大家好&#xff01;我是
”修改为“hello!
”&#xff1a;
字符串“&#64;无所不能的魂大人
”修改为“huang_xm!
”&#xff1a;
微博链接“http://weibo.com/woldy
”修改为“http://baidu.com/huang
”&#xff1a;
字符串“编点练习题太TMD难了。。欢迎投稿哦&#xff01;投稿地址king&#64;woldy.net
”修改为“hahaE41714007huang_xin_mingE41714007HELLO
”&#xff1a;
修改后进行测试,输入学号,发现正确,而且界面也被修改
点击huang_xm!处的链接,显示如下,因为网页是随便填的
Question 5
5.1 题目要求
- 运行login.exe&#xff0c;提示 “
You Get It!
” 代表成功。
5.2 解答
尝试运行login.exe,随便输入信息,显示如下
用.NET Reflector分析login.exe&#xff0c;在button1_Click函数中里能看到
根据代码分析,要想得到"You Get It!",密码需要满足以下三个条件
- 密码长度为9
- 所有字符的ASCII码算术运算加后是0x1d8
- 所有字符的ASCII码逻辑运算与后是0x42
满足条件的密码有很多,根据提示知道是学号,接下来采用暴力破解,查找正确的密码
(此处根据信息安全专业学号特点可以知道前几位为E41X140XX
)
破解代码如下
#include
#include
#include int main()
{char str[] &#61; "0123456789E";int len &#61; strlen(str);char login[9];int num1 &#61; 0, num2 &#61; 0;login[0] &#61; &#39;E&#39;;login[1] &#61; &#39;4&#39;;login[2] &#61; &#39;1&#39;;login[4] &#61; &#39;1&#39;;login[5] &#61; &#39;4&#39;;login[6] &#61; &#39;0&#39;;for(int i3 &#61; 0; i3 < len; &#43;&#43;i3){login[3] &#61; str[i3];for (int i8 &#61; 0; i8 < len; &#43;&#43;i8) {login[7] &#61; str[i8];for (int i9 &#61; 0; i9 < len; &#43;&#43;i9) {login[8] &#61; str[i9];for (int i &#61; 0; i < 9; &#43;&#43;i) {num1 &#61; num1 &#43; (int)login[i];num2 ^&#61; (int)login[i];}if (num1 &#61;&#61; 472 && num2 &#61;&#61; 66) {for (int j &#61; 0; j < 9; &#43;&#43;j)printf("%c", login[j]);printf("\n");}num1 &#61; 0;num2 &#61; 0;}}}printf("\n");system("pause");return 0;
}
运行结果如下
随便挑4个密码进行验证,均成功,结果如下