2023年春秋杯网络安全联赛春季赛Reverse题目复现

news2024/11/28 19:36:53

文章目录

  • 一.sum
    • 1. 分析程序逻辑
    • 2.解数独矩阵
    • 3.解题脚本
  • 二.Poisoned_tea_CHELL
    • 1. 重新识别函数及程序逻辑分析
    • 2.IDA动态调试(attach附加调试)
    • 3. 输入选项进行单步调试
    • 4.解题脚本

一.sum

1. 分析程序逻辑

这里直接贴上当时分析的结果,根据程序行为不难猜出是数独问题(还得靠猜)
main:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char *mart; // rbp
  int flagValue; // r14d
  int sum; // r12d
  __int64 i; // rbx
  char chr; // al
  int tmp; // eax
  char *md5str; // rax

  mart = matrix;
  flagValue = 1;
  sum = 0;
  puts("Welcome to Solver!");
  do
  {
    for ( i = 0LL; i != 9; ++i )
    {
      if ( !mart[i] )                           // 如果矩阵元素为零则输入字符
      {
        chr = getchar();
        if ( (chr - '1') > 8u )                 // 所以输入的必须是数字,否则错误
          flagValue = 0;
        else
          mart[i] = chr - '0';                  // 数字
      }
      tmp = mart[i];
      sum += tmp;
    }
    mart += 9;                                  // 一次处理九个字符
  }
  while ( mart != &matrix[81] );                // 一共81
  if ( flagValue && verify() )                  // 盲猜是数独
  {
    puts("You Win!");
    __snprintf_chk(buf, 32LL, 1LL, 32LL, "%d"); // 405
    md5str = str2md5(buf, strlen(buf));
    __printf_chk(1LL, "flag is: flag{%s}\n\n", md5str);// flag{bbcbff5c1f1ded46c25d28119a85c6c2}
    exit(0);
  }
  puts("Again~");
  return 0;
}

verify(验证):
尤其是当时看到九个一组以及按列检查就反应过来应该是数独

__int64 verify()
{
  char *matr; // rsi
  __int64 j; // rcx
  _DWORD *CHECK; // rdi
  __int64 tmp; // rdi
  char *matr2; // rsi
  __int64 k; // rcx
  _DWORD *check2; // rdi
  __int64 chr; // rdi
  __int64 iii; // r8
  char *matr3; // r9
  __int64 len3; // rcx
  _DWORD *check3; // rdi
  int cout; // r10d
  char *matr4; // rdi
  __int64 i; // rcx
  __int64 tmpchr; // rbx

  matr = matrix;
LABEL_2:
  j = 10LL;
  CHECK = check;
  while ( j )
  {
    *CHECK++ = 0;                               // 初始化空间
    --j;
  }
  while ( 1 )
  {
    tmp = matr[j];
    if ( check[tmp] )                           // 不能访问已访问过的
      return 0LL;
    ++j;
    check[tmp] = 1;                             // 置一
    if ( j == 9 )
    {
      matr += 9;                                // 九个一组
      if ( matr != &matrix[81] )
        goto LABEL_2;
      matr2 = matrix;
LABEL_9:
      k = 10LL;
      check2 = check;
      while ( k )
      {
        *check2++ = 0;                          // 再次清空check数组
        --k;
      }
      while ( 1 )
      {
        chr = matr2[9 * k];                     // 检查第一列
        if ( check[chr] )
          return 0LL;
        ++k;
        check[chr] = 1;
        if ( k == 9 )
        {
          if ( ++matr2 != &matrix[9] )
            goto LABEL_9;
          iii = 0LL;
          while ( 2 )
          {                                     // 检查第二列
            matr3 = &matrix[iii];
            do
            {
              len3 = 10LL;
              check3 = check;
              cout = 3;
              while ( len3 )                    // 清空check
              {
                *check3++ = 0;
                --len3;
              }
              matr4 = matr3;
              while ( 2 )
              {
                for ( i = 0LL; i != 3; ++i )
                {
                  tmpchr = matr4[i];
                  if ( check[tmpchr] )          // 也是不能有1
                    return 0LL;
                  check[tmpchr] = 1;
                }
                matr4 += 9;
                if ( --cout )
                  continue;
                break;
              }
              matr3 += 3;
            }
            while ( matr3 != &matr2[iii] );
            iii += 27LL;
            if ( iii != 81 )
              continue;
            break;
          }
          return 1LL;
        }
      }
    }
  }
}

