IDA动态调试解RC4

news/2024/10/13 12:22:33

IDA动态调试解RC4

本篇博客所有内容,均学习于无名侠大佬在bilibili的视频:https://www.bilibili.com/video/BV1WQ4y1X7TY

LazyIDA熊猫版:https://github.com/P4nda0s/LazyIDA

实验文件下载:https://github.com/P4nda0s/SycRevLearn


有一些算法的加密与解密是相同的算法过程,例如 RC4、部分简单的异或算法等。

测试方法:

1.设置算法输入数据A

2.获取算法输出数据B

3.设置算法输入数据为B (上一步结果代入)

4.获取算法输出数据 B',对比 B' 与 A 的值,若相等则该算法加密解密是同一段代码。

通俗来讲,就是输入A输出B,输入B输出A。

拿视频中的题目来分析:

  sub_85F057(v14);//反调试puts("Welcome!! give me your flag:\n");do{v8 = j_j_j___fgetchar();if ( v8 == 10 )break;input[index++] = v8;}while ( (int)index < 44 );if ( index >= 0x200 )j____report_rangecheckfailure();input[index] = 0;len = j__strlen(input);sub_85CEFB((int)v13, (int)v14, len);for ( i = 0; i < 256; ++i )v12[i] = v13[i];fun1((int)v13, (int)input, len);//加密函数for ( j = 0; j < 44; ++j ){if ( v7[j] == input[j] )++v10;}if ( v10 == 44 )puts("Yes, u right!\n");elseputs("no no no\n");system("pause");return 0;
}

啥也不要分析,主要看fun1((int)v13, (int)input, len);

input是我们输入的,这个函数会将我们的input进行加密。

  for ( j = 0; j < 44; ++j ){if ( v7[j] == input[j] )++v10;}

然后在通过这里进行比较。

根据for语句可以得知,flag的长度可能是44,这里为什么说是可能呢,如果是逐字节加密,就是我们输入的每一个字符加密后都是一个字符,那么flag的长度肯定是44,如果我们的输入,一个字符加密成了两个字符,那么我们输入的flag的长度就是22,因为这里并不确定,所以只能猜测是44。

程序有反调试,我尝试将反调试给nop掉,但是发现反调试似乎又与加密代码有着一定的关系,我尝试了,没能理清楚反调试和加密代码的关系,所以这里和视频中的一样,还是带着反调试来分析,这里用IDA附加运行中的程序就行,因为已经执行完反调试的那句代码了。

测试是否加密与解密是相同的算法

在加密函数处断下

image-20240502223047670

先输入:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

查看input的值

image-20240502222926791

再F8单步步过,查看此时加密后的input

image-20240502223302203

用插件将数据提取出来

image-20240502225423609

[+] Dump 0xCFF1BC - 0xCFF1E8 (44 bytes) :
D62DE6F797244F2EA92DDDA37904C885B9E4E8D90B325F9908C07B804E134AC497DA7562D0AD31C558C3BBF6

可以看到我们输入的44个a被加密成了上述数据

这次我们将上述数据进行输入,看执行之后是否可以还原成44个a

上述数据存在不可见字符,不能从命令框里直接输入,这里需要用到Paste Data来改栈上的数据。

这次我们先输入41个b

image-20240502231707435

通过Paste Data将数据改成D62DE6F797244F2EA92DDDA37904C885B9E4E8D90B325F9908C07B804E134AC497DA7562D0AD31C558C3BBF6

image-20240502231739109

再F8单步步过,查看此时加密后的input

image-20240502231816745

可以看到数据恢复成了41个a

  fun1((int)v13, (int)input, len);//加密函数for ( j = 0; j < 44; ++j ){if ( v7[j] == input[j] )++v10;}if ( v10 == 44 )puts("Yes, u right!\n");elseputs("no no no\n");system("pause");

再回头看一下程序,程序是将v7和input进行比较,v7其实就是flag加密之后的形式,我们此时只要将v7dump下来,把v7的数据当作input进行传入,经过加密函数之后就可以得到flag了。

v7:

[+] Dump 0x7DF5F0 - 0x7DF61C (44 bytes) :
E415C4EDA62F5610BB13EBAD7556C7BBBBE9B9CC023A509F369069BE7C4244CAC6D4245CD2B924C11893B3EA

再一次执行程序

image-20240502232226350

将input用Paste Data改成E415C4EDA62F5610BB13EBAD7556C7BBBBE9B9CC023A509F369069BE7C4244CAC6D4245CD2B924C11893B3EA

image-20240502232319008

再F8单步步过,查看此时加密后的input

image-20240502232348326

可以看到flag已经被还原了,按一下键盘上的A键就能转成字符串形式方便复制

SYC{Pjx_s_Wom3n_cl0thing_1s_S0oo0o0_cute!1i}

今天就先这样,等明天我试着做一下其它题目,看是否学到了精髓。

2024年5月2日23点28分


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

[CISCN 2022 华东北] duck

[CISCN 2022 华东北] duck UAF|leak_libc|leak_heap_base|指针加密|unsortedbin|one_gadget [*] /home/bamuwe/duck/pwnArch: amd64-64-littleRELRO: Full RELROStack: Canary foundNX: NX enabledPIE: PIE enabled$ checksec ./pwn/home/ubuntu/glibc/gl…

如何同时或者按顺序间隔启动多个程序

首先,需要用到的这个工具:度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z1、打开工具,切换到定时器模块,快捷键:Ctrl+3 2、新建一个定时器,我这里演示同时打开多个程序(比如同时启动多个QQ,或者多个微信等),那就把单次数量提高,如果想每次执行这个定时器里面的3个事件…

ef core加密存储数据,如身份证号

一、新建项目,安装nuget<PackageReference Include="V6.EntityFrameworkCore.DataEncryption" Version="5.0.0" />二、本示例采用:AES+256bits(Can use a 128bits, 192bits or 256bits key)CipherMode mode = CipherMode.CBC, PaddingMode padding…

如何快速的追加文章的内容(在不知道内容的情况下)

首先,需要用到的这个工具:度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z 1、打开工具,切换到文章模块下,快捷键:Ctrl+12、新建一个文章做演示,001 3、添加一个内容,就随便写一个 4、保存、关闭 5、在新建的文章上右键,选择追加内容 6、弹出一个窗口,有三种选择,我这里就…

随机森林Adaboosting算法与Python实现(二)

AdaBoost是Freund和Schapire于1996年提出的一种集成学习方法。它的核心思想是通过迭代训练一系列弱分类器,每次调整样本权重以便更好地拟合被前一轮分类器错误分类的样本,从而构建一个强分类器。最终的模型是基于这些弱分类器的加权组合。AdaBoost广泛应用于二分类和多分类问…

随机森林特征重要性评估与Python实现(三)

特征重要性评估(Variable importance measure, or Feature importance evaluation,VIM)用来计算样本特征的重要性,定量地描述特征对分类或者回归的贡献程度。随机森林(Random Forest)作为一种强大的机器学习算法,在特征重要性评估方面具有显著优势。特征重要新评估是随机森…

opencv中自定义的双线性二次插值的图像旋转及缩放

自定义的二次插值的图像旋转与缩放#include <iostream> #include<opencv2/opencv.hpp> using namespace cv; using namespace std;void coordinateTransform(Point2d*p4Corner,Point2d*np4Corner,double rotAngle,double gamma,Point2d center) {double cx=center.…

从0到10Wqps,大厂的智能客服平台,如何实现架构演进?

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…