re学习(32)【绿城杯2021】babyvxworks(浅谈花指令)

news2024/12/23 23:39:30

链接:https://pan.baidu.com/s/1msA5EY_7hoYGBEema7nWwA
提取码:b9xf

wp:首先找不到main函数,然后寻找特殊字符串,

交叉引用

 

反汇编

 

主函数在sub_3D9当中,但是IDA分析错了

 

分析错误后,删除函数

 

 

创建函数

 

 

 

 

操作:与0x22异或,然后再加3

分析代码:
 

int sub_3D0()
{
  int v0; // ebx
  int v1; // eax
  const char *v2; // ebx
  int v4; // [esp+14h] [ebp-C4h]
  int v5; // [esp+18h] [ebp-C0h]
  int v6; // [esp+1Ch] [ebp-BCh]
  int v7[2]; // [esp+20h] [ebp-B8h] BYREF
  char flag[52]; // [esp+28h] [ebp-B0h] BYREF
  char v9[124]; // [esp+5Ch] [ebp-7Ch] BYREF

  sub_32B0(flag, 0, 48);
  sub_32B0(v9, 0, 120);
  v7[0] = 0;
  sub_2BF0(v7, flag, 48);
  sub_2BF0(v7, v9, 120);
  v5 = 0;
  qmemcpy(flag, dword_126F8, 0x30u);
  printf("Plz Input Flag: ");
  scanf("%s", flag);
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 0, 4) = 188;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 4, 4) = 10;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 8, 4) = 187;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 12, 4) = 193;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 16, 4) = 213;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 20, 4) = 134;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 24, 4) = 127;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 28, 4) = 10;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 32, 4) = 201;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 36, 4) = 185;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 40, 4) = 81;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 44, 4) = 78;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 48, 4) = 136;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 52, 4) = 10;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 56, 4) = 130;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 60, 4) = 185;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 64, 4) = 49;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 68, 4) = 141;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 72, 4) = 10;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 76, 4) = 253;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 80, 4) = 201;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 84, 4) = 199;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 88, 4) = 127;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 92, 4) = 185;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 96, 4) = 17;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 100, 4) = 78;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 104, 4) = 185;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 108, 4) = 232;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 112, 4) = 141;
  *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 21, v9, 116, 4) = 87;
  v4 = strlen(flag);
  v0 = 0;
  if ( v4 <= 0 )
    goto LABEL_7;
  do
  {
    v1 = sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 24, flag, v0, 0);
    ((void (__cdecl *)(int, int))sub_330)(v1, v4);// loc_330比较特殊。
                                                // 哦,我知道了,想这样loc开头的也是函数,只不过是以汇编形式展现的,想sub开头的是以反汇编形式展示的
    v6 = *(unsigned __int8 *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 26, flag, v0, 1);
    if ( *(_DWORD *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 26, v9, 4 * v0, 4) == v6 )
      ++v5;
    ++v0;
  }
  while ( v0 < v4 );
  if ( v5 == 30 )
    v2 = "Success";
  else
LABEL_7:
    v2 = "Try Again";
  sub_3350(v2);
  sub_2930(v7);
  return 0;
}
// a1是flag
// a2是flag的长度
int __cdecl sub_330(int a1, unsigned int a2)
{
  bool v3; // zf
  unsigned int v4; // eax
  unsigned int v5; // eax
  _DWORD v6[2]; // [esp-4h] [ebp-18h] BYREF
  _BYTE *v7; // [esp+4h] [ebp-10h]
  _BYTE *v8; // [esp+8h] [ebp-Ch]
  int v9; // [esp+Ch] [ebp-8h]

  v9 = 0;
  if ( !a2 )
    return 1;
  v8 = (_BYTE *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 10, a1, 0, 1);
  *v8 ^= 0x22u;
  v7 = (_BYTE *)sub_2450("C:/WindRiver/workspace/helloworld/helloworld.c", 11, a1, 0, 1);
  v3 = *v7 == 0xFD;
  *v7 += 3;
  if ( v3 || !v3 )
    goto LABEL_7;
  v4 = (unsigned int)v6 ^ 0x22;
  if ( ((unsigned int)v6 ^ 0x22) == v6[1] )
  {
LABEL_8:
    v5 = v4 - 1;                                // 这里是一个递归
    return sub_330(a1, v5);
  }
  v5 = ((int (*)(void))((char *)&loc_3D3 + 2))();
  if ( !v3 )
  {
LABEL_7:
    v4 = a2;
    goto LABEL_8;
  }
  return sub_330(a1, v5);
}

 

