逆向攻防世界CTF系列37-crackme

逆向攻防世界CTF系列37-crackme

参考https://blog.csdn.net/xiao__1bai/article/details/120230397

image-20241116162958244

nspack的壳,查了一下好像是北斗的一个壳

没找到什么脱壳软件,只能手动脱壳了

手动脱壳的最终要的是ESP定律

ESP定律的原理就是“堆栈平衡”原理

涉及的汇编知识:

call命令:

  1. 向堆栈中压入下一行程序的地址;
  2. JMP 到 call 的子程序地址处。

例如:

00401029 E8 DA240A00 call 004A3508

0040102E 5A pop edx

在执行了00401029以后,程序会将0040102E(下一条指令地址)压入堆栈,然后 JMP 到 004A3508 地址处

RETN命令:

将当前的 ESP 中指向的地址出栈;JMP 到这个地址。

堆栈平衡可以简单的理解为在一个函数的ret之前,中间入栈和出栈的次数要相等(也就是一定要保证在 RETN 这条指令之前,ESP指向的是我们压入栈中的地址)

软件加壳就是隐藏了OEP(或者用了假的OEP), 只要找到程序真正的OEP,就可以立刻脱壳,当程序运行到OEP这个位置,程序控制权会交还给原程序, 一般脱壳的步骤需要寻找这个OEP点

可以看下面这篇文章

手动脱壳教程-CSDN博客和逆向基础:软件手动脱壳技术入门_ollydbg脱壳教程-CSDN博客

1.这个是加了 ASPACK 壳程序的入口时各个寄存器的值:(入壳,解压缩)
EAX 00000000
ECX 0012FFB0
EDX 7FFE0304 //堆栈值
EBX 7FFDF000 //堆栈值
ESP 0012FFC4
EBP 0012FFF0
ESI 77F57D70 ntdll.77F57D70
EDI 77F944A8 ntdll.77F944A8
EIP 0040D000 ASPACK.

2.这个是 ASPACK 壳 JMP 到 OEP(Original Enter Point)后的寄存器的值:(出壳,回主程序 OEP)
EAX 004010CC ASPACK.004010CC //保存了当前OEP的值
ECX 0012FFB0
EDX 7FFE0304 //堆栈值
EBX 7FFDF000 //堆栈值
ESP 0012FFC4
EBP 0012FFF0
ESI 77F57D70 ntdll.77F57D70
EDI 77F944A8 ntdll.77F944A8
EIP 004010CC ASPACK.004010CC
除了EIP不同以外,eax 保存当前 OEP 值,其他都一模一样啊!

ESP定律的适用范围是几乎全部的压缩壳,部分加密壳。只要是在JMP到OEP后,ESP=0012FFC4的壳,理论上我们都可以使用

是不是只能下断12FFA4的访问断点?
当然不是,那只是ESP定律的一个体现,我们运用的是ESP定律的原理,而不应该是他的具体数值,不能说12FFA4,或者12FFC0就是ESP定律,他们只是ESP定律的一个应用罢了!

内存断点:当下读写断点时,调试器会修改断点处读写属性,如果程序对此数据读写的话,会产生读写异常,调试器捕捉此异常

内存断点分为:内存访问断点,内存写入断点。

我们知道,在程序运行的时候会有3种基本的状态产生:
读取–>写入–>执行。
004AE242 A1 00104000 mov eax,dword ptr ds:[004AE24C] //004AE24C处的内存读取
004AE247 A3 00104000 mov dword ptr ds:[004AE24C],eax //004AE24C处的内存写入
004AE24C 83C0 01 add eax,1 //004AE24C处的内存执行

  1. 当对004AE24C下内存访问断点的时候,可以中断在004AE242也可以中断在004AE247和004AE24C。(因为访问包含执行、写入、读取)
  2. 当对004AE24C下内存写入断点的时候,只能中断在004AE247。
  3. 当执行004AE24C的时候,只能中断在004AE24C。

**其实将这么多我做一个方法小总结:**就是对第一次push时的esp地址做硬件断点,因为堆栈平衡,最后esp还会还原到这个地址,我们接下来的jmp就是ope了

