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 Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

Python解析器安装指南分享(Mac/Windows/Linux)

《Python解析器安装指南分享(Mac/Windows/Linux)》:本文主要介绍Python解析器安装指南(Mac/Windows/Linux),具有很好的参考价值,希望对大家有所帮助,如有... 目NMNkN录1js. 安装包下载1.1 python 下载官网2.核心安装方式3. MACOS 系统安

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win

Windows环境下安装达梦数据库的完整步骤

《Windows环境下安装达梦数据库的完整步骤》达梦数据库的安装大致分为Windows和Linux版本,本文将以dm8企业版Windows_64位环境为例,为大家介绍一下达梦数据库的具体安装步骤吧... 目录环境介绍1 下载解压安装包2 根据安装手册安装2.1 选择语言 时区2.2 安装向导2.3 接受协议

jdk21下载、安装详细教程(Windows、Linux、macOS)

《jdk21下载、安装详细教程(Windows、Linux、macOS)》本文介绍了OpenJDK21的下载地址和安装步骤,包括Windows、Linux和macOS平台,下载后解压并设置环境变量,最... 目录1、官网2、下载openjdk3、安装4、验证1、官网官网地址:OpenJDK下载地址:Ar

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

在 Windows 上安装 DeepSeek 的完整指南(最新推荐)

《在Windows上安装DeepSeek的完整指南(最新推荐)》在Windows上安装DeepSeek的完整指南,包括下载和安装Ollama、下载DeepSeekRXNUMX模型、运行Deep... 目录在www.chinasem.cn Windows 上安装 DeepSeek 的完整指南步骤 1:下载并安装