强网杯2021 misc 复现

对强网杯BlueTeaming、ISO1995、CipherMan、Threebody的复现
(纯萌新学步)
可以参考mumuzi大佬的wp
https://blog.csdn.net/qq_42880719/article/details/117968361

BlueTeaming

审题

Powershell scripts were executed by malicious programs. What is the registry key that contained the power shellscript content?
Powershell脚本由恶意程序执行。包含power shell脚本内容的注册表项是什么?

注册表项

注册表编辑器”窗口的左边窗格中显示的文件夹就叫注册表项。注册表项包含其当中的子表项和值条目。简单来说,注册表项相当于注册表里的文件夹
在这里插入图片描述

解压得到一个无后缀的文件,分析文件头为7z,添加文件尾解压
得到一个memory.dmp文件,判断得到是内存镜像文件

对镜像进行分析,得到
在这里插入图片描述
使用pslist指令探测进程,发现cmd.exe的异常程序,但再看看
在这里插入图片描述
使用cmdline确认一下
在这里插入图片描述
但根据推测,他应该没什么问题
所以对cmd进行追踪,用memdump提取
得到一个7092.dmp文件,用010打开,搜索powershell,发现有2k+个结果,猜测有参数,所有搜索powershell -
在这里插入图片描述

得到flag
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Communication

ISO1995

审题

We follow ISO1995. ISO1995 has many problems though. One known problem is a time.
我们遵循ISO1995。虽然ISO1995有很多问题。一个已知的问题是时间。

得到一个镜像文件,加上iso后缀,用ultraiso打开得到
在这里插入图片描述
将这些flag_f 0-1024保存下来,然后对文件flag的部分进行定位
在这里插入图片描述

发现FFFFFFFFF后面的两个字节是不一样的,但是其他都是一样的,所以写脚本提取后两位在这里插入图片描述
提取完成后

f = open("iso1995.iso",'rb').read()
f1 = open("flag",'wb')

def find_a(a,b):
    l1 = []
    length = len(a)
    index = 0
    while index < length:
        i = a.find(b, index)        
        if i == -1:
            print(l1)
            return l1
        l1.append(i)       
        index = i + 1       
    return l1

s = find_a(f,b'\xff\xff\xff\xff')
for i in s:
    f1.write(f[i+4:i+6])


提取完成后,将16进制转换成十进制

