Neepu2023-部分Reserve复现

news2024/12/23 0:18:43

目录

Base

IKUN检查器

dnSpy

 junk code

Cheat Engine工具使用:

奇怪的ELF

mov混淆问题:

Xor 


Base

打开附件,可以看到主函数

先是给出一个物理题,要求输入答案,这个无关紧要,接着要求输入一串字符,经过encode_1和encode_2的加密过程后,要求等于enflag。直接进入encode_1和encode_2查看

encode_1:

char __cdecl encode_1(char *flag, int num)
{
  size_t v2; // rax
  int i; // [rsp+2Ch] [rbp-54h]

  for ( i = 0; ; ++i )
  {
    v2 = strlen(flag);
    if ( i >= v2 )
      break;
    if ( flag[i] <= 64 || flag[i] > 90 )
    {
      if ( flag[i] > 96 && flag[i] <= 122 )
        flag[i] = (flag[i] - 97 + num) % 26 + 97;
    }
    else
    {
      flag[i] = (flag[i] - 65 + num) % 26 + 65;
    }
  }
  return v2;
}

很明显的凯撒加密,偏移量是num,传进去的参数可以知道num的值为3.

再进入encode_2查看

char __cdecl encode_2(char *str, int len, char *str1)
{
  int v3; // eax
  int v4; // eax
  int v5; // eax
  int v6; // r8d
  int v7; // eax
  int v8; // r8d
  int v9; // eax
  int v10; // eax
  int v11; // eax
  int v12; // r8d
  int v13; // eax
  int v14; // eax
  int v15; // eax
  int v16; // eax
  char base64[65]; // [rsp+20h] [rbp-60h] BYREF
  char *flag; // [rsp+68h] [rbp-18h]
  int encodeStrLen; // [rsp+74h] [rbp-Ch]
  int k; // [rsp+78h] [rbp-8h]
  int i; // [rsp+7Ch] [rbp-4h]

  strcpy(base64, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
  encodeStrLen = 4 * (len / 3) + 1;
  k = 0;
  if ( len % 3 )
    v3 = 4;
  else
    v3 = 0;
  encodeStrLen += v3;
  flag = malloc(encodeStrLen);
  for ( i = 0; i < len; ++i )
  {
    if ( len - i <= 2 )
    {
      v10 = k++;
      if ( len - i == 2 )
      {
        flag[v10] = base64[str[i] >> 2];
        v11 = k++;
        v12 = 16 * (str[i++] & 3);
        flag[v11] = base64[v12 | (str[i] >> 4)];
        v13 = k++;
        flag[v13] = base64[4 * (str[i] & 0xF)];
      }
      else
      {
        flag[v10] = base64[str[i] >> 2];
        v15 = k++;
        flag[v15] = base64[16 * (str[i] & 3)];
        v16 = k++;
        flag[v16] = 61;
      }
      v14 = k++;
      flag[v14] = 61;
    }
    else
    {
      v4 = k++;
      flag[v4] = base64[str[i] >> 2];
      v5 = k++;
      v6 = 16 * (str[i++] & 3);
      flag[v5] = base64[v6 | (str[i] >> 4)];
      v7 = k++;
      v8 = 4 * (str[i++] & 0xF);
      flag[v7] = base64[v8 | (str[i] >> 6)];
      v9 = k++;
      flag[v9] = base64[str[i] & 0x3F];
    }
  }
  flag[k] = 0;
  return strcpy(str1, flag);
}

一个base64加密

最后将加密后的数据与enflag进行比较,解密过程就是先将enflag进行base64解码,然后再将得到的值进行凯撒解密,偏移量为3最后得到flag。

IKUN检查器

打开附件,可以发现是c#编写的程序,c#程序需要使用dnSpy打开

dnSpy

可以直接从官网上下载

打开可以看到主函数

// WindowsFormsApp1.From1
// Token: 0x06000006 RID: 6 RVA: 0x00002074 File Offset: 0x00000274
private void button1_Click(object sender, EventArgs e)
{
	string text = this.textBox1.Text;
	bool flag = text.Length != 34;
	if (flag)
	{
		this.label1.Text = "你不是真ikun";
	}
	else
	{
		string a = text.Substring(0, 8);
		string a2 = text.Substring(8, 1);
		string a3 = text.Substring(9, 10);
		string b = text.Substring(19, 1);
		string a4 = text.Substring(20, 14);
		int num = 0;
		int num2 = 0;
		int num3 = 0;
		int num4 = 0;
		num = this.check1(a, num);
		num2 = this.check2(a3, num2);
		num3 = this.check3(a2, b, num3);
		num4 = this.check4(a4, num4);
		bool flag2 = num + num2 + num3 + num4 == 4;
		if (flag2)
		{
			this.check5(text);
		}
	}
}

先判断flag长度是否等于34,然后会对输入的字符串分段分别经过check1,2,3,4函数进行检测,都通过时使用check5输出

check1:

public int check1(string a, int checkbox)
		{
			string value = "3eabbb3900d553d7e98a154bffa4d24a";
			char[] array = a.ToCharArray();
			MD5 md = new MD5CryptoServiceProvider();
			byte[] bytes = Encoding.Default.GetBytes(a);
			byte[] array2 = md.ComputeHash(bytes);
			md.Clear();
			string text = "";
			for (int i = 0; i < array2.Length; i++)
			{
				text += array2[i].ToString("x").PadLeft(2, '0');
			}
			bool flag = text.Equals(value);
			if (flag)
			{
				this.label1.Text = "哇,珍德食你鸭!";
				checkbox = 1;
			}
			else
			{
				this.label1.Text = "你干嘛,嗨嗨呦!";
				checkbox = 0;
			}
			return checkbox;
		}

是一个md5加密,直接爆破解密,得到 1998-8-2

check2:

		// Token: 0x0600000C RID: 12 RVA: 0x00002590 File Offset: 0x00000790
		public int check2(string a, int checkbox)
		{
			string value = "ce143362813587af5af8592984c91b5a8c11b779";
			string text = "";
			SHA1 sha = new SHA1CryptoServiceProvider();
			byte[] bytes = Encoding.Default.GetBytes(a);
			byte[] array = sha.ComputeHash(bytes);
			sha.Clear();
			for (int i = 0; i < array.Length; i++)
			{
				text += array[i].ToString("x").PadLeft(2, '0');
			}
			bool flag = text.Equals(value);
			if (flag)
			{
				this.label1.Text = "哇,珍德食你鸭!";
				checkbox = 1;
			}
			else
			{
				this.label1.Text = "你干嘛,嗨嗨呦!";
				checkbox = 0;
			}
			return checkbox;

是一个sha1加密,解密得到 jinitaimei

check3:


		// Token: 0x0600000D RID: 13 RVA: 0x0000264C File Offset: 0x0000084C
		public int check3(string a, string b, int checkbox)
		{
			string value = "-";
			bool flag = a.Equals(b) && a.Equals(value);
			if (flag)
			{
				this.label1.Text = "哇,珍德食你鸭!";
				checkbox = 1;
			}
			else
			{
				this.label1.Text = "你干嘛,嗨嗨呦!";
				checkbox = 0;
			}
			return checkbox;
		}

直接判断是一个 '-'

check4:


		// Token: 0x0600000E RID: 14 RVA: 0x000026AC File Offset: 0x000008AC
		public int check4(string a, int checkbox)
		{
			string text = "7vKrvRh4Gu7wBQn7o9VfKQ==";
			byte[] bytes = Encoding.UTF8.GetBytes("pijinchengwangbankunyuanhang!!!!");
			byte[] bytes2 = Encoding.UTF8.GetBytes(a);
			ICryptoTransform cryptoTransform = new RijndaelManaged
			{
				Key = bytes,
				Mode = CipherMode.ECB,
				Padding = PaddingMode.PKCS7
			}.CreateEncryptor();
			byte[] array = cryptoTransform.TransformFinalBlock(bytes2, 0, bytes2.Length);
			string value = Convert.ToBase64String(array, 0, array.Length);
			bool flag = text.Equals(value);
			if (flag)
			{
				this.label1.Text = "哇,珍德食你鸭!";
				checkbox = 1;
			}
			else
			{
				this.label1.Text = "你干嘛,嗨嗨呦!";
				checkbox = 0;
			}
			return checkbox;
		}

是一个AES加密.ECB,PKCS7,直接解密,得到:xiaoheizishiba

直接输入,得到flag(没想到直接输入....)

 junk code

看wp知道是使用cheat engine工具

Cheat Engine工具使用:

  • 首先运行程序
  • 打开Cheat Engine工具,点击如下图标,查找Process,找到要调试的程序,打开
  • 然后,可以在右边的框内输入要查找的字符串/字节
  • 下面的数据右键->浏览相关内存区域,即可得到flag

方法二:直接使用ida动态调试

在ida中打开文件,动态调试

注意:一定要在此处,因为此处是字符串经过异或运算后的flag值

 得到flag

奇怪的ELF

看了wp才知道是mov 混淆了

mov混淆问题:

MOV这种混淆是怎样产生的呢?剑桥大学的Stephen Dolan证明了x86的mov指令可以完成几乎所有功能了(可能还需要jmp),其他指令都是“多余的”。受此启发,有个大牛做了一个虚拟机加密编译器。它是一个修改版的LCC编译器,输入是C语言代码,输出的obj里面直接包含了虚拟机加密后的代码。如它的名字,函数的所有代码只有mov指令,没有其他任何指令。

这种题目的特征就是:汇编代码的汇编指令几乎全部就是MOV

1、 字符串的搜索是给我们最好的提示。
2、 MOV混淆是不会混淆函数的逻辑的。因此函数的逻辑还是不变的。
3、 大多数汇编代码的意思是可以猜测的。可以大概推测出具体操作了什么

具体mov混淆问题可以看:movfuscator混淆_Cherest_San的博客-CSDN博客

和这篇文章:浅析CTF中的反静态调试(二) - 先知社区

观察代码可以发现,flag的指令存储在R2中,直接手动搜索得到flag,search->text->R2。

Xor 

直接搜索字符串,找到可疑字符串

设置断点,动态调试

 一路F8,可以看到Please input flag,下面的异或部分

在此处创建函数

可以看到函数的主逻辑

  __int64 v8; // rdi
  __int64 v9; // rax
  __int64 i; // rcx
  _QWORD *v11; // rax
  __int64 v13; // [rsp-1C8h] [rbp-1D8h]
  __int64 v14; // [rsp-1C0h] [rbp-1D0h]
  unsigned __int64 v15; // [rsp-1A0h] [rbp-1B0h]
  __int64 v16; // [rsp-198h] [rbp-1A8h]
  __int64 v17; // [rsp-190h] [rbp-1A0h]
  __int64 v18; // [rsp-188h] [rbp-198h]
  __int64 v19; // [rsp-180h] [rbp-190h]
  _QWORD v20[34]; // [rsp-158h] [rbp-168h]
  __int64 v21; // [rsp-48h] [rbp-58h]
  const char *v22; // [rsp-38h] [rbp-48h]
  _QWORD *v23; // [rsp-30h] [rbp-40h]
  void *v24; // [rsp-28h] [rbp-38h]
  char **v25; // [rsp-20h] [rbp-30h]

  while ( 1 )
  {
    v19 = a6;
    v15 = a4;
    v20[32] = v6;
    sub_81A060();
    v8 = sub_819800();
    a4 = v6;
    v6 = v8;
    if ( v19 + 1 >= v16 )
      break;
    a6 = v19 + 1;
    if ( v19 + 1 - ((v19 + 1) & 0xFFFFFFFFFFFFFFFCLL) >= 4 )
      sub_82EB60(v13, v14);
  }
  v21 = sub_819DA0();
  v17 = v8;
  *(&v13 - 2) = v7;
  v9 = sub_82F0E0();
  for ( i = 0LL; i < 32; ++i )
  {
    if ( v6 <= i )
      sub_82EB60(v13, v14);
    if ( v20[i] != *(unsigned __int8 *)(v9 + i) )
    {
      v18 = i;
      v14 = sub_85F300(v13);
      v9 = v21;
      i = v18;
      v6 = v17;
    }
  }
  v24 = &unk_875580;
  v25 = &off_8ABBB0;
  sub_861F60();
  v11 = (_QWORD *)sub_7DC740();
  *v11 = 0LL;
  v22 = "\b";
  v23 = v11;
  return sub_867420();
}

函数有两个循环,第一个循环时加密过程,第二个循环是对加密的明文进行判断,所以我们需要动态调试,过第一个循环,在第二个循环中

在此处先断点,随便输入什么跳过第一个循环,F8到第二个循环,拿到密文

 写脚本解密

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
	int i;
	char arr[]={0x3f,0x12,0x0,0x2,0x4,0xc,0x3d,0x42,0x3,0x28,0xc,0x1,0x2e,0x12,0x4,0x1,0x8,0x28,0x54,0x40,0x42,0x43,0x54,0x40,0x42,0x43,0x54,0x40,0x42,0x43,0x50,0xf};
    char key[]="qwer";
  for(i=0;i<40;i++){
	arr[i]=arr[i]^key[i%4];
	printf("%c",arr[i]);
   }
  
	return 0;
}
//Neepu{X0r_is_easy_1234123412345}

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

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