光讲有点难懂,直接实操

od直接打开

image-20241116210213706

直接看到亮眼的push,F8一下,发现ESP变化

image-20241116210303591

右键ESP,数据窗口跟随(为了下硬件断点)

image-20241116210539981

46这个地方一下个断点,F9

image-20241116211620135

popfd,看esp又是0019ff70了,再F8

jmp跳出,jmp跳出壳后就是解压缩的代码了,右键分析当前代码把.text.段中数据重新反汇编成汇编代码,同IDA热键C

image-20241116212149325

image-20241116212226543

然后OllyDump出来

image-20241116212714320

image-20241116212729134

扔进IDA

image-20241116204740900

写解密代码,很简单了这里


key = "this_is_not_flag"
enc = [18, 4, 8, 20, 36, 92, 74, 61, 86, 10, 16, 103, 0, 65, 0, 1, 70, 90, 68, 66, 110, 12, 68, 114, 12, 13, 64, 62, 75, 95, 2, 1, 76, 94, 91, 23, 110, 12, 22, 104, 91, 18]for i in range(len(enc)):print(chr(enc[i] ^ ord(key[i % 16])),end='')

flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}

这里解释一下下断点为什么是word?《IDA权威指南中的解释》

在这里插入图片描述

2d1ee75}

这里解释一下下断点为什么是word?《IDA权威指南中的解释》

在这里插入图片描述

我们之前下断点是46,是两字节的所以是word

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

按钮权限的操作方法

首先先在你的本地储存里边,加入一些你指定的字段 然后创建一个文件夹,在此文件夹下创建一个js文件,文件内容如下 在你所需要隐藏按钮的页面引入此js文件,并且通过 directives自定义指令绑定你的每一个按钮。在js文件中通过三个常量…

vscode 关闭绑定元素 隐式具有“any”类型这类错误

在vue的项目里面,经常看到any类型的报错,真的很烦的 在tsconfig.json中配置以下参数 “noImplicitAny”: false 就可以了 出现类型“never”上不存在属性“userName”。ts-plugin(2339) 配置该参数 modeuleResolution : node "compilerOptions&qu…

springboot 的 Profile

什么是 Profile ? 应用所在的运行环境发生切换时,配置文件常常就需要随之修改。 Profile:——就是一组配置文件及组件的集合。 可以整个应用在不同的profile之间切换(设置活动profile),整个应用都将使用该…

onvif协议相关:4.1.6 Digest方式云台控制启动

背景 关于onvif的其实很早之前我已经在专栏中写了不少了, 使用onvif协议操作设备 但最近有陆陆续续的粉丝问我, 希望我在写一些关于 onvif的设备自动发现、预置位跳转、云台操作的博客。 满足粉丝的需求,安排。 今天我们来实现 设备云台的控制(启动) 实现 1.在ONVIF Devi…

【JAVA毕业设计】基于Vue和SpringBoot的农机电招平台

本文项目编号 T 615 ,文末自助获取源码 \color{red}{T615,文末自助获取源码} T615,文末自助获取源码 随着农机电招行业的不断发展,农机电招在现实生活中的使用和普及,农机电招行业成为近年内出现的一个新行业&#x…

基于Jmeter的分布式压测环境搭建及简单压测实践

写在前面 平时在使用Jmeter做压力测试的过程中,由于单机的并发能力有限,所以常常无法满足压力测试的需求。因此,Jmeter还提供了分布式的解决方案。本文是一次利用Jmeter分布式对业务系统登录接口做的压力测试的实践记录。按照惯例&#xff0…

代码随想录算法训练营day41|动态规划04

最后一块石头的重量|| 返回剩余最后一块石头石头最小的可能重量,那么就应该最后剩余的两块石头尽量都等于或接近总重量的一半,这样剩下的就是一半的质量 目标和 给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有…

Python+Flask实现随机选谷票游戏

西方曾进行一项著名的投资随机性实验,对比基金经理与猴子在选股上的表现。 实验方法:主持人提供一系列股票,基金经理依靠其专业知识(如财务报表、行业趋势、产品市场及公司文化与管理层分析等)进行筛选;而…