s = [""]*1024
f = "000000AA035702C50023026802F202DB03E501E5010102A80236026703F2009E002A00E0039801B0028A006D03D1019D01CB031B031902A0025900A1022D030500510231003C02C702E301990235037E0185012E007400A2006C021602FC01B401AA026902CE00FD00B601D3004903BC02F000F2016503A4032501EE03B403DE02DE03F80147024F033C0263001C03F4009702EC0091000C00BF0168023301A4038C024E024D03C50086037C001202C101110126036801C7000702F3007000BB0304036B02D3004103AF0130017C003403970061008102A301A80092012A002C01350323028E00F902D7010901A702F8032701EF000F03C8020E014A02600344034300C4022C0099026D008A030103F10273031F009D00F501FA010D037A036101E10307021502E201B70225031000350243028602D8010803EF01F5030A03390170010701770100005C021C01690063010203E1039C00DA037D01BC014002A5034900D8033A00C1004403CF029101FF03D802390338030B010602B303FB03F0007701CD025600EC004C03EB000101620266035B0298000A02CC0248011500A8034D025401D703E9035A02270065016B03AC03830039019503EA030D03AE02820078001501B8011D018600F600180148038E00F4013701F0012203CD011E027201CE01F103B8022B02AE00BE03850133033E020C021003A901BD00ED033403300214008F014B00D700040265014301A901800178034C0062030201BE02F5036600AD02AD016403330142036E03E00345018A00E300A300FB028F03BF022F02DC039E03D90314006803B600A602D202220103004D03F9008B01F6018E03E3030000C002AA01A10139019F0360025B01BA027600F0038D001F0006028C013203D6020B0198018802A1023801E6007C035D0064009F024A00D001BB005E02BD019A019300F803A30362019E00D4026E03EE0352015F023201FB03C002BA03BE02EB01C103900129039900CC02AC02BB02A9003800E400E1009C020A03200396020701F90192034E02B501F8032803CB024200B7038100B803E7012F019C031C03F50230023C0113006F00AE01DE0071029601F702A2004A01280110005F024701C4034B03E603ED0318008C015A03BA03F600AB0079028100AF00EA01A20127011C0056018F02BF0002018303A100CF013D029A031E02710138021903640261007601AB03E800A501EB03DD01A300600096017B007E01B3035403E2012B017103FC000901C901FC021E00B9032E02E4026C008502D902DF027A01AC03CE00E200670365038401DC01F40212012000CD0221021B01DA0209013E031D005B0378016C007300CA0255008D00C20082009A0224001B001303750347027801D603D000EF037103EC002F03A002B103FA002501D8004F01B102C3029F030902A4028B009302BC00D5028801B600FF011403F3030E021F002100D6018D036F032103530029015B034603D7034F0043017303DB01600292039203370030017F02F70124003E02F601AF010E039D0246028701B9021A010C0394025000F303A20000011603AD0377011A02EF02CA0153031201E8034A0311022902AF03A50359036D01A6023B021D00FA02D0033500BD025F0326037F03A801EA011B029E03CC0201038A016A03800037013F0080029B01CA025302E90088037001C802F103B30205003A031701AD0125018701970237014E025E036A011F020F00A9014C008E030C032B005201410355029702950275013A0350015702AB03FF00F7009800DD015E038701E4008700550159013C0105019B01D1019402CF004502B000C60022026F01E001DD033B03FD01D20154005D03890024039F01DF028D03BB024500110003002700C702BE004700C902B601B5009B006E03C3016E00B5025D005900160008002D0066007A037B01BF030802ED035C02CD00E500C5020802FB028001CF025A03DA018B017A02B801040190003D03BD0089020403910289014F027401C303220151019602C203D203F7029401D900BA015803FE03B103B501ED014D0136023A004203740315039500E9034200DE00D101B203400020004E015C013B00AC036302D40223002600DB017E0123006B02DD02FF029900F100840217001400900176020602B4023E0372032F023D01C002E60220007202FE03C901D00053032901C6033D027C03B903690028005002DA00D901E9001A02CB017202E80356019102EE009501C20094007F025101840144024B03B0012102030264022E034802FD03730249003602C8027B0226016D03C700170040038602620270025202E50234010F03C4010B0150029302B9016F038203AB018902B7039B014601F2030F00CB005400C801DB035E03880083001D007B00FE0181010A003301E203C103E402FA01630358006900E702E0017D00EE02900166027E003B02F400D30341027901790228015202B2036C0119033603AA0174029D011703A7023F02D6021801FD0134001902C0000D0161032D001001490167002E004B020003C6004600B3005A01D5020203130131012C033200B2021301A502EA026A02D5000E007D03B202C900EB003103D500B401E700BC039A01550367032A0156030302850351025802D100A7027F011201EC031602C6002B00A00284004800CE01E3024100B0025C02A601CC030602C400B1024002E703DF029C033100DF00750005006A03B7003F00D201F3026B032C00FC005801D40393032401AE038F018C01FE03C20182015D00E6020D0175012D003203CA02E1038B03D4027702F9025702A7031A00A403DC01C5024C021100C30244001E022A0283027D035F00DC03A60379033F037600E80118014503D30057000B"
for i in range(1024):
    s[i] = int(f[i*4:i*4+4],16)

最后将他们进行重命名,按顺序重命名就行

import os
path = 'D:\\misc01-wym\\qwb\\ISO1995\\yiya'
num= 0
for file in os.listdir(path):
    os.rename(os.path.join(path,file),os.path.join(path,str(num)))
    num+=1

然后对重命名完的文件进行排序拼接,按照上上文中的s的顺序,

f = open("flag1",'wb')
for j in s:
    f1 = open("D:\\misc01-wym\\qwb\\ISO1995\\yiya\\"+str(j),"rb").read()
    f.write(f1)
print("done")

最后得到flag

FLAG{Dir3ct0ry_jYa_n41}

CipherMan

第一步审题:

The attacker maliciously accessed the user’s PC and encrypted specific volumes. How to decrypt the volume?
攻击者恶意访问用户的PC并加密特定卷。如何解密卷?

解压得到一个无后缀文件,用010分析文件头为7z,添加7z解压得到一个memory和一个secret文件
给memory文件添加vmem,用volatility打开
先判断镜像的属性
在这里插入图片描述
搜索桌面,发现有bitlocker的恢复密码标识
在这里插入图片描述

将他dump出来
在这里插入图片描述
拖进010发现
在这里插入图片描述

