HardRe
❝
这道题不少人在赛后与我反馈说明明调试的时候都是这样,结果却不同...
❞
程序放入IDA中逆向分析
表面上看起来像是一个base64编码 然后解密, 尝试后肯定是失败的
在base64编码的函数中首先是一个加法和xor
然后是base64编码 但是在结尾抛出了异常
而在base64函数中catch异常
函数执行的时候并没有执行第一个base64编码 将函数直接修改jmp到异常处理的地方
程序利用ptrace 进行反调试并且修改密钥的值
然后经过一个xtea加密 和一个base64编码
这个编码里面依然有加法和xor
然后是一个正常的base64
最后将字符串比较
所以整体加密思路
加法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] = {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}
原文始发于微信公众号(中学生CTF):“技能兴鲁”-网络安全赛项-初赛 - Reverse - HardRe
特别标注:
本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
- 我的微信
- 微信扫一扫
-
- 我的微信公众号
- 微信扫一扫
-
评论