CTFshow-PWN-Test_your_nc(pwn0-pwn4)

1、pwn0

连上,等它程序执行完你可以直接来到 shell 界面

执行命令,获取 flag

ctfshow{294ffc57-ee28-40ea-8c74-4dfeaf89d1e7}

2、pwn1

提供一个后门函数,连上即可得到flag

下载附件,拉进 ubantu ,使用命令 checksec 检查

该命令用于查看程序基本信息以及开启了哪些保护机制

checksec pwn1

可以看到是 64 位程序,并且未启用堆栈保护

关于上述参数的详细解释:

  1. Arch (体系结构): amd64-64-little 表示该程序是针对 x86-64 架构编译的,这是一种64位的CPU架构。little表示它是小端字节序的,这是x86架构的一种特征,其中最低有效字节存储在内存中的最低地址。

  2. RELRO (重定位只读): Full RELRO 表示重定位表(GOT)已被标记为只读,这意味着在程序启动时,PLT和GOT表都会在初始化后被锁定,无法进行修改,以防止一些攻击(比如GOT覆盖)。

  3. Stack (栈保护): No canary found 表示栈未启用堆栈保护(即没有发现堆栈 Canary)。栈 Canary 是一种安全机制,它在栈的关键部分插入随机值,以检测缓冲区溢出攻击。

  4. NX (不可执行栈): NX enabled 表示内存页面的执行权限已启用。这意味着程序的内存区域(如堆栈)是不可执行的,防止了攻击者通过将恶意代码注入到内存中并执行它来利用程序。

  5. PIE (位置独立执行): PIE enabled 表示程序启用了位置独立执行,这意味着它可以在内存中的任何位置加载并执行,而不受固定地址的限制,增加了对攻击的防御性。

尝试执行该文件发现权限不够,添加可执行权限

chmod +x pwn1

提示我们只需要 nc 远程的地址即可获得 flag

可以看到连接上它会自己执行 cat /ctfshow_flag 的命令

直接 nc 上,就回显 flag 了

ctfshow{a9c43ca7-cd95-43fe-ad01-007a46fe29fe}

接下来我们使用 ida64 分析下程序

找到 main 函数

使用 F5 进行反编译,得到伪代码

可以看到这里它直接执行了 system 函数,与我们前面的分析一致

3、pwn2

给你一个shell,这次需要你自己去获得flag

检查一下附件,还是 64 位程序,未开启堆栈保护

使用 ida64 分析

找到 main 函数,F5 反编译

可以看到这里 system 函数执行了 /bin/sh

什么是 /bin/sh ?

它就是一个指向 dash 的软链接(软链接可以理解为 Windows 下的快捷方式)

而 dash 是什么?

它是 Debian Almquist shell 的缩写,就是一种 shell,常用的 shell 还有 bash

简单点来说 system("/bin/sh") 执行后会返还一个 shell 给函数调用者

我们 nc 地址,连接上后,便可获得一个 shell,直接执行我们想要执行的命令

得到 flag

ctfshow{ab6cb831-7c6a-40f2-9c7e-a27ede4cc4c9}

4、pwn3

哪一个函数才能读取flag?

老规矩检查一下,是 64 位程序,但是开了堆栈保护 

拖进 ida64 ,找到 main 函数反编译

很容易可以看到情况 6 调用了系统函数,其他很多都是一些输入或者输出

双击跟进,可以看到是获取 flag 的操作

使用 nc 连接上地址

选项 6 ,即可获取到 flag

ctfshow{fa7def0a-16b9-49e7-8826-3928b2fd9a45}

5、pwn4

或许需要先得到某个神秘字符

 检查一下,是 64 位程序,保护全开 

使用 ida64 分析,对 main 函数反编译

