re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序)
参考文章:
re学习笔记(27)攻防世界-re-csaw2013reversing2_Forgo7ten的博客-CSDN博客
攻防世界逆向入门题之csaw2013reversing2_沐一 · 林的博客-CSDN博客
三种做法
1、ida静态分析修改指令
main函数反编译的代码
由于运行之后的是乱码,所以可以猜测生成flag的函数没有执行,所以需要跳到生成flag的函数执行,但是前面的中断函数不能执行,需要nop掉,并且后面退出程序的函数不能执行,需要跳到弹框函数继续执行。(修改的路径和文件名不要有中文,我用ida修改的时候踩了坑,大家可以试一试)
一.ida修改代码的方法:
1、鼠标停留在要修改的汇编代码上,然后点击Edit > Patch program > Assemble(中文:编辑 > 修补程序 > 汇编)
2、修改完成后:Edit > Patch program > Apply pathes to input file > OK(中文:编辑 > 修补程序 > 修补程序应用到输入文件 > 确定)
二.IDA图形视图讲解:
图形视图将一个函数分解成许多基本块,以生动显示该函数由一个块到另一个块的控制流程
基本块是一个不包含分支,从头执行到尾的最大指令序列
基本块中的第一条指令通常是分支指令的目标,而最后一条指令则往往是一条分支指令
IDA 使用不同的彩色箭头区分函数块之间各种类型的流
正常流(也叫做普通流)表示指令默认连续执行,跳转流表示当前的指令跳转到(或可能跳转到)某个非连续性位置,调用流表示当前指令会调用一个子例程
根据测试条件,在条件跳转位置终止的基本块可能会生成两种流:Yes 边的箭头(是的,执行分支)默认为绿色,No 边的箭头(不,不执行分支)默认为红色
只有一个后继块的基本块会利用一个正常边(默认为蓝色)指向下一个即将执行的块
在图形模式下,IDA 一次显示一个函数
使用滑轮鼠标的用户,可以使用“CTRL+鼠标滑轮”来调整图形的大小
修改之前的汇编代码
修改之后的汇编代码
修改完成之后,直接运行文件,得到flag
2、ollydbg动态调试,nop大法
将文件导入ollydbg后,直接右键 > 中文搜索引擎 > 智能搜索,找到Flag
双击之后向上找到IsDebuggerPresent函数,点击这句汇编,下断点,重新载入
F8两次,发现一个跳转,根据之前ida的分析,这应该就是那个if语句的判断,跳过的中间部分就是生成flag的函数,所以我们把这个跳转nop掉
继续F8执行,执行到int 3,这是中断语句,所以也nop掉
F8执行完生成flag的函数后,后面有一个大跳转,跳到退出程序的函数
所以我们把这个跳转也给nop掉,继续F8,执行完一个MessageBoxA(弹框)函数后,发现程序此时处于Running状态,弹出一个什么也没有的框,其实这是另外一个弹框函数,真正输出flag的弹框函数是后面那个,在我们之前那个ida的修改之后的汇编图也可以发现,确实是有一个没有被调用的弹框函数,所以我们之前可以那个nop掉的跳转改为跳转到下面那个弹框函数,但既然说了是nop大法,就nop到底
点击中止之后,发现又要执行一个跳转,跳过了我们真正的弹框函数
将这个跳转nop掉,接着F8,就可以看到flag了
3、 分析代码写脚本
main函数代码
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{int v3; // ecxCHAR *lpMem; // [esp+8h] [ebp-Ch]HANDLE hHeap; // [esp+10h] [ebp-4h]hHeap = HeapCreate(0x40000u, 0, 0);lpMem = (CHAR *)HeapAlloc(hHeap, 8u, MaxCount + 1);memcpy_s(lpMem, MaxCount, &unk_409B10, MaxCount);if ( sub_40102A() || IsDebuggerPresent() ){__debugbreak();sub_401000(v3 + 4, lpMem);ExitProcess(0xFFFFFFFF);}MessageBoxA(0, lpMem + 1, "Flag", 2u);HeapFree(hHeap, 0, lpMem);HeapDestroy(hHeap);ExitProcess(0);
}
关键函数sub_401000的两个参数,v3后面没有用到,向上找lpMem的赋值语句,memcpy_s,将unk_409B10地址的值给了它,双击查看
进入sub_401000函数内部,代码
unsigned int __fastcall sub_401000(int a1, int a2)
{int v2; // esiunsigned int v3; // eaxunsigned int v4; // ecxunsigned int result; // eaxv2 = dword_409B38;v3 = a2 + 1 + strlen((const char *)(a2 + 1)) + 1;v4 = 0;result = ((v3 - (a2 + 2)) >> 2) + 1;if ( result ){do*(_DWORD *)(a2 + 4 * v4++) ^= v2;while ( v4 < result );}return result;
}
a2也就是lpMem,发现后面的异或语句有v2,向上找v2的赋值语句,找到v2 = dword_409B38,双击dword_409B38,找到内容
这里是四个字节显示的,又由于小端存储,所以顺序是颠倒的,我们可以将其转换成一个字节查看
wp:
x=[0xbb,0xaa,0xcc,0xdd]
y=[0xBB,0xCC,0xA0,0xBC,0xDC,0xD1,0xBE,0xB8,0xCD,0xCF,0xBE,0xAE,0xD2,0xC4,0xAB,0x82,0xD2,0xD9,0x93,0xB3,0xD4,0xDE,0x93,0xA9,0xD3,0xCB,0xB8,0x82,0xD3,0xCB,0xBE,0xB9,0x9A,0xD7,0xCC,0xDD]
i=0
z=[]
while i<len(y):t=chr(y[i]^x[i%4])z.append(t)i+=1
print(z)
print(''.join(z))
['\x00', 'f', 'l', 'a', 'g', '{', 'r', 'e', 'v', 'e', 'r', 's', 'i', 'n', 'g', '_', 'i', 's', '_', 'n', 'o', 't', '_', 't', 'h', 'a', 't', '_', 'h', 'a', 'r', 'd', '!', '}', '\x00', '\x00']
flag{reversing_is_not_that_hard!}
这里就可以知道为什么调用第一个弹窗会输出空白,因为第一个弹窗函数,是直接从第一个字符输出的,但是第一个字符解码后为'\0',直接截断,所以会输出空白,第二个弹窗是从lpMem+1开始输出的
相关文章:

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序)
参考文章: re学习笔记(27)攻防世界-re-csaw2013reversing2_Forgo7ten的博客-CSDN博客攻防世界逆向入门题之csaw2013reversing2_沐一 林的博客-CSDN博客 三种做法 1、ida静态分析修改指令 main函数反编译的代码 由于运行之后的是乱码&…...