相关文章

MyBatis-Plus 可视化代码生成器来啦,生产力直接拉满

在基于Mybatis的开发模式中&#xff0c;很多开发者还会选择Mybatis-Plus来辅助功能开发&#xff0c;以此提高开发的效率。虽然Mybatis也有代码生成的工具&#xff0c;但Mybatis-Plus由于在Mybatis基础上做了一些调整&#xff0c;因此&#xff0c;常规的生成工具生成的代码还有一…

被Chatgpt碾压的打工人与大学生,准备反击!

最近一段时间&#xff0c;chatgpt可谓如火如荼&#xff0c;它的出现引发各行各业的震动&#xff0c;有人利用它实现了一夜暴富&#xff0c;有企业将它纳进人才招聘的技能要求中&#xff0c;国内各大厂商也纷纷下场推出自家的AI大模型&#xff0c;从第一代到GPT-4&#xff0c;所…

基于html+css的图片展示92

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

用好 kafka,你不得不知的那些工具

前言 工欲善其事&#xff0c;必先利其器。本文主要分享一下消息中间件 kafka 安装部署的过程&#xff0c;以及我平时在工作中针对 kafka 用的一些客户端工具和监控工具。 kafka 部署架构 一个 kafka 集群由多个kafka broker组成&#xff0c;每个broker将自己的元数据信息注册…

