Windows_Reverse1

2023-12-05 19:48
文章标签 windows reverse1

本文主要是介绍Windows_Reverse1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 0x0 题目涉及知识点
  • 0x1 查壳脱壳
  • 0x2 反汇编分析
  • 0x3 写脚本

0x0 题目涉及知识点

  1. 简单脱壳
  2. 指针运算
  3. 位移量
  4. 字符串查询

0x1 查壳脱壳

在这里插入图片描述
在这里插入图片描述
使用 UPX 工具脱壳

0x2 反汇编分析

在这里插入图片描述
初步了解程序执行流程,sub_401000(&v6) 为加密过程,&v4中存放了flag。

  char v4; // [esp+4h] [ebp-804h]char v5; // [esp+5h] [ebp-803h]char v6; // [esp+404h] [ebp-404h]char Dst; // [esp+405h] [ebp-403h]v6 = 0;memset(&Dst, 0, 0x3FFu);v4 = 0;memset(&v5, 0, 0x3FFu);

这两句有一些特殊,是以Dst和V5的地址为数组首地址,创建0x3FF大小缓冲区用于存放数据。
在这里插入图片描述
可视化分析流程,得到 you have got it 逆向就完成。

中间部分是我们需要逆向分析的算法,算法中有一个向上的跳转作为循环
在这里插入图片描述

scanf("%s", &v6);
sub_401000(&v6);

输入字符串,并将地址传入 sub_401000()

unsigned int __cdecl sub_401000(const char *a1)
{_BYTE *v1; // ecxunsigned int v2; // ediunsigned int result; // eaxint v4; // ebxv2 = 0;result = strlen(a1);if ( result ){v4 = a1 - v1;do{*v1 = byte_402FF8[(char)v1[v4]];++v2;++v1;result = strlen(a1);}while ( v2 < result );}return result;
}

以上为IDA反汇编结果,因为涉及到指针的计算,直接从反汇编代码中无法理解 v1 v4 的作用,所以打开OD进行动态调试。
在这里插入图片描述
通过调试发现,v4的值是定值 sub ebx,ecx ⇒ ebx = 0x400
在这里插入图片描述
循环中,eax中存放一个byte的数据,来自ds:[ebx + ecx]
发现 ebx(0x400) + 0xecx ecx每次都自增1,这正好是我们输入字符串的地址。

总结过程:
遍历输入的字符串,获取每个字符转为整数A,在常数数组获取下标为A的字符放入*V1中,每次V1指针都自增1
在这里插入图片描述
在这里插入图片描述
发现通过OD无法直接访问到0x402FF8数据,但是访问 eax + 0x402FF8可以访问到数据,可以看出是一个字符串,所以直接在IDA中查看String,发现真正的地址为0x00403018,存在0x20的位移
在这里插入图片描述
通过IDA获取加密字符串