【Python数据可视化分析实战】数据爬取—京东手机品牌信息数据爬取和数据分析与可视化

大数据分析设计方案 1.数据集来源:https://search.jd.com 2.实现思路: (1)数据爬取 首先,我们需要从京东平台上采集手机品牌的相关数据。可以通过网络爬虫或API接口等方式获取数据。为了保证数据的完整性和准确性&…

使用 TensorFlow 实现 ZFNet 进行 MNIST 图像分类

ZFNet(ZF-Net)是由 Matthew Zeiler 和 Rob Fergus 提出的卷积神经网络架构,它在图像分类任务中取得了显著的效果。它在标准卷积神经网络(CNN)的基础上做了一些创新,例如优化了卷积核大小和池化策略&#xf…

11.15 HTML

传统路线 HTML、CSS、JS AjaxJQueryMySQLJDBCServletJSPEL&JSTLCookieSessionFilterServlet案例MybatisSpringSpringMVCSpringBoot 全新路线 HTM、CSS、JSAjax、AxiosVue、Element前端工程化 vue脚手架MavenSpringBoot基础 基于SpringBoot进行讲解Spring的IOC&#xff…

打造旅游卡服务新标杆:构建SOP框架与智能知识库应用

随着旅游业的蓬勃兴起,旅游卡产品正逐渐成为市场的焦点。为了进一步提升服务质量和客户体验,构建一套高效且标准化的操作流程(SOP)变得尤为重要。本文将深入探讨如何构建旅游卡的SOP框架,并介绍如何利用智能知识库技术…

Java 简单家居开关系统

1.需求: 面向对象编程实现智能家居控制系统(简单的开关) 2.实现思路 1.定义设备类:创建设备对象代表家里的设备 JD类: import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;D…

Github客户端工具github-desktop使用教程

文章目录 1.客户端工具的介绍2.客户端工具使用感受3.仓库的创建4.初步尝试5.本地文件和仓库路径5.1原理说明5.2修改文件5.3版本号的说明5.4结合码云解释5.5版本号的查找 6.分支管理6.1分支的引入6.2分支合并6.3创建测试仓库6.4创建测试分支6.5合并分支6.6合并效果查看6.7分支冲…

3D Gaussian Splatting的全面理解

1.概述 高斯展开是一种表示 3D 场景和渲染新视图的方法,在“用于实时辐射场渲染的 3D 高斯展开” 中介绍。它可以被认为是类似 NeRF 的模型的替代品,就像过去的 NeRF 一样,高斯飞溅导致了许多新的研究工作,他们选择将其用作各种用例的 3D 世界的底层表示。那么它有什么特别…

Arcgis地图实战三:自定义导航功能的实现

文章目录 1.最终效果预览2.计算两点之间的距离3.将点线画到地图上4.动态展示点线的变化5.动态画线6.动态画点 1.最终效果预览 2.计算两点之间的距离 let dis this.utilsTools.returnDisByCoorTrans(qdXYData, zdXYData, "4549")当距离小于我们在配置文件中预设置的…

【Mysql】Mysql的多表查询---多表联合查询(中)

1、外连接查询 外连接 查询分为左外连接(left outer join), 右外连接查询(right outer join) ,满外连接查询(full outer join). 注意:oracle 里面有full join &#xf…

Linux:进程状态

文章目录 前言一、初识fork1.1 fork函数的介绍1.2 fork出的子进程存在形式1.3 写时拷贝 二、进程的状态2.1 Linux内核源代码2.2 理解内核链表(重要)2.3 运行状态2.4 阻塞状态2.5 挂起状态 三、Z(zombie)状态 ,僵尸进程四、 孤儿进程总结 前言…

qml显示加载嵌入QWidget窗口

本篇博客介绍如何在qml界面里显示QWidget窗口,开发环境Qt6.5.3 qml. 视频讲解:https://edu.csdn.net/learn/40003/654001?spm=3001.4143 qml和QWidget是两套独立的开发方式,二者的窗口可以相互嵌套显示,本篇博客介绍把QWidget窗口封装为动态库,然后在QML的窗口里显示出来…

【MySQL】多表查询

5. 多表查询 5.1 多表关系 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种&#…