题解
......
用ida反编译
但maing不能正常解析
main函数中存在大量的jmp和call的花指令
把所有的花指令给nop掉
注意它是有两个函数
一个是从0x4010c3开始的函数
还有一个就是main了,把花指令去掉后,重新定义下函数
再解析伪代码
看这个函数和题目名可以确定是tea加密了
分析main
先是进行输入
再定义了一堆数据
这应该就是加密的数据了
然后就进行判断了(结果比对)
最终要执行sub_401038(aYesYes, v7);才是对的
先是判断输入的字符串的长度是不是38
再判断前3个字符是不是SYC
再判断第四个的最后一个字符是不是{}
过了再进行循环调用sub_4010C3b函数,也就是之前的另一个函数
它每次循环都是从前面取一个再从后面取一个进行传参
v9_54等于54,v7应该就是key了
分析sub_4010C3函数
这个tea加密与常规的tea还是有点不一样的
首先,它没有对两个值进行位置交换
再就是它加密循环的次数是54
进行异或运算与常规的也不大一样
但解密思路都是一样的
解密脚本
from ctypes import *
def decrypt(crypt,key):
left = c_uint(crypt[1])
right = c_uint(crypt[0])
v7 = c_uint(54 * 0x31415927)
for i in range(54):
v7.value -= 0x31415927
right.value -=c_uint((key[(v7.value & 3)] + v7.value) ^ (left.value + ((left.value >> 5) ^ (left.value<<4)))).value
left.value -= c_uint(v7.value ^ (key[((v7.value >> 11) & 3)] + v7.value) ^ (right.value + ((right.value >> 5) ^ (16 * right.value)))).value
return right,left
d=[0x9AF9464B,0xC417B89E,0xB217A713,0xC93BA9E8,0x94F3E44E,0xB5CC2AB5,0x4451E42C,0x7A8A289A,0x53C8D008,0x6E117B49,0x9BFFD794,0x5EFF2DF9,0x17E72531,0xDFBD9979,0x8F871B3A,0x73E8C5AC,0xB28670A6,0x5AF6A369,0x2CF7DA24,0x347B66AF,0xB9C84D60,0x911E912F,0xBD5A2F9B,0xCB96733A,0xC59968BE,0xA00013E9,0xC12F4EA4,0xDE863A10,0xA0C4D594,0x4380983C,0x7E2F7648,0xE54DDC89,0x3F27A690,0xB58D3199,0x604AE517,0x9C903984,0xF4E04481,0x3CF4EDFF]
key=[32,27,39,44]
flag=[i for i in range(38)]
for i in range(len(d)//2):
flag[i]=decrypt(d[i*2:i*2+2],key)[0].value
flag[len(flag)-i-1]=decrypt(d[i*2:i*2+2],key)[1].value
for i in flag:
print(chr(i),end='')
因为c语言定义变量的内存是多大就是多大,不会扩大只会丢失,但python的变量数据超过了范围它就会扩大,所以我用了ctypes库中的c_uint函数进行操作(无符号4个字节)
SYC{D0_Yov_1ike_To_dRink_Flow3r_teA??}
结语
(本人是菜鸟,想找对CTF感兴趣的CTFer,一起交流学习,共同进步,迈向星辰大海!!!!^_^(有兴趣的加扣群:470196890))