攻防世界-re-IgniteMe
作者:互联网
IDA小技巧 shift + e 可以直接提取数据
菜鸡都是从没有壳的开始做
查看程序运行的状态,输入几个字符直接退出
Ida打开
第八行提示输入flag
第十一行进行逻辑判断。
输入的flag的长度小于30字符大于4字符
第十三行,赋值字符串进入循环逐个字符判断前四个字符是否位EIS{
第19行判断第29位字符是否为} 125的ascii是}
到这里可以看出flag的格式为EIS{}总共是29位
当满足第26行的判断后就会提示恭喜的字样,代表成功
关键函数就是sub_4011C0函数,他所带的形参是str变量也就是我们输入的flag,进入查看
第十五行从第五位开始到倒数第二位结束也就是取flag的值EIS{XXXX}取X,放入V8char数组中。
进入for这个死循环
V2是flag值的长度,全部处理完就结束退出
如果v8中的第i个字符是小写就全部转为大写,V3是用来做标识,转换过大写的就不用去转小写
如果V8中的第i个字符是大写就变成小写
针对异或运算
第36行,只有str2的最终结果是GONDPHyGjPEKruv{{pj]X@rF才会返回1
V8是我们输入的字符串
byte_4420B0看作成数组
sub_4013C0函数是怎么处理输入的flag的值的?
每个字符 ^ 85 然后 + 72 的结果
选中0x55按h键可以进行转换
这里就可以看作是
Str2已知 byte_4420B0已知 求V8即可
Str2[i] = byte_4420B0[i] ^ sub_4013C0(v8[i]);
3 = 2 + 1
倒推出1就可以是
1 = 3 – 2
倒着推出来,先str2[i]和byte_4420B0[i]异或的结果,-72 然后^ 85,最后的ascii大小写转换
EIS{wadx_tdgk_aihc_ihkn_pjlm}
#include <windows.h>
#include <string.h>
#include <stdio.h>
int main() {
char flag[32];
char str2[32] = { "GONDPHyGjPEKruv{{pj]X@rF" };
unsigned char ida_chars[32] =
{
0x0D, 0x13, 0x17, 0x11, 0x02, 0x01, 0x20, 0x1D, 0x0C, 0x02,
0x19, 0x2F, 0x17, 0x2B, 0x24, 0x1F, 0x1E, 0x16, 0x09, 0x0F,
0x15, 0x27, 0x13, 0x26, 0x0A, 0x2F, 0x1E, 0x1A, 0x2D, 0x0C,
0x22, 0x04
};
for(int i = 0; i < 24; i++) {
flag[i] = str2[i] ^ ida_chars[i];
flag[i] = (flag[i] - 72) ^ 85;
}
for (int i = 0; i < 24; i++) {
if (flag[i] >= 97 && flag[i] <= 122) {
flag[i] -= 32;
continue;
}
else {
flag[i] += 32;
continue;
}
}
for (int i = 0; i < 24; i++) {
printf("%c",flag[i]);
}
return 0;
}
标签:字符,EIS,攻防,str2,4420B0,IgniteMe,re,flag,byte 来源: https://blog.csdn.net/Lonelyhat/article/details/120844299