.data:00403018	00000060	C	~}|{zyxwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#\"! 

在这里插入图片描述
通过以上分析,重写反汇编代码,让自己可以直接调试这个算法。

#include<iostream>
#include<string>
using namespace std;
string byte_402FF8 = "~}|{zyxwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#\"! ";
unsigned int  sub_401000(string inputArray)
{char v1[100] = {0}; // resultunsigned int cnt = 0;unsigned int inputLen = inputArray.length();cnt = 0;do{v1[cnt] = byte_402FF8[(char)inputArray[cnt] - 0x20];++cnt; }while ( cnt < inputLen );v1[cnt] = '\0';cout <<v1;return inputLen;
}int main(){sub_401000("123456");
}

在这里插入图片描述
最后运算结果与字符串DDCTF{reverseME} 比较是否相等

0x3 写脚本

我们要做的就是将字符串 DDCTF{reverseME} 重新映射到输入

#include<iostream>
#include<string>
using namespace std;
string byte_402FF8 = "~}|{zyxwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#\"! ";
unsigned int  sub_401000(string inputArray)
{char v1[100] = {0}; // resultunsigned int cnt = 0;unsigned int inputLen = inputArray.length();cnt = 0;do{v1[cnt] = byte_402FF8[(char)inputArray[cnt] - 0x20];++cnt; }while ( cnt < inputLen );v1[cnt] = '\0';cout <<v1;return inputLen;
}int find_index(char s){for(int i=0;i<byte_402FF8.length();i++){if(s == byte_402FF8[i]) return i;}cout <<"error"<<endl;return -1;
}string reverse(string result){char input[100];int i;for(i = 0; i < result.length() ;i++){int index = find_index(result[i]);input[i] = (char)index + 0x20;}input[i] = '\0';return string(input);
}int main(){string flag = reverse("DDCTF{reverseME}");cout << endl << "flag{" << flag << "}" << endl;sub_401000(flag);
}

在这里插入图片描述
拿到flag
在这里插入图片描述
花了好长时间哇,中途去上数据库网课了哈哈。

这篇关于Windows_Reverse1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/458908

相关文章

在 Windows 上部署 gitblit

在 Windows 上部署 gitblit 在 Windows 上部署 gitblit 缘起gitblit 是什么安装JDK部署 gitblit 下载 gitblit 并解压配置登录注册为 windows 服务 修改 installService.cmd 文件运行 installService.cmd运行 gitblitw.exe查看 services.msc 缘起

Windows如何添加右键新建菜单

Windows如何添加右键新建菜单 文章目录 Windows如何添加右键新建菜单实验环境缘起以新建`.md`文件为例第一步第二步第三步 总结 实验环境 Windows7 缘起 因为我习惯用 Markdown 格式写文本,每次新建一个.txt后都要手动修改为.md,真的麻烦。如何在右键新建菜单中添加.md选项呢? 网上有很多方法,这些方法我都尝试了,要么太麻烦,要么不凑效

Windows下Nginx的安装及开机启动

1、将nginx-1.16.1.zip解压拷贝至D:\web\nginx目录下。 2、启动Nginx,两种方法: (1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过。 (2)打开cmd命令窗口,切换到nginx目录下,输入命令 nginx.exe 或者 start nginx ,回车即可。 3、检查nginx是否启动成功。 直接在浏览器地址栏输入网址 http://lo

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

C++实现俄罗斯方块(Windows控制台版)

C++实现俄罗斯方块(Windows控制台版) 在油管上看到一个使用C++控制台编写的俄罗斯方块小游戏,源代码200多行,B站上也有相关的讲解视频,非常不错,值得学习。 B站讲解视频地址为:【百万好评】国外技术大神C++游戏编程实战教程,油管580W收藏,新手10小时入门,并快速达到游戏开发能力(中英字幕) B站 CSDN博主千帐灯无此声还为此写了一篇博客:C++实现俄罗斯方块(源码+详解),讲

Windows下php扩展开发c++动态库

PHP扩展开发,从零了解到初步完成一个小项目,经过三天的仔细研究,现整理如下 一、需求介绍 PHP扩展开发,调用自己之前的c++动态库,完成功能 二、项目之前 系统:windows xp  开发工具:vs 2008 web环境:apache2.4  PHP5.3.29-VC9-ts-x86 aphach和PHP 环境之前已经搭建完成 PHP源码:去官网http://www.php.n

OpenStack镜像制作系列4—Windows Server2019镜像

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录  CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作系

Windows与linux中docker的安装与使用

windos中安装使用docker 下载Docker_Desktop 安装包进入docker官网下载Docker_Desktop: https://www.docker.com/ 启用wsl 我们搜索“启用或关闭Windows功能”,打开后勾选适用于Linux的Windows 子系统 Docker_Desktop设置 出现Docker Engine stopped的解决

Windows 10 各版本

对应于服务选项的 Windows 10 当前版本 Version服务选项上市日期OS build最后修订日期1803半年频道7/10/201817134.1917/24/2018Microsoft 建议使用1803半年频道(定向)4/30/201817134.1917/24/20181709半年频道1/18/201816299.5797/24/20181709半年频道(定向)10/17/2017

Windows系统不关机故障的解决方法

当Windows系统出现不关机故障时,首先要查找引起Windows系统不关机的原因,然后根据 具体的故障原因采取相应的解决方法。   Windows系统不关机故障的解决方法如下。   1.检查所有正在运行的程序   检查运行的程序主要包括关闭任何在实模式下加载的TSR程序、关闭开机时从启动组自动启 动的程序、关闭任何非系统引导必需的第三方设备驱动程序。   检查运行的程序并停