2.解数独矩阵

先跟进martix然后将数据读取出来
在这里插入图片描述
然后询问ChatGpt直接得到答案
在这里插入图片描述
以及给出解题代码和运行结果:
在这里插入图片描述
然后填数独就可以过了

3.解题脚本

#include<stdio.h>
int main()
{
    int sum = 0;
    unsigned char matrix[81] =
    {
        5,   3,   0,   0,   7,   0,   0,   0,   0,   6,
        0,   0,   1,   9,   5,   0,   0,   0,   0,   9,
        8,   0,   0,   0,   0,   6,   0,   8,   0,   0,
        0,   6,   0,   0,   0,   3,   4,   0,   0,   8,
        0,   3,   0,   0,   1,   7,   0,   0,   0,   2,
        0,   0,   0,   6,   0,   6,   0,   0,   0,   0,
        2,   8,   0,   0,   0,   0,   4,   1,   9,   0,
        0,   5,   0,   0,   0,   0,   8,   0,   0,   7,
        9
    };
    int grid[81] = {
    5, 3, 4, 6, 7, 8, 9, 1, 2,
    6, 7, 2, 1, 9, 5, 3, 4, 8,
    1, 9, 8, 3, 4, 2, 5, 6, 7,
    8, 5, 9, 7, 6, 1, 4, 2, 3,
    4, 2, 6, 8, 5, 3, 7, 9, 1,
    7, 1, 3, 9, 2, 4, 8, 5, 6,
    9, 6, 1, 5, 3, 7, 2, 8, 4,
    2, 8, 7, 4, 1, 9, 6, 3, 5,
    3, 4, 5, 2, 8, 6, 1, 7, 9
    };
     int len = 0;
    for (int i = 0; i < 81; i++)
    {
        if (!matrix[i])
        {
            len++;
            printf("%d", grid[i]);//输出需要填充的序列
            //468912723481342575971422657913948591537428763345261
        }
    }
    return 0;
}

linux下运行程序,输入序列:468912723481342575971422657913948591537428763345261
即可得到答案:
在这里插入图片描述

二.Poisoned_tea_CHELL

1. 重新识别函数及程序逻辑分析

这里可能是识别问题,找到这三块红色区域查看汇编
在这里插入图片描述
然后可以发现这里莫名其妙定义了四个字节数据,按u取消掉下方指令定义
在这里插入图片描述
然后从这段数据头(0x763处)按p识别为函数,即可可以看到tea逻辑
在这里插入图片描述
另外两块红色区域同理,重新识别后可以看到主函数(如果看不到那就对tea函数交叉引用向上找)
在这里插入图片描述
这里给出我分析美化后的主函数:
不过这里有一个关键问题就是他的key和关键数据并不能通过静态分析看到,所以需要动态分析了

__int64 __fastcall Main()
{
  __int64 result; // rax
  int i; // [rsp+Ch] [rbp-464h]
  int j; // [rsp+10h] [rbp-460h]
  int chr1; // [rsp+14h] [rbp-45Ch] BYREF
  int chr2; // [rsp+18h] [rbp-458h]
  int v5; // [rsp+1Ch] [rbp-454h]
  int key[8]; // [rsp+20h] [rbp-450h] BYREF
  int d1; // [rsp+40h] [rbp-430h]
  int d2; // [rsp+44h] [rbp-42Ch]
  int b1; // [rsp+48h] [rbp-428h]
  int b2; // [rsp+4Ch] [rbp-424h]
  int v11; // [rsp+50h] [rbp-420h]
  int buffer[258]; // [rsp+60h] [rbp-410h] BYREF
  unsigned __int64 v13; // [rsp+468h] [rbp-8h]

  v13 = __readfsqword(0x28u);
  key[0] = 5;
  key[1] = 2;
  key[2] = dword_7FA16F6F8464;                  // 猜测也是一位数,可以爆破
  key[3] = dword_7FA16F6F8454;
  key[4] = 0;
  memset(buffer, 0, 0x400uLL);
  sub_7FA16F6F5524();
  sub_7FA16F6F5554();
  sub_7FA16F6F5594();                           // 这几个函数找不到
  sub_7FA16F6F5574(&unk_7FA16F6F6469, buffer);
  chr1 = 0;
  chr2 = 0;
  v5 = 0;
  for ( i = 0; buffer[i]; i += 2 )              // 也就是每次对buffer的两个字符进行tea加密
  {
    chr1 = buffer[i];
    chr2 = buffer[i + 1];
    Tea(dword_7FA16F6F8474, &chr1, key);        // 一次加密两个字符
    buffer[i] = chr1;                           // 更新buffer串
    buffer[i + 1] = chr2;
  }
  d1 = 0;
  d2 = 0;
  b1 = 0;
  b2 = 0;
  v11 = 0;
  for ( j = 0; buffer[j]; j += 2 )              // 比较函数
  {
    d1 = desStr[j];
    d2 = desStr[j + 1];
    b1 = buffer[j];
    b2 = buffer[j + 1];
    if ( d1 != b1 || d2 != b2 )
      break;
  }
  sub_7FA16F6F5524();
  result = 0LL;
  if ( v13 != __readfsqword(0x28u) )
    return sub_7FA16F6F5544();
  return result;
}

