iscc_obfuscation and encode

iscc_obfuscation and encode

没事做了一道iscc的逆向题,题目还是有点意思的。首先ida反汇编。
这里写图片描述
发现有两个关键的函数fencode()和encode(),输入的字符串通过这两个函数,最后转换成s1与字符串”lUFBuT7hADvItXEGn7KgTEjqw8U5VQUq”进行比较。先进入到fencode()里看一看。
这里写图片描述
打开之后惊了,数了一下大概11层循环嵌套,也许这就是代码混淆吧,我还是自己分析了一下这个代码的逻辑,边上课边看代码效率不是太高,花了大概 一个小时才把逻辑理顺,先找到关键的语句,大部分的跳转语句可以先不理会。
第一处
这里写图片描述
第二处
这里写图片描述
可以发现它将我们的输入和m数组进行分组相乘得到v10,再将v10%127得到的新的字符。只要耐心分析这段代码,其实实际上的代码逻辑就只有几行。以下我用for循环进行了还原。

t=0
len=len(a1)
if(len==24){
    for(int i=0;i<6;i++)
            for(int j=0;j<4;j++){
                for(int k=0;k<4;k++)
                        v10+=*(a+4*i+k) * *(m+4*j+k)
        a2+(t++)=v10%127 
        v10=0
            }
    return 1
}
return 0

实际上输入的字符每4个一组和m数组的十六个字符组成了四元一次方程组,按理说解个方程就可以求出这四个字符,但实际上,最后经过这个函数输出的每个字符都进行了%127的处理所以我们这样做还是有点问题的。这个函数基本就分析完了。接下来分析encode()函数。
这里写图片描述
这个函数依旧被混淆成了很多层的循环嵌套。但是发现了一些标志,比如61,和三个字符一组一次生成4个字符。于是猜测是进行了base64编码。一开始直接最后的字符串进行base64解码了,后来在动态调试跟到这个函数的时候发现不太对,于是点开了程序中的alpha_base数组,发现这个数组和标准的base64编码方式并不相同。猜测base64被魔改了。假设程序只改了这个编码数组。网上找了一个c语言实现的base64,把编码数组改成了程序中的数组”FeVYKw6a0lDIOsnZQ5EAf2MvjS1GUiLWPTtH4JqRgu3dbC8hrcNo9/mxzpXBky7+”,动态调试发现确实只改了这一个地方。于是就把最后比较的那串字符串进行解码。得到编解码前的数组。d[37,192,59,166,31,175,76,165,203,139,164,155,59,225,40,133,38,38,22,231,17,9,7,38]。发现一个奇怪的地方是编码前的数组,存在比127还大的数,这是因为在之前%127的时候,有一个类型转换,将int类型的转成char型的导致溢出成负数,所以对127取模的结果就会出现一些问题。所以不好确定%127之前的数到底是多少,而且m数组里也有很大的数,运算时很容易溢出,所以解方程不太好做所以还是决定爆破。因为一组只有4个字符所以并不是很困难。 写得脚本。

#include<stdio.h>                                                                                                      
int cipher[24]={37,192,59,166,31,175,76,165,203,139,164,155,59,225,40,133,38,38,22,231,17,9,7,38};
int main(void){
for(int x=0;x<6;x++){
    for(int i=0;i<=127;i++)
        for(int j=0;j<=127;j++)
            for(int k=0;k<=127;k++)
                for(int m=0;m<=127;m++)
                {   int a=2*i+2*j+4*k+0xfffffffb*m;
                    int b=i+j+3*k+0xfffffffd*m;
                    int c=0xffffffff*i+0xfffffffe*j+0xffffffffd*k+4*m;
                    int d=0xffffffff*i+0xfffffffe*k+2*m;
                    if(((char)(a)%127&0x000000ff)==cipher[x*4+0]&&((char)(b)%127&0x000000ff)==cipher[x*4+1]&&((char)(c)%127&0x000000ff)==cipher[x*4+2]&&((char)(d)%127&0x000000ff)==cipher[x*4+3])
                        printf("%c%c%c%c",i,j,k,m);
                }
}
return 0;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/github_36788573/article/details/80330119
个人分类: re
上一篇(Jarvis Oj)(Pwn) level5
下一篇(Jarvis Oj)(Pwn) Tell Me Something
想对作者说点什么? 我来说一句

netty encode decode

2013年04月26日 4KB 下载

自定义php json encode

2013年12月31日 3KB 下载

javascript加解密

2010年06月04日 21KB 下载

Turbo encode and decode

2012年11月21日 572KB 下载

没有更多推荐了,返回首页

关闭
关闭