上脚本

#include <stdio.h>
#include <string.h>

int main(void)
{
	int key[] = 
	{
		188, 10, 187, 193, 213, 134, 127, 10, 201, 185, 81, 78,
		136, 10, 130, 185, 49, 141, 10, 253, 201, 199, 127, 185,
		17, 78, 185, 232, 141, 87
	};
	int i, j;
	

	for (i = 0; i < sizeof(key)/sizeof(int); i++)
	{
		for (j = 0; j < sizeof(key)/sizeof(int); j++ )
		{
			key[i] -= 3;
			key[i] ^= 0x22;
		}
		printf("%c",key[i]);
	}
	
	
	return 0;
} 
#flag{helo_w0rld_W3lcome_70_R3}

 

总结:IDA无法识别函数(F5大法失效原因)

  1.堆栈指针问题

  2.花指令问题

 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

Python学习笔记_基础篇(六)_Set集合,函数,深入拷贝,浅入拷贝,文件处理

1、Set基本数据类型 a、set集合&#xff0c;是一个无序且不重复的元素集合 class set(object):"""set() -> new empty set objectset(iterable) -> new set objectBuild an unordered collection of unique elements."""def add(self, *a…

人工智能时代的科学探索 | 《自然》评述

人工智能(AI)正越来越多地融入科学发现&#xff0c;以增强和加速研究&#xff0c;帮助科学家提出假设、设计实验、收集和解释大型数据集&#xff0c;并获得仅靠传统科学方法可能无法实现的洞察力。 过去十年间&#xff0c;AI取得了巨大的突破。其中就包括自监督学习和几何深度学…

LabVIEW开发最小化5G系统测试平台

LabVIEW开发最小化5G系统测试平台 由于具有大量存储能力和数据的应用程序的智能手机的激增&#xff0c;当前一代产品被迫提高其吞吐效率。正交频分复用由于其卓越的品质&#xff0c;如单抽头均衡和具有成本效益的实施&#xff0c;现在被广泛用作物理层技术。这些好处是以严格的…

Image Super-Resolution Using Deep Convolutional Networks-SRCNN

Some words&#xff1a; 这里是一些阅读文章的笔记&#xff0c;这篇文章是第一篇将深度学习应用于超分领域的文章&#xff0c;具有较为重要的意义。 &#xff08;一&#xff09;Abstract&#xff1a; 我们提出一个对于单图像超分的深度学习方法&#xff0c;端到端地学习高低分…

C语言编程:最小二乘法拟合直线

本文研究通过C语言实现最小二乘法拟合直线。 文章目录 1 引入2 公式推导3 C语言代码实现4 测试验证5 总结 1 引入 最小二乘法&#xff0c;简单来说就是根据一组观测得到的数值&#xff0c;寻找一个函数&#xff0c;使得函数与观测点的误差的平方和达到最小。在工程实践中&…

无线液位传感器VS有线液位传感器,优点在哪里?

无线技术在催生新行业诞生的同时&#xff0c;也在不断促使着很多传统设备做出新的改变&#xff0c;包括在工业领域中常用到的液位传感器。 无线液位传感器与有线液位传感器相比&#xff0c;最大的优点就在于使用方便。 在传输上做到无线&#xff1a;无线液位传感器可以选择两…

Acwing C++

756. 蛇形矩阵 题解&#xff1a; 蛇形矩阵走法&#xff1a;右 -> 下 ->左 ->上 坐标变化&#xff1a;(x2,y2) (x1,y1) (dx[d] dy[d]) d步数变化&#xff1a;d (d 1)%4 dx[4],dy[4] 分别用来存放xy偏移量&#xff0c;d初始值为0&#xff0c;在两种情况下会1&#…

OC调用Swift编写的framework

一、前言 随着swift趋向稳定&#xff0c;越来越多的公司都开始用swift来编写苹果相关的业务了&#xff0c;关于swift的利弊这里就不多说了。这里详细介绍OC调用swift编写的framework库的步骤 二、制作framework 1、新建项目&#xff0c;选择framework 2、填写framework的名称…

