re1
32位PE文件,加了upx壳,先脱壳,随便一个工具就可以
脱完壳扔IDA,
逻辑其实很简单就是输入一串字符串,经过sub_401000
这个函数处理之后,结果跟”DDCTF{reverseME}”进行比较
那么主要就是分析这个函数了,
虽然看起来干干净净,但是会发现有几个地方,v1定义了之后 直接用了,并没有任何的赋值,静态是看不出个所以然来的,所以我选择OD一波
这就是加密函数的汇编0x402FF8
对应的就是数组 byte_402FF8
,在IDA里可以看到,其实就是ASCII码表上的所以有值,
从0x20到0x7e就是可见字符,这个函数里面最核心的就是这句汇编mov dl byte ptr ds:[eax+0x402FF8]
,它就是通过你输入的字符,倒着来找,其实就是把0x20~0x7e倒一下然后一一对应就没了(所以就很类似异或),把DDCTF{reverseME},扔进去再倒一下就能得到正确的输入了
re2
这也是一道 32位PE逆向,加了aspack壳,也找个脱壳工具一脱就行,不过有个问题就是,脱完壳不能运行了,不过逻辑是没有错的,所以要动态调的话就用没脱壳的就行
汇编直接逆
先说一说头铁的做法,直接OD跟踪写出加密过程,再根据加密过程写去解密脚本,粗略地,的IDA上可以看到第一步检测和第一步加密
检测输入,长度为偶数,只能是[0,9]和[‘A’,’B’] (其实就是限制只能输入16进制数)
第一步加密,这里的加密逻辑还是可以从IDA里看出来的,(说白了就是将输入的字符转成16进制数,两个字符是一个16进制 嘛 )但是接下来的加密看起来就会有点懵(但是它就只是个base64加密,后面再讲),所以就去OD跟一下看看情况喽
因为用的是未脱壳的程序,在pushad后,下ESP硬件断点,F9运行至popad后
单步到程序的真正入口,就可以搜索到程序的字符,下断,F9过去
单步进去加密函数,接下来就是单步看汇编,整出来的结果就是
1 | a = x>>2; |
最后将a,b,c,d拼在一起就是结果 ,出来跟’DDCTF{reverse+}’比较,逆回去其实很简单,就是已知a,b,c,d求,x,y,z,reverse+共8位,所以两次爆破就可以了
1 | for(int x=0;x<=256;x++){ |
base64
其实这题的正解应该是base64,这也是常规的base64加密,只不过不是以输入字符去加密,而是直接输入16进制,也就是可以加密所有包括不可见字符,第一步转成16进制数就不用再说了,第二步的就是base64编码
所以我们只需要实现一个base64解码,以16进制形式输出就行了
1 |
|
转成大写字母就是flag了