找了一万个工具,最后使用OSFMount,挂载之后,点击更多选项,解密成功
在这里插入图片描述
在这里插入图片描述
得到flag

Threebody

审题

  1. 所有出现图片的内容都是有意义的 1. 不要埋头做,根据已有信息合理使用搜索引擎

首先解压得到一个图片,使用stegsolve发现在这里插入图片描述
没有什么头绪,回到原图放大,发现像素点排序很有规律
在这里插入图片描述
用010查看像素点值
在这里插入图片描述
一般来说,正常的图片像素点之间差值都是很小的,发现以3为周期之间差值很大,但是以4为周期的话差距就很小,所以考虑将这个图片进行升维处理
在这里插入图片描述
在图片前面有个bibitcount,这个是每个像素所站的字节数,现在为24,即3个字节,将24改成32,再重新打开图片,发现了新图片
在这里插入图片描述
再将图片用stegsolve打开观察,发现一个老头
在这里插入图片描述
仔细观察图片发现右上角有一串白点,代表里面存着信息
用data extra查看其中信息,先按照行来查看
在这里插入图片描述
发现who am i?在按照列来查看
在这里插入图片描述
得到以上信息,一个老头叫David,通过一番查询得到,这是一个著名的数学家,大卫希尔伯特
然后就没有了思路,再回过去看图片的010
在这里插入图片描述
发现多了一个通道,并且这个通道的值跟blue通道值很接近,所以尝试将reserved通道值复制给blue

with open('threebody.bmp', 'rb') as f:
    d = f.read()

w = 580
h = 435
b = 4
l = bytearray(d)
off = l[10]
for i in range(h):
    for j in range(w):
        l[off+j*b+i*b*w] = l[off+j*b+i*b*w+3]

with open('threebody_new.bmp', 'wb') as f:
    f.write(l)

然后再用stegslove查看,得到一张新的图片
在这里插入图片描述
看到这张图片一般就是二维数组了,所以考虑将图片按照01序列保存,带没有什么结果,并且如果是逐行保存的话不应该出现左上角的区域与其他区域密度明显不同的情况。

前面的三体和大卫联合搜索一下,会发现一个网址

https://mp.weixin.qq.com/s/IOSGOJnGyiGoD8J1ITQJlg
希尔伯特曲线
这是一种将高维进行降维处理的一种方法,所以在这里可以将二维的二进制数组转成一维的二进制流。

因为这里我们得到的是128128的矩阵,128=2*7,所以我们应该使用7维的希尔伯特矩阵。

我们可以使用脚本把二维的01矩阵降维成一维的二进制流,便可以得到隐藏的文件。在写脚本时用到了https://github.com/galtay/hilbertcurve 这个库,实现的代码为:

import numpy as np
from PIL import Image
from hilbertcurve.hilbertcurve import HilbertCurve

with Image.open('threebody_new.bmp') as img:
    arr = np.asarray(img)
arr = np.vectorize(lambda x: x&1)(arr[:,:,2])

for x1 in range(np.size(arr,0)):
    if sum(arr[x1])>0:
        break
for x2 in reversed(range(np.size(arr,0))):
    if sum(arr[x2])>0:
        break
for y1 in range(np.size(arr,1)):
    if sum(arr[:,y1])>0:
        break
for y2 in reversed(range(np.size(arr,1))):
    if sum(arr[:,y2])>0:
        break

arr = arr[x1:x2+1, y1:y2+1]

hilbert_curve = HilbertCurve(7, 2)

s = ''
for i in range(np.size(arr)):
    [x,y] = hilbert_curve.point_from_distance(i)
    s += str(arr[127-y][x])

with open('output', 'wb') as f:
    f.write(int(s,2).to_bytes(2048, 'big'))

然后010发现最后的output是一个c语言文件,将文件编译运行后,发现有个小瑕疵,在molloc前加上(char*)成功运行,得到输出为代码本身
在这里插入图片描述
将输出复制下来以后,仔细观察两者不同,发现源代码的11段后面全是大量的空格和tab
在这里插入图片描述

在一番尝试之后,发现tab对应0,空格对应1,将其转化成二进制

01100110011011000110000101100111011110110100010000110001011011010100010101101110001101010110100100110000011011100100000101101100010111110101000001110010001100000011011000110001011001010110110101111101

再将二进制转化成字符串得到flag

flag{D1mEn5i0nAl_Pr061em}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值