SpringBoot统⼀功能处理

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 本章是讲Spring Boot 统⼀功能处理模块&#xff0c;也是 AOP 的实战环节&…

[国产MCU]-W801开发实例-开发环境搭建

W801开发环境搭建 文章目录 W801开发环境搭建1、W801芯片介绍2、W801芯片特性3、W801芯片结构4、开发环境搭建1、W801芯片介绍 W801芯片是联盛德微电子推出的一款高性价比物联网芯片。 W801 芯片是一款安全 IoT Wi-Fi/蓝牙 双模 SoC芯片。芯片提供丰富的数字功能接口。支持2.…

YOLOV7改进:加入RCS-OSA模块,提升检测速度

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点。 2.涨点效果:RCS-OSA模块更加轻量化,有效提升检…

开源了一套基于springboot+vue+uniapp的商城,包含分类、sku、商户管理、分销、会员、适合企业或个人二次开发

RuoYi-Mall-JAVA商城-电商系统简介 开源了一套基于若依框架&#xff0c;SringBoot2MybatisPlusSpringSecurityjwtredisVueUniapp的前后端分离的商城系统&#xff0c; 包含分类、sku、商户管理、分销、会员、适合企业或个人二次开发。 前端采用Vue、Element UI&#xff08;ant…

Ubuntu一直卡死的问题(20.04)

Ubuntu一直卡死的问题&#xff08;18.04&#xff09;_ubuntu频繁死机_Mr.Yi的博客-CSDN博客 我自己的解决方法: 1、首先强制关机重启后&#xff0c;直接打开命令行查看磁盘的使用&#xff1a; df -h发现/dev/loop都沾满了&#xff0c;我们能需要做的就是把他们清理干净 sud…

自动驾驶港口车辆故障及事故处理机制

1、传感器故障&#xff1a; &#xff08;1&#xff09;单一传感器数据异常处理。自动驾驶电动平板传感方案为冗余设置&#xff0c;有其他传感器能够覆盖故障传感器观测区域&#xff0c;感知/定位模块将数据异常情况发给到规划决策模块&#xff0c;由“大脑”向中控平台上报故障…

分布式 - 服务器Nginx:一小时入门系列之负载均衡

文章目录 1. 负载均衡2. 负载均衡策略1. 轮询策略2. 最小连接策略3. IP 哈希策略4. 哈希策略5. 加权轮询策略 1. 负载均衡 跨多个应用程序实例的负载平衡是一种常用技术&#xff0c;用于优化资源利用率、最大化吞吐量、减少延迟和确保容错配置。‎使用 nginx 作为非常有效的HT…

关于Power Query中一些忽略的细节

Power Query中一些忽略的细节 重新认识Power Query查询的引用----提高数据加载效率透视逆透视----一对“好朋友”神奇的拼接----实现很多意想不到的操作 重新认识Power Query 关于它的定义&#xff0c;这里不再赘述&#xff0c;主要说一些新的理解。 Power Query 可以理解就是一…

一个简单的协议定制

目录 补充概念&#xff1a;三次握手&#xff0c;四次挥手 再谈协议 网络版计算器 准备工作 makefile log.hpp calServer.hpp calServer.cc calClient.hpp calClient.cc 服务端 新建文件与接口 Protocol.hpp 1.0服务端的一个流程 1.1创建一个回调方法 1.2保证你…

【vue3+xlxs+xlsx-style-vite】vue3项目中使用xlsx插件实现Excel表格的导出和解析,已实现

在vue3项目中使用xlsx插件实现Excel表格的导出和解析 1、xlsx插件包官方 xlsx插件包官方 2、FileReader官方文档&#xff1a;FileReader官方文档 安装xlsx和xlsx-style-vite、file-saver npm install xlsx npm install xlsx-style-vite npm install file-saverpackage.json中查…

【C语言】小游戏-扫雷(清屏+递归展开+标记)

大家好&#xff0c;我是深鱼~ 目录 一、游戏介绍 二、文件分装 三、代码实现步骤 1.制作简易游戏菜单 2. 初始化棋盘(11*11) 3.打印棋盘(9*9) 4.布置雷 5.计算(x,y)周围8个坐标的和 6.排查雷 <1>清屏后打印棋盘 <2>递归展开 <3>标记雷 四、完整代…