MISC:SPY_DOG
题目的逻辑是
提供狗的图片,需要处理图片,根据已知模型生成可以欺骗该模型,识别为猫的图片,这是一个对抗神经网络的白盒攻击任务。
另外附带要求,生成伪造图片需要保证预测为cat的分值大于0.99,像素差值小于10。
这里介绍的是通过梯度下降的方式生成样本进行迭代,使用的是keras库。
通过模型可视化输出查看:
输入层(Input):输入为1281283大小图像矩阵。
卷积层(Conv1):32个126*126大小的卷积核。
Pooling层(Pool1):Max Pooling窗口大小为2×2。
卷积层(Conv2):32个63*63大小的卷积核。
Pooling层(Pool2):Max Pooling窗口大小为2×2。
卷积层(Conv3):64个30*30大小的卷积核。
Pooling层(Pool2):Max Pooling窗口大小为2×2。
flatten层:一维化展开。
FC层(dense):将展开的25088的map整合成512的map
输出层\FC层(dense_1)(output):将512的map整合成2的map,即输出2个分类。
我们了解到这是一个4层的卷积神经网络模型,我们需要关注的是输入层和输出层,输入层是一个对1281283(长、宽、颜色通道)的图像处理层,输出层为输出2个神经节点(即是否为猫):

。。。
1 | from operator import mod |
将图片base64传上即可:
RE:CICADA
SMC的题,dicada.exe会解密一个PE文件,验证逻辑在这个PE文件中,分析处理逻辑,流程是输入32字节key经过一个很长处理后,根据返回值是否为true来判断我们的输入是否正确,目前使用angr跑了出来.

angr脚本:
1 | # coding=utf-8 |

IoT
参考:
http://www.ctfiot.com/37681.htmlhttp://www.ctfiot.com/37681.html
http://www.ctfiot.com/38677.htmlhttp://www.ctfiot.com/38677.html
查看文件,PNF-9010R.img镜像文件被加密,我们需要分析S34MLxx固件获取密钥及加密逻辑。
Nand Flash
NandFlash有特定的存储结构,可分为plane,block以及page。以Spansion S34ML0*为例,其由2快plane组成,每块plane由1024 block组成,每块block由64 page组成,每page有(2048 + 128)=2176字节。其中128字节为OOB区,用作校验和坏块管理,具体管理方式可参考该flash的datasheet。
内部ECC对于主要区域的每528字节(x8)和备用区域的每16字节(x8)提供了9位检测码和8位校正码。[…] 在PROGRAM操作过程中,在页面被写入NAND Flash阵列之前,设备会在缓存寄存器中的2k页面上计算ECC代码。ECC代码被存储在页面的备用区域。 在读操作中,页面数据从阵列中被读到缓存寄存器中,在那里ECC代码被计算出来,并与从阵列中读取的ECC代码值进行比较。如果检测出1-8位的错误,将通过高速缓存寄存器进行纠正。只有经过纠正的数据,才会在I/O总线上输出。
通过编程器提取该flash固件,可得文件大小285,212,672字节=0x11000000字节=2(plane)*(1024block)*64(page)*2176(byte),恰好符合datasheet描述。但需要注意的是,此时binwalk并不能有效识别该固件的组成及提取其中的文件系统。这是由于坏块以及OOB的存在,因此固件分析的第一步是筛选坏块并去除OOB区.
坏块筛选规则:the 1st byte in the spare area of the 1st or 2nd or last page does not contain FFh is a Bad block.
OOB去除,可去除每隔2048字节的128字节校验值。
然而,经过上述操作后,binwalk仍不能正确提取识别。
初次经过人工分析,所有全0字节内存页中,有如下现象:页起始偏移1040字节的14字节有数据;OOB区的前两字节为FF,后14字节数据为全0。不经让人怀疑是上下两部分的数据区和校验区发生了调换。而事实也却是如此,具体需要了解yaffs2在(2k+128) NandFlash的存储结构以及uboot烧写的yaffs过程[1 2 3]。
NAND闪存是以内存页为单位进行编程和读取的。一个内存页由2048字节的可用存储空间和128字节的OOB组成,后者用于存储纠错代码和坏块管理的标志,也就是说,页面的总长度为2176字节。不过,对于擦除操作来说,则是以块为单位进行的。根据Micron公司的文档,对于这个闪存部分,一个块由64页组成,总共有128KB的可用数据。该闪存由两个面组成,每个面包含1024个块,因此: 2 planes * 1024 blocks/plane * 64 pages/block * (2048 + 128) bytes/page = 285,212,672
尝试每隔2048字节移除128字节,发现得到的固件文件仍然无法正常提取,分析发现oob的3-16字节是有用的:
另外,发现每个page偏倚0x410处存在14字节无意义
oob的格式与datasheet上介绍的不同。
删除修正后的oob:
1 | import re |
再次使用binwalk尝试提取,发现分离出的ext2可以正常读取了:
搜索特征字符串获取到解密逻辑(ext2文件系统中得到的magic_update中的加密是针对另一型号设备的,后来发现针对题目给的镜像文件所属型号的加密是在固件中的单独提取的mainServer ELF文件中):
openssl enc -in PNF-9010R.img -aes-256-cbc -d -k STWPNF-9010R -out PNF-9010R-dec.img
对解密后的img解压即可看到flag。