技能兴鲁-网络安全赛项-初赛 - Reverse - HardRe

admin 2023年11月16日14:44:54评论26 views字数 1842阅读6分8秒阅读模式

HardRe

这道题不少人在赛后与我反馈说明明调试的时候都是这样,结果却不同...

程序放入IDA中逆向分析

技能兴鲁-网络安全赛项-初赛 - Reverse - HardRe

表面上看起来像是一个base64编码 然后解密, 尝试后肯定是失败的

在base64编码的函数中首先是一个加法和xor

技能兴鲁-网络安全赛项-初赛 - Reverse - HardRe

然后是base64编码 但是在结尾抛出了异常

技能兴鲁-网络安全赛项-初赛 - Reverse - HardRe

而在base64函数中catch异常

技能兴鲁-网络安全赛项-初赛 - Reverse - HardRe

函数执行的时候并没有执行第一个base64编码 将函数直接修改jmp到异常处理的地方

技能兴鲁-网络安全赛项-初赛 - Reverse - HardRe

程序利用ptrace 进行反调试并且修改密钥的值

技能兴鲁-网络安全赛项-初赛 - Reverse - HardRe

然后经过一个xtea加密 和一个base64编码

这个编码里面依然有加法和xor

技能兴鲁-网络安全赛项-初赛 - Reverse - HardRe

然后是一个正常的base64

技能兴鲁-网络安全赛项-初赛 - Reverse - HardRe

最后将字符串比较

技能兴鲁-网络安全赛项-初赛 - Reverse - HardRe

所以整体加密思路

加法and 异或 -> Xtea加密 -> 加法and 异或 -> base64编码

根据这些逆向解密即可

key=[i for i in range(32)]
import struct
key = struct.unpack('8L', bytes(key))
#print(key)

from base64 import *
from ctypes import *


base = "iq3gDwcXsmXLMlAYQJLQ/YVYw1+CvqPf4ByJR1rMv1O5trzlwQoqDw=="
import base64
# xor -> xtea -> xor -> base
data = base64.b64decode(base)
data = [i for i in data]
for i in range(40):
   data[i] = data[i]^0x32
   data[i] -=i
   data[i]&=0xff
   print(hex(data[i]),end=',')
data=struct.unpack('10L', bytes(data))
print(data)

把xtea的密文求解出来

#include <stdio.h> 
#include <stdint.h>
int k[4] = {0x000012AB0x000076540x000078AC0x00002B32};

void xteadecrypt(uint32_t* v, uint32_t* k) {

   uint32_t v0 = v[0], v1 = v[1];
   uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];

   int sum = 0x9e3779b9 * 32, delta = 0x9e3779b9;

   for (size_t i = 0; i < 32; i++)
   {

       v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);
       sum -= delta;
       v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
   }
   v[0] = v0; v[1] = v1;
}


int main()
{
   ;;;
   unsigned int v[10]={ 9867506481350180913525924337323515683815245869193598415772152050629811146284283027002219384963535};
   
   unsigned char *p = v;
   for(int i=0;i<40;i++)
   {
    printf("%x,",p[i]);
   } 
   
   for(int i=0;i<5;i++)
   {
    xteadecrypt(&v[2*i],k);
    } 
   
   for(int i=0;i<10;i++)
   
   {
    printf("%x,",v[i]);
   }
   printf("n");;;
   
   
   for(int i=0;i<40;i++)
   {
    p[i]^=0x32;
    p[i]-=i;
   }

   printf("%s",p);
}

求出flag

flag{1bdf524c7f1311e1da6da6e4e5176d0c9e}


原文始发于微信公众号(中学生CTF):“技能兴鲁”-网络安全赛项-初赛 - Reverse - HardRe

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年11月16日14:44:54
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   技能兴鲁-网络安全赛项-初赛 - Reverse - HardRehttp://cn-sec.com/archives/2210582.html

发表评论

匿名网友 填写信息