好不容易熬完期末周,自从放了寒假博客就长草了,题更是一道没做。今天做俩入门题,明天一定开始学习。
[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{}。