好不容易熬完期末周,自从放了寒假博客就长草了,题更是一道没做。今天做俩入门题,明天一定开始学习。

[GWCTF 2019]pyre 附件是一个pyc文件。查询资料发现,这种文件并不是python的代码文件,不能直接看。至于pyc文件是什么,它是py编译过程中产生的字节码文件,可以由虚拟机直接执行,是python将目标源码编译成字节码以后在磁盘上的文件形式。

右键记事本打开pyc文件的话倒也不是不能看,不过手动解密成正经代码很费劲,幸好有在线工具可以直接逆。 得到以下python代码:

print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
    num = ((input1[i] + i) % 128 + 128) % 128
    code += num

for i in range(l - 1):
    code[i] = code[i] ^ code[i + 1]

print code
code = [
    '%1f',
    '%12',
    '%1d',
    '(',
    '0',
    '4',
    '%01',
    '%06',
    '%14',
    '4',
    ',',
    '%1b',
    'U',
    '?',
    'o',
    '6',
    '*',
    ':',
    '%01',
    'D',
    ';',
    '%',
    '%13']

先看 code[i] = code[i] ^ code[i + 1] 其实就是每一位和后一位异或之后更新自己位的值。那么只要倒序异或回去就可得到原始值(B^A^A=B)。

再看

num = ((input1[i] + i) % 128 + 128) % 128
code += num

神经病...其实就是每位数字加上坐标再对128取模。

写个脚本逆回去即可:

写代码时发现了个小问题:

[ACTF新生赛2020]easyre 下载附件拖进DIE发现带upx壳,直接拖进工具脱壳。(似乎脱壳工具不同反编译得到的代码也会有出入)

程序拖进32位IDA,直接进入主函数看代码:

看到什么v5v6v7v8,乱七八糟有点绕,先猜,v5数组好像就是用户输入的字符数组(用ACTF{}包起来),下面for循环里的byte_402000我看了半天才搞清楚好像指的是一个字典数组,而中括号里的下标是v5数组的第i位再减1对应的ASCII码,有点绕。这样找出来的每一位去和v4里对应的第i位比较,如果都相等,那么就正确。

双击byte_402000跟进,看到字典(少框一行)

逆回去: (好久没写代码了,由于GPT实在智障所以自己写一次,内层循环遍历字典确定下标,一旦匹配上就+1然后加进flag字符串并且break,然后外层循环+1遍历小字符串)

提交时记得包上flag{}。