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
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论