IgniteMe
暂无
解法
拖进 Exeinfo PE 分析。
Microsoft Visual C++ v.5-6.0 [Debug 02] - no sec. Cab.7z.Zip - 2017-10-30 ,
Overlay : Debug Data type 02 ( NB10 : Misc location DBG )
Big sec. 01 [ .text ] , Not packed , try debug www.ollydbg.de or www.x64dbg.com
导入 IDA。
按 F5 生成伪代码。
int __cdecl main(int argc, const char **argv, const char **envp)
{
size_t i; // [esp+4Ch] [ebp-8Ch]
char v5[8]; // [esp+50h] [ebp-88h] BYREF
char Str[128]; // [esp+58h] [ebp-80h] BYREF
sub_402B30(&unk_446360, "Give me your flag:");
sub_4013F0(sub_403670);
sub_401440(Str, 127);
if ( strlen(Str) < 0x1E && strlen(Str) > 4 )
{
strcpy(v5, "EIS{");
for ( i = 0; i < strlen(v5); ++i )
{
if ( Str[i] != v5[i] )
goto LABEL_7;
}
if ( Str[28] != 125 )
{
LABEL_7:
sub_402B30(&unk_446360, "Sorry, keep trying! ");
sub_4013F0(sub_403670);
return 0;
}
if ( (unsigned __int8)sub_4011C0(Str) )
sub_402B30(&unk_446360, "Congratulations! ");
else
sub_402B30(&unk_446360, "Sorry, keep trying! ");
sub_4013F0(sub_403670);
return 0;
}
else
{
sub_402B30(&unk_446360, "Sorry, keep trying!");
sub_4013F0(sub_403670);
return 0;
}
}
flag 的格式可能是 EIS{XXXXX}。
strcpy(v5, "EIS{");
突破口:sub_4011C0 函数
if ( (unsigned __int8)sub_4011C0(Str) )
sub_402B30(&unk_446360, "Congratulations! ");
打开 sub_4011C0 函数。
看起来是将 flag 进行一些处理后,再和 “GONDPHyGjPEKruv{{pj]X@rF” 比较。
bool __cdecl sub_4011C0(char *Str)
{
int v2; // [esp+50h] [ebp-B0h]
char Str2[32]; // [esp+54h] [ebp-ACh] BYREF
int v4; // [esp+74h] [ebp-8Ch]
int v5; // [esp+78h] [ebp-88h]
size_t i; // [esp+7Ch] [ebp-84h]
char v7[128]; // [esp+80h] [ebp-80h] BYREF
if ( strlen(Str) <= 4 )
return 0;
i = 4;
v5 = 0;
while ( i < strlen(Str) - 1 )
v7[v5++] = Str[i++];
v7[v5] = 0;
v4 = 0;
v2 = 0;
memset(Str2, 0, sizeof(Str2));
for ( i = 0; i < strlen(v7); ++i )
{
if ( v7[i] >= 97 && v7[i] <= 122 )
{
v7[i] -= 32;
v2 = 1;
}
if ( !v2 && v7[i] >= 65 && v7[i] <= 90 )
v7[i] += 32;
Str2[i] = byte_4420B0[i] ^ sub_4013C0(v7[i]);
v2 = 0;
}
return strcmp("GONDPHyGjPEKruv{{pj]X@rF", Str2) == 0;
}
但是不知道 byte_4420B0[] 和 sub_4013C0 是什么。点击 byte_4420B0。是一个 char 数组,地址范围从 4420B0 到 4420CF。
将十六进制数据复制下来,并预处理一下,去掉末尾的 h 方便格式化读入。
0D 13 17 11 2 1 20 1D 0C 2 19 2F 17 2B 24 1F 1E 16 9 0F 15 27 13 26 0A 2F 1E 1A 2D 0C 22 4
用这个程序就能读入数据,并转换为 10 进制。
#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;
const int N = 1e4 + 7;
char byte_4420B0[N];
int main() {
for (int i = 0; ~scanf("%x", &byte_4420B0[i]); i++)
cout << (int)byte_4420B0[i] << " ";
}
打开 sub_4013C0 函数。
int __cdecl sub_4013C0(int a1)
{
return (a1 ^ 0x55) + 72;
}
不难写出 sub_4013C0 的反函数。
int f2(int a1) { return (a1 - 72) ^ 0x55; }
根据 sub_4011C0 函数,写出解码程序。
#include <algorithm>
#include <cstring>
#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;
const int N = 1e4 + 7;
int len = 0;
char byte_4420B0[N];
int f2(int a1) { return (a1 - 72) ^ 0x55; }
string f1() {
char v7[128]; // [esp+80h] [ebp-80h] BYREF
string str1;
string str2 = "GONDPHyGjPEKruv{{pj]X@rF";
int i;
for (i = 0; i < str2.length(); i++) {
str2[i] ^= byte_4420B0[i];
v7[i] = f2(str2[i]);
if (isupper(v7[i])) {
v7[i] = tolower(v7[i]);
} else {
v7[i] = toupper(v7[i]);
}
// cout << v7[i];
}
v7[i] = '\0';
str1 = v7;
return str1;
}
int main() {
while (~scanf("%x", &byte_4420B0[len])) {
// cout << (int)byte_4420B0[i] << " ";
len++;
}
cout << f1() << "\n";
}
输入:
0D 13 17 11 2 1 20 1D 0C 2 19 2F 17 2B 24 1F 1E 16 9 0F 15 27 13 26 0A 2F 1E 1A 2D 0C 22 4
输出:
wadx_tdgk_aihc_ihkn_pjlm
再把结果放入 EIS{XXXXX}。
Flag
EIS{wadx_tdgk_aihc_ihkn_pjlm}
声明
本博客上发布的所有关于网络攻防技术的文章,仅用于教育和研究目的。所有涉及到的实验操作都在虚拟机或者专门设计的靶机上进行,并且严格遵守了相关法律法规。
博主坚决反对任何形式的非法黑客行为,包括但不限于未经授权的访问、攻击或破坏他人的计算机系统。博主强烈建议每位读者在学习网络攻防技术时,必须遵守法律法规,不得用于任何非法目的。对于因使用这些技术而导致的任何后果,博主不承担任何责任。