【ROS2】install micro_ros

本文参考b站up&#xff1a;“照祥同学”的教程来的&#xff0c;中间一些细节的操作谨以此文作为补充&#xff0c;或者说是我在按照教程走的时候遇到的问题记录。视频链接&#xff1a;第二节&#xff1a;安装micro_ros 的 Arduino 开发环境_哔哩哔哩_bilibili 1. 安装和配置ros…

集权安全 | 域渗透中的 DCSync技术分析

DCSync是AD域渗透中常用的凭据窃取手段&#xff0c;默认情况下&#xff0c;域内不同DC每隔15分钟会进行一次数据同步&#xff0c;当一个DC从另外一个DC同步数据时&#xff0c;发起请求的一方会通过目录复制协议&#xff08;MS- DRSR&#xff09;来对另外一台域控中的域用户密码…

一分钟图情论文:《面向学科建设的我国文献资源保障评价研究综述》

一分钟图情论文&#xff1a;《面向学科建设的我国文献资源保障评价研究综述》 高质量的文献资源保障工作不仅能够提供完备的环境、满足用户的信息需求&#xff0c;在高校中&#xff0c;还可以发挥促进教学资源优化和科研成果产出、增强科技基础能力等作用。华中师范大学的夏立…

『树莓派云台机器人』01. 使用手机控制树莓派云台机器人