2.IDA动态调试(attach附加调试)

如果直接使用ida远程动调会提示错误:
Input file is a dynamic library, it cannot be run by itself.
Please specify the host application (Debugger, Process options)
在这里插入图片描述
提示这是个动态库文件,需要附加进程进行调试,那么我们可以使用IDA的附加调试功能

  1. linux虚拟机使用root权限运行ida的linux_server64
    必须使用root权限,否则后续附加调试会失败,这是由于IDA服务端的权限不够
    在这里插入图片描述
  2. 运行程序
    在这里插入图片描述
  3. 附加调试
    Debugger>Attach to process
    在这里插入图片描述然后找到毒tea进程,双击即可
    在这里插入图片描述
    选择same
    在这里插入图片描述

3. 输入选项进行单步调试

成功附加后会发现按f7或者f8都没反应,此时程序等待输出,先到linux虚拟机输入一个选项
如果输入1,后续调试比较难找,总之就是找到Loading字符串,注意不能跳过了
(直接搜索字符串搜索不到,这题应该是有SMC的操作对程序代码进行解密)
下方的call sun_7f006f7c2536就是主函数,跟进重新识别即可看到逻辑(这里不做详细介绍,以选项2为主)
在这里插入图片描述

如果输入2
一直按f7,最后可以发现程序会卡住,并且还能看见InputFlag字符串,这里就是主函数了
在这里插入图片描述
往上翻找到起始地址,对loc_loc_7F3BB0FB6536按p识别为函数就可以看到主函数逻辑了
在这里插入图片描述
然后还有一些没有被正确识别的函数,需要手动跟进按p识别为函数,然后回到反汇编界面按f5重新识别即可
在这里插入图片描述
key的值:
在这里插入图片描述
tea加密循环次数的值(所以这个tea循环36次而非32次):
在这里插入图片描述
加密后的data,跟进可以提取出数据
在这里插入图片描述

4.解题脚本

#include<stdio.h>
void Tea(int len, unsigned int* buffer, int* key)
{
	int i; // [rsp+24h] [rbp-14h]
	unsigned int v5; // [rsp+28h] [rbp-10h]
	unsigned int v6; // [rsp+2Ch] [rbp-Ch]
	unsigned int v7; // [rsp+30h] [rbp-8h]

	v5 = *buffer;
	v6 = buffer[1];
	v7 = 0xd9b6d99c;
	for (i = 0; i < len; ++i)
	{
		v6 -= (v5 + ((v5 >> 5) ^ (16 * v5))) ^ (key[(v7 >> 11) & 3] + v7);
		v7 += 0x41104111;
		v5 -= (v6 + ((v6 >> 5) ^ (16 * v6))) ^ (key[v7 & 3] + v7);
	}
	*buffer = v5;
	buffer[1] = v6;
}
int main()
{
	int  buffer[14] =
	{
	  -318921983,
	  1639894517,
	  -1197577091,
	  -835265432,
	  1265521566,
	  1680782596,
	  1425658684,
	  1829167973,
	  -360235693,
	  -1537112825,
	  -676229584,
	  -1000652734,
	  0,
	  0,
	};
	int key[5] = { 5,2,9,7,0 };
	int chr[2] = { 0 };
	for (int i = 0; buffer[i]; i += 2)              // 也就是每次对buffer的两个字符进行tea加密
	{
		chr[0] = buffer[i];
		chr[1] = buffer[i + 1];
		Tea(36, chr, key);						// 一次加密两个字符
		buffer[i] = chr[0];                           // 更新buffer串
		buffer[i + 1] = chr[1];
	}
	unsigned char* p = (unsigned char*)buffer;
	printf("%s", p);
	//Thisisflag{cdfec405-3f4b-457e-92fe-f6446098ee2e}
	return 0;
}

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

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