centos 7.9 部署django项目
1、部署框架 主要组件:nginx、uwsgi、django项目 访问页面流程:nginx---》uwsgi---》django---》uwsgi---》nginx 2、部署过程 操作系统:centos 7.9 配置信息:4核4G 50G 内网 eip :10.241.103.216 部署过程&…...

12 正则表达式 | HTTP协议相关介绍
文章目录 正则表达式re模块最基础操作(匹配开头)匹配单个字符匹配多个字符匹配开头结尾匹配分组对于group的理解r的作用re 模块高级用法compilesearchfindall易错点 sub直接替换函数替换 split 根据匹配进行切割字符串,并返回一个列表 python…...

【C语言】数组概述
🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:C语言 🔥该篇将带你了解 一维数组,二维数组等相关知识。 目录: 📘前言:…...

8. 实现业务功能--用户注册
目录 1. 顺序图 2. 参数要求 3. 接口规范 4. 创建扩展 Mapper.xml 5. 修改 DAO 6. 创建 Service 接口 7. 实现接口 8. 测试接口 9. 实现 Controller 9.1 密码加密处理 10. 实现前端界面 业务实现过程中主要的包和目录及主要功能: model 包:实体对象 d…...
深入浅出Pytorch函数——torch.nn.init.eye_
分类目录:《深入浅出Pytorch函数》总目录 相关文章: 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

