• X-CTF(REVERSE高级) handcrafted-pyc


    第一次用python3生成的pyc出现了很多关于版本的问题,所以第二次使用python2生成pyc

    按照题上给出的数据,首先base64解密,然后解压生成out.pyc文件

    uncompyle6反汇编生成的py文件是乱码,究其原因out.pyc文件缺少pyc的文件头,用十六进制工具添加文件头:03 F3 0D 0A 97 32 18 5E 63

    关于pyc与py的介绍:https://www.cnblogs.com/blili/p/11799483.html

    这里有一个坑是要用python2生成的pyc文件头,从图中我们可以看出两个版本生成的pyc头是不同的,命令:python -m py_compile 1.py

    pyc转py,uncompyle6 -o exchange.py out.pyc

    打开exchang.py是两千多行的汇编(数据未截完),我们也可以看出作者是用python2.7编写的

    对这些chr数据主要是ROT_TWO和BINARY_ADD 两个操作,使用dis这个库对数据进行试验我们可以发现ROT_TWO交换栈顶与后面位置的数据,BINARY_ADD相加栈顶与后面位置数据,然后把相加后的数据压栈到栈顶,意思就是把里面的字符按照操作出现的顺序进行排序


    ROT_TWO交换a,b数据

    BINARY_ADD相加a,b数据

    了解到汇编意思后,现在,我们把有效汇编代码保存到1.txt里(两千多行,截图略)

     把编号前1000的字符提取出来吧

    按照汇编代码的逻辑,对提取出来的字符串排序,我们截取}之前的字符串,找到}所在1.txt的631行

    输出有点问题,flag内容乱的,这里的代码参考了:https://www.jianshu.com/p/0af911bb4046

    将所有字符解密,flag依然乱码,原来在输出字符串时,if语句把空字符串过滤了。

    修改代码,重新提取字符串

    得到flag

    附代码:

     1     '''
     2 
     3     import re
     4 
     5     with open("1.txt",'r') as f:
     6 
     7         line = []
     8 
     9         for i in range(1000):
    10 
    11             line.append(f.readline())
    12 
    13     list=[]
    14 
    15     pat="(d*)
    "
    16 
    17     for i in line:
    18 
    19               if 'LOAD_CONST' in i:
    20 
    21                         text=re.compile(pat).findall(i)
    22 
    23                         for j in text:
    24 
    25                                   list.append(j)
    26 
    27     for i in list:
    28 
    29               if(i==''):
    30 
    31                         print(" ")
    32 
    33               else:
    34 
    35                         print(chr(int(i)),end='')
    36 
    37     ''' 
    38 
    39     with open("1.txt",'r') as f:
    40 
    41         line = []
    42 
    43         for i in range(958):
    44 
    45             line.append(f.readline())
    46 
    47     def ROT_TWO(List):
    48 
    49         a = List.pop()
    50 
    51         b = List.pop()
    52 
    53         List.append(a)
    54 
    55         List.append(b)
    56 
    57         return List
    58 
    59     def BINARY_ADD(List):
    60 
    61         a = List.pop()
    62 
    63         b = List.pop()
    64 
    65         List.append(b+a)
    66 
    67         return List
    68 
    69     cipher ="llaC em yP aht notriv lauhcamni !eac Ini npreterP tohty ntybdocese!!! ctihN{noy woc uoc naipmoa eldnur yP nnohttyb doceni euoy rb ria}!napwssro :dorWp gnssadrow...elP  esa yrtaga .ni oD tonurbf etecro)= ."
    70 
    71     cipher = list(cipher)
    72 
    73     s =[]
    74 
    75     j=0
    76 
    77     for i in line:
    78 
    79         if 'LOAD_CONST' in i and j < len(cipher):
    80 
    81             s.append(cipher[j])
    82 
    83             j += 1
    84 
    85         elif 'ROT_TWO' in i:
    86 
    87             s = ROT_TWO(s)
    88 
    89         elif 'BINARY_ADD' in i:
    90 
    91             s = BINARY_ADD(s)
    92 
    93     print (s)
  • 相关阅读:
    linux CentOS6.5 yum安装mysql 5.6
    CentOS6.5安装指定的PHP版本(php5.5)(转)
    openssl加密文件过程
    我的投资
    我的unity3d之路_01_序言
    我为什么想转Unity3d
    TensorFlow_01_真正从零开始,TensorFlow详细安装入门图文教程!
    为什么掌握 UML 建模是成为编程高手的一条捷径?
    《UML面向对象建模与设计》一书
    OOAD基本概念
  • 原文地址:https://www.cnblogs.com/blackicelisa/p/12263648.html
Copyright © 2020-2023  润新知