美文网首页
polyre----RoarCTF2019

polyre----RoarCTF2019

作者: Adam_0 | 来源:发表于2019-10-16 13:37 被阅读0次

    先去控制流平坦化,可用脚本https://github.com/cq674350529/deflat注意angr版本。
    去掉之后简单了很多。全是些while()循环。

    image.png
    仔细分析逻辑,这里是主要算法。
    image.png
    看了WP才理解。算法:每次取8个值拼起来,循环64次,如果大于等于0就 * 2 ,小于0就 * 2 之后再异或0xB0004B7679FA26B3LL。
    注意:这里的v4数据类型是int64位的,我们需要得到的数是一个uint64的,所以当小于0的情况时可能会存在溢出,所以加上一个中间值0x8000000000000000。
    逆算法:我们看到大于等于0的情况时,v4*2 ,所以必定是一个偶数,小于0的情况异或后必定是一个奇数。根据这个判断我们就可以把要对比的值逆回去。
    exp:
    import libnum
    #unk_402170的前0x30个值
    a = [
        0x96,0x62,0x53,0x43,0x6D,0xF2,0x8F,0xBC,
        0x16,0xEE,0x30,0x05,0x78,0x00,0x01,0x52,
        0xEC,0x08,0x5F,0x93,0xEA,0xB5,0xC0,0x4D,
        0x50,0xF4,0x53,0xD8,0xAF,0x90,0x2B,0x34,
        0x81,0x36,0x2C,0xAA,0xBC,0x0E,0x25,0x8B,
        0xE4,0x8A,0xC6,0xA2,0x81,0x9F,0x75,0x55
       ]
    def decode(s):
        for _ in range(64):
            if s&1 == 0:
                s //= 2
               # print(chr(s),end=' ' )
            else:
                s ^= 0xB0004B7679FA26B3
                s //= 2
                s += 0x8000000000000000
               # print(chr(s),end=' ' )
        return s
    
    for i in range(0,len(a),8):
        flag = (a[i]) + (a[i+1]<<8) + (a[i+2]<<16) + (a[i+3]<<24) + (a[i+4]<<32) + (a[i+5]<<40) + (a[i+6]<<48) + (a[i+7]<<56)  
        print(libnum.n2s(decode(flag))[::-1],end='') #因为取出值后是小端序存储,需要倒序输出。
    

    相关文章

      网友评论

          本文标题:polyre----RoarCTF2019

          本文链接:https://www.haomeiwen.com/subject/pjoymctx.html