我们对伪代码进行逐行分析:

  1. int __cdecl main(int argc, const char **argv, const char **envp): 这是 main 函数的定义,它接受三个参数,分别是程序的参数数量 argc、参数列表 argv 和环境变量 envp

  2. char s1[11];char s2[12];: 这两行声明了两个字符数组,分别是 s1s2,分别有 11 和 12 个元素。

  3. unsigned __int64 v6;: 这是一个无符号 64 位整数 v6

  4. v6 = __readfsqword(0x28u);: 这一行读取了 FS 寄存器偏移 0x28 处的值并存储到 v6 中。

  5. setvbuf(_bss_start, 0LL, 2, 0LL);setvbuf(stdin, 0LL, 2, 0LL);: 这两行调用了 setvbuf 函数,用于设置缓冲区类型。第一个调用将 _bss_start 的缓冲区类型设置为无缓冲,第二个调用将标准输入的缓冲区类型设置为无缓冲。

  6. strcpy(s1, "CTFshowPWN");: 这行将字符串 "CTFshowPWN" 复制到 s1 数组中。

  7. logo();: 这行调用了一个叫做 logo 的函数,用于打印某个东西。

  8. puts("find the secret !");: 这行打印了字符串 "find the secret !"

  9. __isoc99_scanf("%s", s2);: 这行使用 scanf 函数从标准输入读取字符串,并将其存储到 s2 数组中。

  10. if ( !strcmp(s1, s2) ) execve_func();: 这行使用 strcmp 函数比较 s1s2 是否相等,如果相等,则调用 execve_func 函数。

  11. return 0;: 最后返回 0,表示程序正常退出。

根据代码逻辑,程序的主要目的似乎是要求用户输入一个字符串,如果输入的字符串与预设的字符串相同,则调用 execve_func 函数。

关于其中某些函数的详细解释:

因为我  C 几乎忘完了,因此这里整理下

  1. setvbuf: 这个函数用于设置文件流的缓冲区类型。它允许程序员控制标准 I/O 库中文件流的缓冲方式。通常,我们可以将文件流设置为无缓冲、行缓冲或全缓冲。在这个代码中,setvbuf 函数被用于设置 _bss_start 和标准输入流 stdin 的缓冲类型为无缓冲,这意味着每次输出都会立即被写入,而不会先缓存在内存中。

  2. strcpy: 这个函数用于将一个字符串复制到另一个字符串数组中。它接受两个参数,第一个参数是目标字符串数组,第二个参数是源字符串。strcpy 会将源字符串的内容逐个字符地复制到目标字符串数组中,直到遇到源字符串的结束符 \0

  3. puts: puts 函数用于向标准输出打印字符串,并在最后自动添加一个换行符 \n。它接受一个字符串作为参数,并将其打印到标准输出流中。

  4. scanf: 这个函数用于从标准输入流中读取输入。它接受格式化字符串作为第一个参数,用于指定输入的格式,以及一系列指向变量的指针,用于存储读取到的值。在这个代码中,scanf 被用于从标准输入中读取一个字符串,并将其存储到 s2 字符数组中。

  5. strcmp: 这个函数用于比较两个字符串是否相等。它接受两个字符串作为参数,并返回一个整数值,如果两个字符串相等则返回0,否则返回它们第一个不相等字符的 ASCII 差值。在这个代码中,strcmp 用于比较 s1s2 是否相等,如果相等则返回0,程序将执行 execve_func 函数。

双击跟进 execve_func 函数

  1. unsigned __int64 execve_func(): 这个函数返回一个无符号 64 位整数。

  2. char *argv[3];: 这里声明了一个字符串指针数组 argv,长度为 3。

  3. v2 = __readfsqword(0x28u);: 这一行读取了 FS 寄存器偏移 0x28 处的值并存储到 v2 中。

  4. argv[0] = "/bin/sh";: 将字符串 "/bin/sh" 赋值给 argv 数组的第一个元素,表示要执行的命令。

  5. argv[1] = 0LL;argv[2] = 0LL;: 将 argv 数组的第二个和第三个元素设置为 NULL,表示参数列表结束。

  6. execve("/bin/sh", argv, 0LL);: 这一行调用了 execve 函数,用于执行一个程序。它接受三个参数,分别是要执行的程序路径、参数列表和环境变量列表。在这里,它执行了 /bin/sh,并传递了一个空的参数列表和环境变量列表,表示没有额外的参数和环境变量。

  7. return __readfsqword(0x28u) ^ v2;: 这里返回了一个异或操作的结果。

