攻防世界-re-IgniteMe

  • Post author:
  • Post category:其他


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;
}



版权声明:本文为Lonelyhat原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。