目录 1. 检查是否已经开机&#xff0c;连接机器人wifi2. 安装树莓派控制app应用&#xff0c;直连模式连接机器人3. 机器人功能实现总结 欢迎关注 『树莓派云台机器人』 博客&#xff0c;持续更新中 欢迎关注 『树莓派云台机器人』 博客&#xff0c;持续更新中 动手组装等步骤请…

halcon 安装21.05版本 小坑记录

&#xff08;注意&#xff1a;都可以设置语言&#xff09; 1.选择扩展安装 影响安装进度显示 可以后续单独安装 Visual Studio变量检查扩展 2.破解相关 主程序dll路径 路径: C:\Users******\AppData\Local\Programs\MVTec\HALCON-21.05-Progress\bin\x64-win64 Visual St…

chatgpt赋能python:Python修改配置文件

Python 修改配置文件 Python 作为一种优秀的编程语言&#xff0c;在实际使用中起到了很大的作用。对于开发者来说&#xff0c;修改配置文件是一个常见的操作&#xff0c;Python 也支持在代码中修改配置文件。本篇文章将介绍如何使用 Python 修改配置文件&#xff0c;并且分享一…

【CSAPP】虚拟内存 | 地址空间 | 页表内存保护 | 页错误引发异常逐出 (evicted)