综合起来,这个函数的作用是执行 /bin/sh,即启动一个交互式 shell。

既然能获取 shell ,那么我们就可以执行命令,进而获取 flag

因此我们让前面的 if 判断成立,即让 s1 = s2  = CTFshowPWN

使用 nc 连接上后,输入 CTFshowPWN 将其传给 s2

s1 = s2 ,strcmp(s1, s2) 返回 0,!0 即为 1,if(1),则会调用后面的 execve_func() 函数

我们尝试执行命令,成功

直接 cat ctfshow_flag

拿到 flag

ctfshow{203c8829-a5f7-4962-89a0-8a5907838d16}

 

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

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

相关文章

深度学习基础——计算量、参数量和推理时间

深度学习基础——计算量、参数量和推理时间 在深度学习中,计算量、参数量和推理时间是评估模型性能和效率的重要指标。本文将介绍这三个指标的定义、计算方法以及如何使用Python进行实现和可视化展示,以帮助读者更好地理解和评估深度学习模型。 1. 定义…

oracle 19c数据库W00n进程使用很多PGA内存资源的分析

今天,客户反馈测试环境的数据库PGA资源不足,报错ORA-04036: 实例使用的 PGA 内存超出 PGA_AGGREGATE_LIMIT;分析是多个W00n进程使用大量PGA-触发了BUG,对应解决办法就是打补丁。(民间办法就是KILL进程、重启数据库&…

【JavaSE】搞定String类

前言 本篇会细致讲解String类的常见用法,让小伙伴们搞定String类~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 前言 常用的三种字符串构造 字符串长度length 字符串比较 比较 比较字符串的内容equals…

一个不努力学习的人是怎么过的软考高项?

首先要感谢软考方式的改革,如果不是机考,我可能也过不了,因为自己的笔迹实在太糟糕了。其实如果不是因为笔迹太差,我觉得我19年高项就过了,19年栽倒在论文上,只得了43分,我记忆深刻。 然后说一…

【算法】深入理解二分查找算法及其应用

文章目录 1. 朴素二分查找的基本步骤:2. 总结二分模板 二分查找(Binary Search)是一种在有序数组中查找目标值的高效算法。它的基本思想是将数组分成两半,然后确定目标值可能存在的那一半,重复这个过程直到找到目标值或…

如何进行支付功能的测试?

非现金支付时代&#xff0c;非现金支付已经成为了生活不可或缺的一部分&#xff0c;我们只需要一台手机便可走遍全国各地&#xff08;前提是支付宝&#xff0c;微信有钱<00>&#xff09;。 那么作为测试人员&#xff0c;支付测试也是非常重要的一环&#xff0c;那么下面…

隐私保护?还是安全漏洞?邮箱分身双重身份及创建攻略解析!

很多人只知道微信、QQ等应用分身&#xff0c;对于邮箱分身并不是很了解。邮箱分身和他们的不同点在于我们直接在原有邮箱的基础上创立新的虚拟邮箱地址&#xff0c;并且密码一致&#xff0c;在我们需要运营多个社交媒体账号或者管理多个项目的情况下&#xff0c;邮箱分身是一个…

IntelliJ IDEA2024 安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 IDEA&#xff08;Integrated Development Environment for Apache&#xff09; 是一款专为 Apache 开发者设计的集成开发环境。该软件提供了丰富的功能和工具&#xff0c;帮助开发者更高效地创建、调试和部署 Apache 项目。 主…

MobaXterm无法登陆oracle cloud的问题

问题 我在oracle cloud上创建实例的时候&#xff0c;只能使用密钥的方式登陆&#xff0c;当时下载了私钥文件。实例创建好以后&#xff0c;在mobaxterm上使用这个私钥文件无法登陆 排查 尝试使用mobaxterm的keygen&#xff0c;把私钥文件转成ppk格式&#xff0c;还是不行。…

【论文阅读02】一种基于双通道的水下图像增强卷积神经网络

来源&#xff1a;海洋论坛▏一种基于双通道的水下图像增强卷积神经网络 当前不会的 一、背景&#xff1a; 水下图像增强方法包含有无水下成像模型的水下图像增强方法、基于水下成像模型的水下图像恢复方法、水下成像模型与深度学习相结合的方法以及完全采用深度学习的方…

STM32H7的8个串口fifo收发(兼容232和485)

STM32H7的8个串口fifo收发&#xff08;兼容232和485&#xff09; 串口硬件串口时序串口高级特性同步和异步的区别单工、半双工、全双工的区别 STM32H78个串口fifo驱动定义数据结构uart_fifo.huart驱动包括中断配置等 应用示例RS485深入理解 仅供学习。 USART 的全称是 Universa…

springcloud 整合swagger文档教程

我用的是nacos和gateway 我的模块 父依赖没什么太大关系如果出现版本冲突问题可用参考我的依赖版本 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org…

试试流量回放,不用再写烦人的自动化测试case了

接触过接口自动化测试的同学都知道&#xff0c;我们一般要基于某种自动化测试框架&#xff0c;编写自动化case&#xff0c;编写自动化case的依据来源于接口文档&#xff0c;对照接口文档里面的请求参数进行人工添加接口自动化case 其实&#xff0c;对于日常新的服务端需求的迭…

Vue3(二):报错调试,vue3响应式原理、computed和watch,ref,props,接口

一、准备工作调试 跟着张天禹老师看前几集的时候可能会遇到如下问题&#xff1a; 1.下载插件&#xff1a;Vue Language Features (Volar)或者直接下载vue-offical 2.npm run serve时运行时出现错误&#xff1a;Error: vitejs/plugin-vue requires vue (&#xff1e;3.2.13) …

Python 入门指南(五)

原文&#xff1a;zh.annas-archive.org/md5/97bc15629f1b51a0671040c56db61b92 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十六章&#xff1a;Python 中的对象 因此&#xff0c;我们现在手头上有一个设计&#xff0c;并且准备将该设计转化为一个可工作的程序&a…

解决npm run dev跑项目,发现node版本不匹配,怎么跑起来?【已解决】

首先问题点就是我们npm run dev 运行项目的时候发现出错&#xff0c;跑不起来&#xff0c;类型下面这种 这里的出错的原因在于我们的node版本跟项目的版本不匹配 解决办法 我这里的问题是我的版本是node14的&#xff0c;然后项目需要node20的&#xff0c;执行下面的就可以正…

JavaScript事件监听测试代码

效果图 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>信息填写页面</title><link …

Linux 内核学习(2) --- regulator 框架

目录 Regulator 介绍Regulator provider 注册struct regulator_descstruct regualtor_configDTS 配置和解析On BoardConfig 配置regulator_ops总结 Regulator Consumer 使用struct regulator 获取regulator 操作使用Multi Regulator 参考博客 Regulator 介绍 Regulator 指的是…

黄金价格上涨对白银的影响是什么?

在金融市场上&#xff0c;黄金与白银通常被视为避险资产&#xff0c;它们的价格走势往往受到多种因素的影响。近期&#xff0c;随着全球经济的波动加剧&#xff0c;黄金价格出现了上涨趋势。这自然会对与之紧密相关的白银市场产生影响。具体来说&#xff0c;黄金价格上涨通常会…

华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具

文章目录 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具1. 介绍2. 下载3. 静音模式、平衡模式、增强模式配置4. 配置电源方案与模式切换绑定5. 启动Ghelper控制面板6. 目前支持的设备型号 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理…