ouc 网络安全实验 反汇编 逆向实验

文章目录

因为当时自己做实验的时候出现了很多疑问不会解决,在网上看到了一位大佬 王森ouc 的专栏文章解决了很多问题,也学到了很多知识和解决问题的方法,现在把我的实验解决方法也发上来,希望有不会的同学可以通过博文理解实验内容,同时能够熟练掌握这些知识。感谢这位大佬和课堂中帮助过我的同学老师。

注意:博文仅供学习参考使用,请勿直接复制粘贴,因个人复制粘贴造成的后果博主一概不负责任。

要求

lab1 包含 4 个题目,需要对 4 个程序进行逆向。逆向结果为一个 flag 开头的可见字符串,正则形式为: flag{[0-9a-zA-Z]+}。
其中 lab1-1 是简单的逆向入门用于熟悉软件和环境,lab1-2 和 lab1-3 涉及到数学计算,需要通过基本的数学运算性质进行逆计算得出 flag,lab1-4 需要对原有的二进制进行一些修改,之后才能进行正常的输入输出。
每个程序在输入正确的 flag 后会显示 good,如果 flag 不正确将会输出 error flag。

lab1

在编译器网站(Compiler Explorer)对简单的 C 语言进行编译后,我发现字符串的编译结果是反着的。比如某个字符串是“abc”,把编译出来的十六进制字符转字符串后,得到的结果是“cba”。

在 IDA 反汇编得到十六进制数如图所示,进行十六进制转文字,解出的是反着的正确答案。将结果倒置即可得到正确结果,为“flag{Welcome_t0_security_c0urse}”。

在这里插入图片描述

lab2

对文件进行反汇编,得到伪代码如图。大概意思为 “a[i]^i=” 预先存进程序的字符, ^是按位异或。

如果当前为第一轮,假设第一个数为 x,为八位二进制数,x 和 0000 0000 进行异或,结果是 0x66(0110 0110),可计算出 x 为 0110 0110,对每一位进行计算,即可通关。目标字符已经给出,通过计算可以得出最后结果是:“flag{xor_is_reversible}”。

for ( i = 0; i <= 22; ++i )
{
	if( (i^v31[i]) != *(&v8 + i) )
	{	puts("error flag");
		exit(0);
	}
}
puts("Good");

在这里插入图片描述

lab3

将文件放入 Ghidra,根据反汇编的伪代码,可以得出目标字符为“flag{equation}”。

在这里插入图片描述

lab4

查看反汇编的伪代码,发现 main 函数内没有内容,查看源文件,发现函数入口处应该是 55,但是文件里是 C3,在 IDA 里对文件进行修改,如图 8,得到 showflag 函数。

函数大致意思为 a[i](输入的字符)先和 i(当前的轮次)异或,得到的结果再 i 相加,最后和程序预先输入的字符比较。如果在第一轮,假设需要的第一个字符为 x,将二进制 x 和 0000 0000 进行异或,再加0000 0000 即为之前存进来的十六进制 66,即 0110 0110,因此 x 为 0110 0110,换为字符即“f”。

因为由 lab1-1 得出反汇编出的伪代码中的字符串都是倒着的,因此读的时候应该反着来,比如 local_28 的正确破解方式应该是“66 6e 65 67 83 7a 6d 7a”以此类推。最后结果为“flag{patch_your_file}”。

在这里插入图片描述
在这里插入图片描述

for ( i = 0; i <= 20; ++i )
{
	if(i+(i^*(_BYTE *)(i + a1)) != *((_BYTE*)&v3 + i) )
	{
		puts("error");
		return *MK_FP(__FS__, 40LL) ^ v6;
	}
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值