首页 > 其他分享 >IDA动态调试解RC4

IDA动态调试解RC4

时间:2024-05-02 23:33:22浏览次数:31  
标签:加密 RC4 44 ++ int 输入 input 调试 IDA

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");
  else
    puts("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");
  else
    puts("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分


标签:加密,RC4,44,++,int,输入,input,调试,IDA
From: https://www.cnblogs.com/xiaochange/p/18170754

相关文章

  • 攻防世界 serial-150 IDA动调
    比较完整的做题记录吧,很基础,当作过一遍题目,大佬请飘过题目 分析过程丢到PE里面,是一个64位的ELF 丢到IDA里面,查看字符串,发现线索 但是双击进去,不是汇编。是一个只读的rodata段 左边函数也不多,发现没有main函数,先点进去启动的start函数看看,发现main函数 点进去直......
  • linux下调试串口设备
    USB转串口常用CH34x芯片,该芯片有linux下的驱动。在默认情况下,大部分linux发行版都包含了CH34x的驱动,唯一缺点就是版本比较久。可以先插上开发板,一般是挂载到/dev/ttyCH341USB0文件下,如果该文件不存在,有两种可能,一种是驱动版本太久,可以下载官方的驱动文件,然后编译安装。官方驱......
  • ES Validation Failed: 1: this action would add [1] shards, but this cluster c
    [2024-05-01T08:56:52,606][ERROR][o.e.x.i.IndexLifecycleRunner][tools]policy[ilm-history-ilm-policy]forindex[.ds-ilm-history-5-2024.03.28-000001]failedonstep[{"phase":"hot","action":"rollover","name&qu......
  • threejs - js库 gui 的使用 调试开发3D效果
    //导入threejsimport*asTHREEfrom"three";import{OrbitControls}from"three/examples/jsm/controls/OrbitControls.js";//引入dat.gui.js的一个类GUIimport{GUI}from'three/addons/libs/lil-gui.module.min.js';//创建场景scene......
  • C/C++如何写调试宏
    1.调试宏以及测试在写代码时,不可避免需要打印提示、警告、错误等信息,且要灵活控制打印信息的级别。另外,还有可能需要使用宏来控制代码段(主要是调试代码段)是否执行。为此,本文提供一种调试宏定义方案,包括打印字符串信息LOG1宏和格式化打印LOG2宏,且能通过宏控制代码段执行。完整代......
  • rust+stm32+vscode搭建开发调试环境
    1.安装rustrust官网传送门2.安装openocd安装openocd传送门3.安装stlink安装stlink传送门4.搭建gcc-arm-none-eabi编译环境搭建gcc-arm-none-eabi编译环境5.安装vscodevscode官网传送门6.安装相关插件rust-analyzer:使用VSCode开发Rust必备cortex-debug:调试、debug嵌入......
  • BOSHIDA AC/DC电源模块的电磁兼容性分析与方案设计
    BOSHIDAAC/DC电源模块的电磁兼容性分析与方案设计BOSHIDAAC/DC电源模块是一种将交流电转换为直流电的电源模块,常用于各种电子设备中。然而,由于电磁干扰可能会对设备的正常运行造成影响,因此需要对AC/DC电源模块的电磁兼容性进行分析和方案设计。 首先,我们需要对AC/DC电源模......
  • Rockchip RK3399 - DRM eDP调试
    ----------------------------------------------------------------------------------------------------------------------------开发板:NanoPC-T4开发板eMMC:16GBLPDDR3:4GB显示屏:15.6英寸HDMI接口显示屏u-boot:2023.04linux:6.3----------------------------------......
  • 给Qt搭建一个简单的Json服务器用于软件调试
    一.vscode+nodejs+npm安装二.nodejs服务器开启打开vscode-终端-新建终端进入json_server目录cdD:\json_server运行启动命令,启动json-server服务器npmrunjson:server效果如下:PSD:\json_server>npmrunjson:server>[email protected]:se......
  • 在Linux系统下用命令行编译调试C++
    在Linux系统下用命令行编译调试C++目录在Linux系统下用命令行编译调试C++一、编译1.单文件编译2.多文件编译3.链接第三方动态库二、调试1.启动和退出2.查看源代码:list/l3.断点:breakpoint/br、watchpoint4.单步、步入、跳出5.计算表达式命令:expression/expr、p、po6.操作......