内存DUMP数据的一些尝试

近期某大学在公告版中发送了查询学生考场的EXE文件,一开始我以为是钓鱼的,后来经多方确认属实。

经过断网确认后可知,数据打包在应用内部。
首先尝试了binwalk/foremost无过,只分离出一些bmp文件
拖进IDA,找到动态链接库但是显示unknowlib,静态数据中也没有相关信息。
这里可以采用的方式有两个
1. IDA动态调试
2. DUMP内存

这里使用的是第二种方法,DUMP内存有多种方法,可以采用VS的DEBUG工具进行内存DUMP,但是我们借助任务管理器简单创建完整的转储文件。

Task Manager->Processes->Right Click->Create dump file


通过WinHex查看转储文件,存在相应的明文数据
数据头为
“`… … 49 00 43 00 4F 00 4E 00“`


数据尾为
“`06 00 00 00“`


写脚本提取后分隔导出为csv文件即可
下面为Payload

with open('memory.dmp', 'rb') as f:
    data = f.read()
head=data.find(b'M\x00A\x00I\x00N\x00I\x00C\x00O\x00N\x00')
data=data[head+16:]
tail=data.find(b'\x06\x00\x00\x00')
data=data[:tail]
data=data.split(b'\x0d\x0a')
with open('memory.csv', 'w') as f:
    for item in data:
        item=item.decode('gbk')
        f.write(item.replace('@',',')+'\n')

原本为了保护学生隐私的设计反而最终成为了泄露隐私的地方。
这里的信息还包括身份证后三位,也就是说我们可以通过户籍地+生日反推出最后一位。
具体有如下解决方法:
不存储明文,只存储加盐后的学号+姓名+身份证后三位的哈希/md5信息再查询,最后的是为什么不能在线查呢?很急。

PS1:后缀改成txt可以直接读出数据
PS2:用Notepad++以GB2312读写可以直接读出所有数据

【MISC】Wordle

TQLCTF-Wordle题目出自当下火热的填字游戏
填字游戏的规则为输入五个字母,然后分别返回五个颜色

  • 绿色:位置和字母均正确
  • 黄色:字母正确位置不正确
  • 灰色:字母和位置均不正确

我们的任务就是用最少的次数,把答案找出来
在该题目中,颜色可以通过字节流分辨出来。在这之前,我在B站大学看到过一个讲述相关技术的视频,于是我就翻了下。
利用信息论解决Wordle问题
理论存在,实践开始
于是,又写了一个10K的代码,发现自己的代码只能做到平均4.3左右。
好废物啊我
于是上Github找轮子Wordle-solver
这个开源项目能做到平均3.4,然后就有了如下10K代码

继续阅读【MISC】Wordle

【MISC】BASE系列加密解析

见到了一题比较离谱的base64题目,VNCTF2022-Web-gocalc0,可能是我太菜的原因,明明hint告诉我,flag在session里面,我却怎样都Base64出不来,一直说解密出错。
这题对于Web没有一点难度,姑且放在MISC分类里面。

Base16

使用字符:数字(0 ~ 9),字母(A ~ F)
Base16先获取输入字符串每个字节的二进制值(不足8bit在高位补0),然后将其串联进来,再按照4bit一组进行切分(2^4=16),将每组二进制数分别转换成十进制,并对应下述编码。
即二进制转十六进制,对应下表

编码 编码 编码 编码
0 0 4 4 8 8 12 C
1 1 5 5 9 9 13 D
2 2 6 6 10 A 14 E
3 3 7 7 11 B 15 F

继续阅读【MISC】BASE系列加密解析

【MISC】图片点阵提取

在打VNCTF2022的时候遇到这样一道题,图片直接放在文章肯能看不清,各位可以点开来仔细观看

放大来看

又是点阵图,这不就是妥妥的点阵提取嘛,打开画图,量出来点之间的距离,然后开造!
结果,出来很意外,每个点之间的距离都是不一样的,都在49~51之间浮动,这就导致直接提取不能提取出有效的信息
好在,每一行每一列的点都在同一条直线上,只要求出最左上角的点,然后跑出每一行每一列的坐标,再拼接即可
拼接的话可以使用OpenCV库,但是Python的PIL(Pillow)好像更胜一筹,于是学了一下写了个脚本

from PIL import Image,ImageDraw
image = Image.open("misc-img-pixel-1.png")
Line=[]
Row=[]
black=image.getpixel((0,0))
for i in range(image.height-1):
    if(image.getpixel((24,i))!=black):
        Row.append(i)
for i in range(image.width-1):
    if(image.getpixel((i,15))!=black):
        Line.append(i)
ret = Image.new('RGB', (len(Line), len(Row)) )
draw = ImageDraw.Draw(ret)
for x in range(len(Line)-1):
    for y in range(len(Row)-1):
        draw.point((x, y), fill=image.getpixel((Line[x],Row[y]))) 
ret.show()
ret.save('result.png')

继续阅读【MISC】图片点阵提取

【MISC】ZIP压缩文件汇总

MISC题目中,ZIP压缩包一般会有五种破解方式

  1. 暴力
  2. 字典
  3. 明文
  4. 冗余数据
  5. 伪加密

一般来说我们可以使用ARCHPR来帮助我们破解ZIP
在得到一个压缩包的时候,我们应该先阅读属性内容,里面能给你一些解题提示
这个就提示我们要六位暴力

以下就是提示我们可能存在冗余数据

其次,我们还可能存在字典,当然啦,我们要有对应的字典才行

在打开压缩包的时候,我们可以留意一下内外压缩包的文件时候有CRC校验码相同的,如果有我们可以尝试明文破解口令。
但是我们也可以不破解口令,直接通过密钥解密文件

在处理冗余数据时,我们可以采用binwalk判断冗余数据,并且binwalk -e提取,有时候不行的话还是自己动手吧

以上四种都很好理解,伪加密我们要使用WinHex打开,修改加密位完成

继续阅读【MISC】ZIP压缩文件汇总