本题赛后与空白共同完成
上手先imageinfo
然后看看进程
其中有几个有点可疑
VBoxTray.exe:类似vmtool
ClipboardMonitor:剪切板监控软件
mstsc.exe:远程桌面连接
于是可以先看看剪切板
得到一个公钥,先放着
-----BEGIN PUBLIC KEY-----
MFowDQYJKoZIhvcNAQEBBQADSQAwRgJBAIEZTxxle7+5rywC5byIuBkPhwkyv57R
756DUCD9i2MWYyUs0Acc6JZwyqVOmR74uMvreI2slle4Gy7Hl6PcXxECAQI=
-----END PUBLIC KEY-----
再看看截屏
volatility -f CharlieBrown-PC.elf --profile=Win7SP1x64 screenshot -D ./file/
可以看出窗口上一个地址,结合题目描述,这可能是与研发服务器之间的远程连接,netscan也证实了这一点
于是想到去找一找bmc文件看看能不能提取一些线索,结果找到是找到了,但是不能从里面提取出来东西
于是dump下mstsc.exe的内存,将其后缀改为data并用gimp打开,找个常见分辨率1280x720就开始调位移,结果看到这样一幅图
说是找的东西不在内存里,emmm不好说
接下来看看hint,第一条hint给了一张图片,似乎是vbox显示器和显卡的一些配置
?显卡?!显存!
根据hint3可以使用volatility的vboxinfo插件找到该内存中显存的位置
于是可以找到显存在内存文件中的偏移0xdffcda2c=3757890092以及大小0x2000000=33554432,用dd命令提取一下
dd if=CharlieBrown-PC.elf of=vram skip=3757890092 bs=1 count=33554432
这样得到的就是显存,显存里面的则是图像数据,结合hint所给的1440x900的分辨率以及32的位深度,写个脚本还原下原图
from PIL import Image
width = 1440
height = 900
flag = open('vram','rb').read()
def makeSourceImg():
img = Image.new('RGBA', (width, height))
x = 0
for i in range(height):
for j in range(width):
img.putpixel((j, i), (flag[x], flag[x + 1], flag[x + 2],flag[x+3]))
x += 4
return img
img = makeSourceImg()
img.save('1.png')
哈哈成功了
这下就知道了flag的加密算法,使用上面的公钥解密就好了
c:451471540081589674653974518512438308733093273213393434162105049845933212224386755831134427109878720380821421287108607669893882611307516611482749725279433
e:2
n:6761456110411637567688581808417563265129495172728559363264959694161676396727177452588827048488546653264235848263182009106217734439508352645687684489830161
得到pq
p:79346858353882639199177956883793426898254263343390015030885061293456810296567
q:85213910804835068776008762162103815863113854646656693711835550035527059235383
解密
import gmpy2
def rabin_decrypt(c, p, q, e=2):
n = p * q
mp = pow(c, (p + 1) // 4, p)
mq = pow(c, (q + 1) // 4, q)
yp = gmpy2.invert(p, q)
yq = gmpy2.invert(q, p)
r = (yp * p * mq + yq * q * mp) % n
rr = n - r
s = (yp * p * mq - yq * q * mp) % n
ss = n - s
return (r, rr, s, ss)
c = 451471540081589674653974518512438308733093273213393434162105049845933212224386755831134427109878720380821421287108607669893882611307516611482749725279433
p = 79346858353882639199177956883793426898254263343390015030885061293456810296567
q = 85213910804835068776008762162103815863113854646656693711835550035527059235383
m = rabin_decrypt(c,p,q)
for i in range(4):
try:
print(bytes.fromhex(hex(m[i])[2:]))
except:
pass
DASCTF{It5_dIr3c7Ly_c0rR3l4T3d_t0_7He_d1M35}