zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    洛谷 P1508 Likecloud-吃、吃、吃
    Codevs 1158 尼克的任务
    2017.10.6 国庆清北 D6T2 同余方程组
    2017.10.6 国庆清北 D6T1 排序
    2017.10.3 国庆清北 D3T3 解迷游戏
    2017.10.3 国庆清北 D3T2 公交车
    2017.10.3 国庆清北 D3T1 括号序列
    2017.10.4 国庆清北 D4T1 财富
    2017.10.7 国庆清北 D7T2 第k大区间
    2017.10.7 国庆清北 D7T1 计数
  • 原文地址:https://www.cnblogs.com/blackicelisa/p/12263648.html
Copyright © 2011-2022 走看看