Geek Challenge 2023 RE reserve flower-or-tea

19 篇文章 0 订阅
10 篇文章 0 订阅

题解

......

用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))

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值