版本控制工具Git集成IDEA的学习笔记(第一篇Gitee)
目录 一、Gitee的使用 1、注册网站会员 2、用户中心 3、创建远程仓库 4、配置SSH免密登录 二、集成IDEA,Git项目搭建 1、本地仓库搭建 1)创建一个新项目 2)打开终端,在当前目录新建一个Git代码库 3)忽略文件 …...
【链表】 61. 旋转链表
61. 旋转链表 解题思路 首先计算出链表长度将链表长度进行取余遍历链表 对链表进行分割 得到两个子链表重新连接两个链表比如1 2 3 4 5 k 2 进行分割得到 1 2 3 和 4 5两个子链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* Lis…...
深入浅出Pytorch函数——torch.nn.init.kaiming_uniform_
分类目录:《深入浅出Pytorch函数》总目录 相关文章: 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...
查询Oracle和MySQL数据库中当前所有连接信息
查询Oracle当前所有连接信息: SELECTs.sid AS 会话ID,s.serial# AS 序列号,s.username AS 用户名,s.osuser AS 操作系统用户,s.machine AS 客户端机器,s.program AS 客户端程序,s.status AS 会话状态,s.sql_id AS 正在执行的SQL_ID,t.sql_text AS 正在执行的SQL文本…...

Android glide框架及框架涉及到的设计模式
目录 原文链接Android glide框架 简单使用介绍Glide 框架整体结构设计Glide 框架的优点基本使用:Glide占位符 Android glide框架涉及到的设计模式 原文链接 Android glide框架 简单使用介绍 Glide:快速高效的Android图片加载库,可以自动加载…...

使用yolov5进行安全帽检测填坑指南
参考项目 cGitHub - PeterH0323/Smart_Construction: Base on YOLOv5 Head Person Helmet Detection on Construction Sites,基于目标检测工地安全帽和禁入危险区域识别系统,🚀😆附 YOLOv5 训练自己的…...

【BASH】回顾与知识点梳理(三十二)
【BASH】回顾与知识点梳理 三十二 三十二. SELinux 初探32.1 什么是 SELinux当初设计的目标:避免资源的误用传统的文件权限与账号关系:自主式访问控制, DAC以政策规则订定特定进程读取特定文件:委任式访问控制, MAC 32.2 SELinux 的运作模式安…...

vscode远程调试PHP代码
目录 一、准备工作 二、ssh连接和xdebug配置 1.ssh连接 2.xdebug配置 三、xdebug调试,访问 一、准备工作 1.安装vscode里面的两个扩展 2.安装对应PHP版本的xdebug 去xdebug官方,复制自己的phpinfo源码到方框里,再点击Analyse Xdebug: …...
flink1.17 实现 udf scalarFunctoin get_json_object 支持 非标准化json
特色 相比官方的json_value,该函数支持非标准化json,比如v是个object,但是非标准json会外套一层引号,内部有反引号. eg: {"kkkk2": "{\"kkkk1\":\"vvvvvvv\"}" } 支持value为 100L 这种java格式的bigint. {"k":999L…...

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)九:自定义组件封装下
一、本章内容 续上一张,本章实现一些自定义组件的封装,包括文件上传组件封装、级联选择组件封装、富文本组件封装等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 基于VUE3+Layui从头搭建通用后台管...
设计模式详解-装饰器模式
类型:结构型模式 实现原理:装饰器模式通过将对象包装在装饰器类中,并在保持类方法签名完整性的前提下,提供额外功能 作用:动态地给一个对象添加一些额外的职责。增加功能方面,装饰器模式比生成子类更灵活…...

Android5:活动生命周期
创建项目Stopwatch activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayoutxmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_w…...
第2章 数据结构和算法概述
2.3线性结构和非线性结构 数据结构包括: 线性结构和非线性结构 2.3.1线性结构 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表)。顺序存储的线性表称…...

WPF国际化的实现方法(WpfExtensions.Xaml)
https://blog.csdn.net/eyupaopao/article/details/120090431 resx资源文件实现 resx资源文件,实现的过程比第一种复杂,但resx文件本身编辑比较简单,维护起来比较方便。需要用到的框架:WpfExtensions.Xaml 为每种语言添加.resx资…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
基于Uniapp的HarmonyOS 5.0体育应用开发攻略
一、技术架构设计 1.混合开发框架选型 (1)使用Uniapp 3.8版本支持ArkTS编译 (2)通过uni-harmony插件调用原生能力 (3)分层架构设计: graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...
ffmpeg(三):处理原始数据命令
FFmpeg 可以直接处理原始音频和视频数据(Raw PCM、YUV 等),常见场景包括: 将原始 YUV 图像编码为 H.264 视频将 PCM 音频编码为 AAC 或 MP3对原始音视频数据进行封装(如封装为 MP4、TS) 处理原始 YUV 视频…...