WCTF2018 - SGX

WCTF2018 - SGX

七月 08, 2018

刚参加了WCTF,虽然就一解,emmm,写一下吧。关于SGX那个题目,可能我这个是最不靠谱的非预期了吧。 Orz

SGX-Intel

直接放三张图吧,(找不到当时的测试数据)

思路大致是:在每次nc之后,会进入一个加密系统,并且得到加密后的flag。但是每次得到的加密flag不同。

然后开始用数据进行测试。

每次加密得到的flag,后面部分相同重复,可以猜测是空白填充位。经测试后面填充了\x00

(一堆数据的胡乱测试)

知道了秘文,开始用flag格式去测试。

可以发现,当输入fla的时候,得到的秘文前几位和flag的秘闻前几位相同。

(又是一堆测试)

可以判定是每三位加密,所以可以爆破。

扔给队友,吐出了爆破脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# encoding=utf-8

from pwn import *
from hashlib import sha256
from itertools import permutations
from random import choice
import string
import time
from math import sqrt, ceil

def get():
li = []
s = 'abcdef' + string.digits
for a in s:
for b in s:
for c in s:
li.append(str(a)+str(b)+str(c))

return li

li = get()
flag = 'flag{1d61b3a'
for i in range(5, 20):
for j in li:
print j,
r = remote("172.16.21.241", 9918)
context.log_level = 'error'
s = r.recvuntil('option:\n')
# print s
flagCipher = s.split('cipher text\n')[1].split('\nWelcome to')[0]
r.send('2')
s = r.recvuntil('plain text:\n')
# print s
r.send(flag + str(j))
s = r.recvuntil('cipher text\n')
s = r.recv(numb = 2048)
# print s, len(s)
if s[i*3:(i+1)*3] == flagCipher[i*3:(i+1)*3]:
flag += j
print '\n'
print '[+] flag is ' + flag
print '\n'
break
r.close()

后记

这个题目是我当作盲逆向来做的,也算运气好找到了(非预期)的思路,然后感觉今年HCTF可以写一道盲逆向的题目了。

预期解法是用特权选项进去调用SGX的shellcode进行明文攻击。

正在学习预期解法。

(终于又水了一篇blog)