攻防世界 Reversing-x64Elf-100

进入题目,先下载附件

将下载好的RE文件拖入ExeinfoPE查看,有无壳

 “Diagnose” 一栏的信息 “NOT WIN EXE -o - ELF executable [64bit obj. Exe file - CPU: AMD x86” 可知,这是一个 ELF 格式的可执行文件(通常用于 Linux 系统),并非 Windows 下常见加壳对象格式。图中没有诸如 “Packer” 之类表明加壳工具的相关信息,也没有类似 “Overlay” (附加数据,壳可能存在于此区域) 的详细说明,所以无壳

 “[64bit obj.” ,表明这是一个 64 位目标文件

拖入IDA中分析

看到main函数

双击main函数名称,会自动跳转到 main 函数的汇编代码界面,可以看到 main 函数对应的汇编指令

按F5,将汇编代码转换为伪代码

对上述代码进行简单的分析

是一个密码验证程序

读取用户输入的密码(最大长度255字节)
调用验证函数sub_4006FD检查密码合法性
根据验证结果输出提示信息

// __int64 表示返回值类型为 64 位整数,__fastcall 是一种调用约定,规定了参数传递的方式
// main 函数是程序的入口点,a1 通常代表命令行参数的数量,a2 是指向命令行参数字符串数组的指针,a3 是指向环境变量字符串数组的指针
__int64 __fastcall main(int a1, char **a2, char **a3)
{// 定义一个长度为 264 的字符数组 s,用于存储用户输入的密码// [rsp+0h] [rbp-110h] BYREF 是栈上的位置信息,BYREF 表示按引用传递char s[264]; // 定义一个 64 位无符号整数 v5,用于存储栈保护金丝雀值// [rsp+108h] [rbp-8h] 是栈上的位置信息unsigned __int64 v5; // 从 fs 段寄存器偏移 0x28 的位置读取栈保护金丝雀值并存储到 v5 中// 栈保护机制用于检测栈溢出攻击,函数返回时会检查该值是否被修改v5 = __readfsqword(0x28u);// 使用 printf 函数向标准输出打印提示信息,提示用户输入密码printf("Enter the password: ");// 使用 fgets 函数从标准输入(键盘)读取最多 255 个字符到字符数组 s 中// fgets 会读取换行符并将其包含在字符串中,直到达到最大长度或遇到文件结束符// 如果 fgets 返回 NULL,表示读取失败,此时函数返回 0 并结束程序if ( !fgets(s, 255, stdin) )return 0LL;// 调用 sub_4006FD 函数对用户输入的密码进行验证// (unsigned int) 是将 sub_4006FD 函数的返回值强制转换为无符号整数类型// 如果 sub_4006FD 函数返回值不为 0,表示密码验证失败if ( (unsigned int)sub_4006FD(s) ){// 使用 puts 函数向标准输出打印错误信息,表示密码不正确puts("Incorrect password!");// 函数返回 1 表示程序以错误状态结束return 1LL;}else{// 如果 sub_4006FD 函数返回值为 0,表示密码验证成功// 使用 puts 函数向标准输出打印成功信息puts("Nice!");// 函数返回 0 表示程序正常结束return 0LL;}
}

推测flag在约束条件中,双击sub_4006FD函数

进行简单的代码审计

1、初始化了三个加密字符串

v3[0] = "Dufhbmf";  // 长度7
v3[1] = "pG`imos";  // 长度7
v3[2] = "ewUglpt";  // 长度7

2、循环验证,对输入的每个字符进行运算验证(共12个字符)

for (i = 0; i <= 11; ++i) {// 计算规则:v3[i%3][2*(i/3)] - input[i] == 1if (*(char *)(v3[i % 3] + 2 * (i / 3)) - *(char *)(i + a1) != 1)return 1LL; // 验证失败
}

漏洞利用点

加密规则可逆,输入字符可通过数学逆运算得到
每个正确字符满足:

input_char = v3[i%3][2*(i//3)] - 1

方法一:字符位置映射法

按顺序拼接解密字符得到flag

Code_Talkers

方法二:脚本解密

用pycharm运行以下python代码

v3 = ["Dufhbmf",  # v3[0]"pG`imos",  # v3[1]"ewUglpt"   # v3[2]
]flag = []
for i in range(12):# 计算对应的字符串和偏移量str_index = i % 3char_offset = 2 * (i // 3)# 获取加密字符encrypted_char = v3[str_index][char_offset]# 计算原始字符(加密字符ASCII减1)decrypted_char = chr(ord(encrypted_char) - 1)flag.append(decrypted_char)print("Flag:", ''.join(flag))

运行结果如下,最后得到flag

Code_Talkers

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

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

相关文章

【C】堆的应用1 -- 堆排序

之前学习了堆&#xff0c;堆的一棵以顺序结构存储的完全二叉树&#xff0c;堆本身又氛围大根堆和小根堆&#xff0c;假设以大根堆为例&#xff0c;由于堆顶部元素是一棵二叉树里面最大的元素&#xff0c;所以如果每次都取堆顶的元素&#xff0c;那么取出的元素就是一个降序排列…

CentOS 7配置YOLOv8环境指南:无显卡版教程 - 幽络源

看本篇教程前请确保Centos7系统已安装配置Python3环境&#xff0c;参考幽络源上一篇文章>CentOS 7安装Python3环境详细指南&#xff1a;从源码编译到PIP配置 步骤1&#xff1a;建立python虚拟环境项目 在home目录下执行如下命令新建虚拟环境python项目 python3 -m venv y…

Confluence知识库管理系统安装步骤(Windows版本)

我们介绍的是安装7.15.1以下版本的安装方式,8.0以上的安装方式暂不支持。 如果你要安装8.0以上的版本,请参考本文末尾的附录中提供的相关网址。 首先我们安装之前需要准备安装所需文件以上文件可以在这里下载:【https://download.csdn.net/download/Elegant_Kevin/90412040】…

Uniapp 开发中遇到的坑与注意事项:全面指南

文章目录 1. 引言Uniapp 简介开发中的常见问题本文的目标与结构 2. 环境配置与项目初始化环境配置问题解决方案 项目初始化注意事项解决方案 常见错误与解决方案 3. 页面与组件开发页面生命周期注意事项示例代码 组件通信与复用注意事项示例代码 样式与布局问题注意事项示例代码…

学习笔记--电磁兼容性EMC

一、基本概念 电磁兼容性&#xff08;Electromagnetic Compatibility&#xff0c;EMC&#xff09;是电子电气设备在特定电磁环境中正常工作的能力&#xff0c;同时不会对其他设备产生不可接受的电磁干扰。其核心目标是确保设备在共享的电磁环境中既能抵抗干扰&#xff0c;又能避…

Unity百游修炼(2)——Brick_Breaker详细制作全流程

一、项目简介 Brick Breaker 是一款经典的打砖块游戏&#xff0c;本次案例将使用 Unity 引擎来实现该游戏的核心功能。 游戏画面如下&#xff1a; Brick_ breaker 二、项目结构概览和前期准备 &#xff08;1&#xff09;在 Unity 项目视图中&#xff0c;我们可以看到几个重要…

Java基础常见的面试题(易错!!)

面试题一&#xff1a;为什么 Java 不支持多继承 Java 不支持多继承主要是为避免 “菱形继承问题”&#xff08;又称 “钻石问题”&#xff09;&#xff0c;即一个子类从多个父类继承到同名方法或属性时&#xff0c;编译器无法确定该调用哪个父类的成员。同时&#xff0c;多继承…

算法题(77):数组中的第k个最大元素

审题&#xff1a; 需要我们在时间复杂度O(n)的前提下找到数组中第k个最大元素 思路&#xff1a; 方法一&#xff1a;建堆实现 首先写一个dowmset函数&#xff0c;实现对第i个索引位置的向下调整。然后创建build函数&#xff0c;利用dowmset实现向下调整建堆&#xff0c;再根据k…

PCIe学习笔记1:PCIe体系架构——PCIe简介

目录 一、PCIe简介 1.1 串行传输 1.1.1 相对于并行传输的优化 1.1.2 带宽计算 1.1.3 差分信号传输 1.1.4 基于数据包的传输协议 1.2 PCIe的系统拓扑结构 1.2.1 根组件&#xff08;Root Complex&#xff0c;RC&#xff09; 1.2.2 上行端口与下行端口 1.2.3 交换机与桥 …

一天记20个忘10个之4:man

据说&#xff0c;给你一个支点&#xff0c;你就能撬起地球。 那好&#xff0c;今天&#xff0c;我给你一个 man&#xff0c;如果你能完成记20个忘10个的任务&#xff0c;你就真的很 man 了。 零、热身 young manold manmedical man 一、man之复合词 1.1 man复合词 chairm…

SpringBoot之自定义简单的注解和AOP

1.引入依赖 <!-- AOP依赖--> <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.8</version> </dependency>2.自定义一个注解 package com.example.springbootdemo3.an…

利用开源小智AI制作桌宠机器狗

本文主要介绍如何利用开源小智AI制作桌宠机器狗 1 源码下载 首先下载小智源码,下载地址, 下载源码后,使用vsCode打开,需要在vscode上安装esp-idf,安装方式请自己解决 2 源码修改 2.1添加机器狗控制代码 在目录main/iot/things下添加dog.cc文件,内容如下; #include…

深入理解IP子网掩码子网划分{作用} 以及 不同网段之间的ping的原理 以及子网掩码的区域划分

目录 子网掩码详解 子网掩码定义 子网掩码进一步解释 子网掩码的作用 计算总结表 子网掩码计算 子网掩码对应IP数量计算 判断IP是否在同一网段 1. 计算步骤 2. 示例 3. 关键点 总结 不同网段通信原理与Ping流程 1. 同网段通信 2. 跨网段通信 网段计算示例 3. P…

利用python和gpt写一个conda环境可视化管理工具

最近在学习python&#xff0c;由于不同的版本之间的差距较大&#xff0c;如果是用环境变量来配置python的话&#xff0c;会需要来回改&#xff0c;于是请教得知可以用conda来管理&#xff0c;但是conda在管理的时候老是要输入命令&#xff0c;感觉也很烦&#xff0c;于是让gpt帮…

Linux内核,slub分配流程

我们根据上面的流程图&#xff0c;依次看下slub是如何分配的 首先从kmem_cache_cpu中分配&#xff0c;如果没有则从kmem_cache_cpu的partial链表分配&#xff0c;如果还没有则从kmem_cache_node中分配&#xff0c;如果kmem_cache_node中也没有&#xff0c;则需要向伙伴系统申请…

使用Windbg调试目标进程排查C++软件异常的一般步骤与要点分享

目录 1、概述 2、将Windbg附加到已经启动起来的目标进程上&#xff0c;或者用Windbg启动目标程序 2.1、将Windbg附加到已经启动起来的目标进程上 2.2、用Windbg启动目标程序 2.3、Windbg关联到目标进程上会中断下来&#xff0c;输入g命令将该中断跳过去 3、分析实例说明 …

51单片机测试题AI作答测试(DeepSeek Kimi)

单片机测试题 DeepSeek Kimi 单项选择题 &#xff08;10道&#xff09; 6题8题判断有误 6题判断有误 智谱清言6题靠谱&#xff0c;但仔细斟酌&#xff0c;题目出的貌似有问题&#xff0c;详见 下方。 填空题 &#xff08;9道&#xff09; 脉宽调制&#xff08;Pulse …

模版语法vscode

这里注意&#xff1a;<template></template>里面只能写一个根标签&#xff0c;其他在嵌套&#xff1a; <script > export default {data(){return{tthtml:"<a hrefhttps://itbaizhan.com>百战程序员</a>"}} } </script><tem…

洛谷B3637 最长上升子序

B3637 最长上升子序列 - 洛谷 代码区&#xff1a; #include<bits/stdc.h>using namespace std;int main(){int n;cin >> n;int arry[n],dp[n];for(int i0;i<n;i){cin >>arry[i];dp[i]1;}/*在 i 之前可能存在多个 j 满足 arry[j] < arry[i]&#xff0c…

kotlin 知识点 七 泛型的高级特性

对泛型进行实化 泛型实化这个功能对于绝大多数Java 程序员来讲是非常陌生的&#xff0c;因为Java 中完全没有这个概 念。而如果我们想要深刻地理解泛型实化&#xff0c;就要先解释一下Java 的泛型擦除机制才行。 在JDK 1.5之前&#xff0c;Java 是没有泛型功能的&#xff0c;…