相关文章

六轴机械臂正逆解计算

一、机械臂运动学 机械臂运动学就是根据未端执行器与所选参考坐标系之间的几何关系&#xff0c;确定末端执行器的空间位置和姿态与各关节变量之间的数学关系。包括正运动学 (Forward Kinematics)和逆运动学 (InverseKinematics)两部分。 正运动学就是根据给定的机器人的各个关…

关于Vuex中使用mapGetters的应用以及项目实例演示以及gettes从接口获取内容更新

哈喽&#xff0c;小伙伴们大家好啊 今天在项目中看到了Vuex&#xff0c;以及看到了mapGettes的使用 1.首先第一步 在src->store->index.js文件中 import Vue from vue import Vuex from vuex import getters from ./gettersVue.use(Vuex) 2.然后第二步骤 在getters文…

[java]关于会话Session

前言: 客户端向服务端发请求&#xff0c;登陆完之后&#xff0c;进入到首页&#xff0c;如何让客户端知道它有没有登陆过呢&#xff0c;需要从首页里面向服务器发出异步请求&#xff0c;请求当前登录的用户信息&#xff0c;登录过就能获取得到&#xff0c;没登陆过获取不到。 …

Socket安全(二)

文章目录 1. 客户端模式2. 创建安全服务器Socket3. 配置SSLServerSocket 1. 客户端模式 大多数安全通信中&#xff0c;服务器需要使用适当的证书认证自己。不过客户端不需要&#xff08;淘宝需要向用户证明它确实是淘宝&#xff0c;但我不需要向淘宝证明我自己的身份&#xff…

Skywalking9.4.0部署监控项目

1、SkyWalking简介 SkyWalking是国内开源的基于字节码注入的调用链分析以及应用监控分析工具。特点是支持多种插件&#xff0c;UI功能较强&#xff0c;接入端无代码侵入。目前使用厂商最多&#xff0c;版本更新较快&#xff0c;已成为 Apache 基金会顶级项目。 它有哪些功能呢…

WebGPU你让我等的好辛苦啊

什么是WebGPU WebGPU是一种新兴的Web标准&#xff0c;旨在为Web应用程序提供高性能的图形和计算功能。它是一种低级别的图形API&#xff0c;为开发人员提供了对现代GPU的直接访问&#xff0c;以实现更高效的图形渲染和通用计算。 WebGPU的设计目标是提供与现代图形API&#x…

文心一言 VS 讯飞星火 VS chatgpt (26)-- 算法导论5.1 1题

一、证明:假设在过程 HIRE-ASSISTANT 的第 4 行中&#xff0c;我们总能决定哪一个应聘者最佳。则意味着我们知道应聘者排名的全部次序。 文心一言&#xff1a; 证明: 假设在过程 HIRE-ASSISTANT 的第 4 行中&#xff0c;我们总能决定哪一个应聘者最佳。则意味着我们知道应聘…

png图片压缩后黑底问题解决

问题背景 使用thumbnail对图片进行压缩&#xff0c;偶然会发现对png图片出现黑底的情况如下&#xff1a; 压缩前 压缩后 问题解决 对网上搜到的解决方法主要有两种&#xff1a; 1.指定png输出 JAVA - Get black background when uploading PNG image - Stack Overflow 一…

大数据好找工作么?前景如何

大数据好不好找工作不是一概而论的&#xff0c;要根据你个人的学历情况&#xff0c;掌握技能程度&#xff0c;所在城市招聘需求&#xff0c;甚至是你的面试能力和简历是否突出优势有关。 但是毋庸置疑的是&#xff0c;大数据目前的发展前景还是相当优秀的。 我们知道&#xf…

什么是测试开发,聊聊我对测试开发的看法

