Problem: [RE1]P2
[[toc]]
思路
- 解题大致思路
进入IDA,首先F5查看伪代码,首先需要输入一串长度为25的字符串
随后会进行for循环
for ( i = 0; i <= 24; ++i ) { v4[i] = key[i % 6] ^ Str[i]; v4[i] += 12; }
此处运算用到了常量key,双击key跟进,得到key的值为‘NSSCTF’
根据代码逻辑,首先for循环的次数为25次,与输入的字符串长度一致,然后将key字符串中的第i%6位与Str类型转换后的i进行异或,随后对运算的结果进行+12
然后是第二个for循环
for ( i = 0; i <= 34; ++i ) { if ( enc[i] != v4[i] ) { printf("No"); return 0; } } printf("Yes"); }
此处循环次数为35次,根据下方代码逻辑可知,enc存储的内容为加密后的密文,此处是将上一个for循环的结果与程序预置的结果进行比较,如果一致则输出yes,反之则输出no,所以密文长度应该为35位
双击enc,选中数据,shift+E提取数据
unsigned char enc[] = { 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x41, 0x25, 0x32, 0x3C, 0x2C, 0x25, 0x3B, 0x18, 0x2C, 0x36, 0x45, 0x42, 0x2E, 0x42, 0x18, 0x27, 0x27, 0x20, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
然后根据代码逻辑编写逆运算EXP
EXP
- 具体攻击代码
s = [0xc,0xc,0xc,0xc,0xc,0xc,0x41,0x25,0x32,0x3c,0x2c,0x25,0x3b,0x18,0x2c,0x36,0x45,0x42,0x2e,0x42,0x18,0x27,0x27,0x20,0x3f] key = 'NSSCTF' for i in range(len(s)): print(chr((s[i] - 12) ^ ord(key[i%6])),end='')
总结
- 对该题的考点总结
- 异或运算
