HardRe 这道题不少人在赛后与我反馈说明明调试的时候都是这样,结果却不同…
程序放入IDA中逆向分析
表面上看起来像是一个base64编码 然后解密, 尝试后肯定是失败的
在base64编码的函数中首先是一个加法和xor
然后是base64编码 但是在结尾抛出了异常
而在base64函数中catch异常
函数执行的时候并没有执行第一个base64编码 将函数直接修改jmp到异常处理的地方
程序利用ptrace 进行反调试并且修改密钥的值
然后经过一个xtea加密 和一个base64编码
这个编码里面依然有加法和xor
然后是一个正常的base64
最后将字符串比较
所以整体加密思路
加法and 异或 -> Xtea加密 -> 加法and 异或 -> base64编码
根据这些逆向解密即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 key=[i for i in range (32 )] import structkey = struct.unpack('8L' , bytes (key)) from base64 import *from ctypes import *base = "iq3gDwcXsmXLMlAYQJLQ/YVYw1+CvqPf4ByJR1rMv1O5trzlwQoqDw==" import base64data = 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的密文求解出来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #include <stdio.h> #include <stdint.h> int k[4 ] = {0x000012AB , 0x00007654 , 0x000078AC , 0x00002B32 };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 ]={ 986750648 , 1350180913 , 525924337 , 3235156838 , 1524586919 , 3598415772 , 1520506298 , 1114628428 , 3027002219 , 384963535 }; 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}