目录 前 还没来阿里之前&#xff0c;我对测开的看法 多数人眼中的测试开发 来了阿里之后&#xff0c;对测开看法有了转变 阿里的测开是干嘛的 测试平台的好处和不足 我对测试平台的看法 测试平台是测开必需品吗&#xff1f; 实际项目中用不到测试平台&#xff0c;有必要…

GIT | 日常命令查阅表

最近公司代码管控比较乱&#xff0c;有天就利用分支进行了代码梳理&#xff0c;当时就遇到一些困惑&#xff0c;抽空就把git 再学了一下。 以前我是用git命令的&#xff0c;但是敲命令对我来说还是有点麻烦&#xff08;主要是git 功力不够&#xff09;&#xff0c;看到有同事用…

jmeter性能测试技巧(欢迎提问,不定时更新)

问题1 如何在大并发测试下&#xff0c;让登录或者后续接口只执行一次&#xff1f; 分析 2023Jmeter性能测试项目实战教程&#xff0c;十年测试大佬手把手教你做性能&#xff01;_哔哩哔哩_bilibili2023Jmeter性能测试项目实战教程&#xff0c;十年测试大佬手把手教你做性能&…

SQL综合案例之电商漏斗转化分析,pv,uv及

漏斗模型示例&#xff1a; 不同的业务场景有不同的业务路径 : 有先后顺序, 事件可以出现多次 注册转化漏斗 : 启动APP --> APP注册页面--->注册结果 -->提交订单-->支付成功 搜购转化漏斗 : 搜索商品--> 点击商品--->加入购物车-->提交订单-->支付成功…

Scrum中可以有测试人员吗?

作者 | Federico Toledo Scrum 是将质量融入产品开发和创建敏捷团队的宝贵框架。测试人员如何适应这一切&#xff1f;让我们深入研究这篇文章。 毫无疑问&#xff0c;Scrum是在任何环境中为团队寻求业务敏捷性&#xff0c;以及应对不同复杂挑战的最重要工具之一。 正如《福布斯…

在pycharm里安装pytorch环境-GPU版

1、安装Anaconda 在官网下载安装&#xff1a;https://www.anaconda.com/download 2、安装pycharm https://www.jetbrains.com/pycharm/download/#sectionwindows 使用社区版即可。 3、检查conda环境 按winr&#xff0c;输入cmd回车打开命令窗 在命令窗内输入conda 环境无问…

小学课后兴趣班选课平台的设计与实现(ASP.NET,SQLServer)

系统功能模块设计 中小学课后兴趣班选课平台包括前台功能模块和后台功能模块&#xff1a;前台功能模块是给会员使用的功能模块&#xff0c;在前台功能模块中会员可以实现在线注册&#xff0c;登录&#xff0c;查看发布的新闻资讯信息&#xff0c;查看教师&#xff0c;在线留言&…

软件测试的 20 个误区

软件测试中常遇到的 20 个误区&#xff0c;争取能给想从事软件测试的小伙伴一点启发。 1、测试人员不需要了解软件开发知识 抛开自动化测试&#xff0c;测试开发等&#xff0c;这些是必须要学习软件开发知识。功能测试和接口测试等还是需要软件开发知识的&#xff0c;例如新建…

电动汽车、车载充电器及其过流保护电路介绍

摘要&#xff1a;本文通过比亚迪公司的专利了解电动汽车、车载充电器及其过流保护电路&#xff0c;其中&#xff0c;车载充电器包括AC/DC变换器和DC/DC变换器&#xff0c;AC/DC变换器和DC/DC变换器均采用光耦驱动的SiC开关管&#xff0c;过流保护电路包括&#xff1a;电流检测单…

ChatGPT与网络安全

文章目录 一、“AI用于攻击”二、“AI用于安全&#xff08;防御&#xff09;”三、“AI的防御”四、“AI被攻击” ChatGPT作为基于生成式预训练模型&#xff08;GPT&#xff09;的聊天机器人&#xff0c;其核心技术是自然语言处理&#xff08;NLP&#xff09;。随着NLP技术的不…

OS实战笔记(9)-- 构建二级引导器

Grub内核映像格式 Grub工作的时候&#xff0c;需要一个内核映像文件&#xff0c;其中包括了二级引导器模块、内核模块、图片和字库等。这些不同的文件都被放到了一个映像文件中&#xff0c;为了Grub能够正常加载&#xff0c;需要一个预先定义好的格式&#xff0c;以便Grub能解析…