&#x1f4ad; 写在前面&#xff1a;本文将学习《深入理解计算机系统》虚拟内存部分&#xff0c;CSAPP 是计算机科学经典教材《Computer Systems: A Programmers Perspective》的缩写&#xff0c;该教材由Randal E. Bryant和David R. OHallaron 合著。 &#x1f4dc; 本章目录…

Bytebase:更好地管理你的 OceanBase 数据库

我们很高兴宣布&#xff1a;OceanBase 用户现在可以使用 Bytebase 进行数据库变更管理啦&#xff01;&#x1f680; Bytebase 是一款为 DevOps 团队准备的数据库 CI/CD 工具&#xff0c;专为开发者和 DBA 打造&#xff0c;也是唯一被 CNCF Landscape 收录的 Database CI/CD 产…

k8s 弹性伸缩的使用

1.手动扩缩容 编辑一个yaml文件 vi deployment-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata:lables:app: nginxname: nginxnamespace: default spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name:…

C语言交换数组内容

代码&#xff1a; int main() {int arr1[] { 1,2,3,4,5 };int arr2[] { 6,7,8,9,0 };int sz sizeof(arr1) / sizeof(arr1[0]);int i 0;for (i 0;i<sz; i ) {int tmp arr1[i];arr1[i] arr2[i];arr2[i] tmp;}for (i 0; i < sz; i) {printf("%d ", ar…

用Vue简单开发一个学习界面

文章目录 一.首先创建我们的Vue文件夹二.源代码BodyDemoHearderDemoHomeDemoMarkdownDemoFileManager.jsMain.js&#xff08;注意绑定&#xff09;APP源代码 效果图&#xff08;按钮功能&#xff09;新增二级菜单&#xff08;v-for&#xff09;需要的可以私信 一.首先创建我们的…

办公技巧:学会这 7 种 PPT 制作技巧,让 PPT 制作效率飙升

F4 键&#xff1a;重复上一步操作 例如需要你在一分钟内完成 8 个形状的排版&#xff0c;你会怎么做&#xff1f; 如果是最基础的方式&#xff0c;可能得画出一个之后&#xff0c;慢慢的按住 Ctrl 复制新的出来&#xff0c;但这样实在是太慢了&#xff01;&#xff08;你是这样…

游戏安全运营前置化,10项安全测试预见外挂风险

自今年起&#xff0c;游戏版号已恢复常态化发放。据统计&#xff0c;截至目前年内累计发放460款游戏版号&#xff0c;每月的发放数量均超80款。多款热门新游已上线&#xff0c;大量游戏也已进入测试阶段&#xff0c;蓄势待发&#xff0c;游戏行业持续回暖。 在游戏行业动态回暖…

【历史上的今天】5 月 26 日:美国首个计算机软件程序专利;苹果市值首次超越微软;Wiki 的发明者出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 5 月 26 日&#xff0c;在 1995 年的今天&#xff0c;微软公司首席执行官比尔盖茨发表了一番讲话&#xff0c;他认为自己的公司在估计互联网的影响和普及方面错…

opencv实践-图像去畸变

目录 1.背景2.镜头成像畸变原因3.去畸变方法4. opencv去畸变函数5.代码实现 1.背景 由于相机的镜头并不完全理想&#xff0c;成像时会产生线条扭曲、失真等。对双目图像、鸟瞰图等进行处理时&#xff0c;首先要矫正去畸变。 2.镜头成像畸变原因 相机的镜头前有一块透镜&…

python+vue垃圾分类论坛的设计与实现85l30

环境保护是一项利国利民的重大民生工程,是造福子孙后代的幸福事,基于全面分析我国大学生环境保护教育现状的基础上提出了高校可通过开设环境类通识任选课、专业课中融入环境保护教育、环境保护实践教学、环境保护第二课堂等有效途径加强对非环境类专业大学生环境保护教育。 本系…