题目
文件
IDA
⚠数据显示问题之显示格式⚠
v7的类型是int64的“28537194573619560LL”,查看内存可以发现是“65626D61726168”:
一看就是英文字母字符串(十六进制范围(0x41-0x5A ∩ 0x61-0x7A)),可以按“C”键转为Char类型:
IDA反汇编时可能将数据以不同的形式展示,在Hex窗口可以查看十六进制的原始数据——同时发现了一个问题⚠⚠⚠
另一个字符串并没有“\”
⚠数据显示问题之字符串转义符号⚠
返回IDA View窗口确认数据:
数据没有错,只是IDA为了显示字符串,又因为字符串中有双引号会闭合字符串,所以在“显示”时,多加了转义符号“\”,显示和实际数据有所不同,以实际数据为准:
解题
答案
查看Writeup
解题思路
加密相关概念
需要对RC4有个大概的了解,因为很可能直接可以用在线的RC4解密解出flag——答案是🉑
密码学
虽然看了但没看懂😅RC4的代码和题目的代码好像一样又好像不一样😅
那么就不看代码看概念,对称加密中,密钥可以把加密后的密文还原。
密文=加密算法(原文,密钥),原文=加密算法(加密算法(原文,密钥))
原文=加密算法(密文,密钥),密文=加密算法(加密算法(密文,密钥))
代码逻辑
上面说到,其实数据有可能IDA显示的那样,所以实际上逻辑是:
v8 = “:"AL_RT^L*.?+6/46” //密文,注意没有转义符“\”
v7 = “harambe” //密钥
v6 = 7; //密钥长度
__isoc99_scanf("%32s", strInput); // 输入字符串
lenInput = strlen(strInput);
if ( lenInput < strlen((const char *)v8) ) // 长度不能小于v8
ERROR();
for ( i = 0; i < strlen(strInput); ++i )
{
if ( i >= strlen((const char *)v8) ) // 字符串长度要比v8少1
ERROR();
if ( strInput[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ *((_BYTE *)v8 + i)) )
ERROR(); // 等于时,才能不进入成立逻辑
}
RIGHT(); // 正确提示在for外,就是for内部的逻辑都不能成立
运行后提示的输出“Incorrect password!”是错误逻辑,不能进入错误逻辑,最后就会打印出正确逻辑的字符串“You entered the correct password!\nGreat job!\n”。
解题逻辑
需要使输入的字符串等于(char)(((_BYTE )&v7 + i % v6) ^ ((_BYTE )v8 + i)) )。
等价于:输入字符串=((char) v7[i % v6]) ^ v8[i]
v7[i % v6]
v6值为7,v7长度为7,v7[i % 7],即对v7这个字符串(数组)按位取值。
比如v7[0],指的就是v7字符串“harambe”的第1个字符“h”。
v8[i]
同理对v8这个字符串“:”AL_RT^L.?+6/46”按字节取值。
比如v8[8],指的就是v8字符串“:”AL_RT^L.?+6/46”的第9个字符“L”。
v7[i % 7]) ^ v8[i]
按字节异或
取v7的字符串(从0-6循环)和v8的每一个字符串进行异或
XOR异或解密
代码+题目的意思是将加密后的密文还原(用密钥解密)
其中参数为:
密文:“:”AL_RT^L*.?+6/46”
密钥:“harambe”
取模的除数(密钥长度):“7”
解题方式
在线XOR
在实战中为了分数,能快就快,建议使用现成或者在线的工具,火速得到flag。
- 使用CyberChef的XOR异或功能“XOR”
- 输入Key值,注意数据类型,本题为“UTF-8”
- 输入需要异或的字符串
- 得flag&input=OiJBTF9SVF5MKi4/KzYvNDY)“RC3-2016-XORISGUD”:
对称加密就是加密和还原,还原=加密再加密(加密平方,加密²),也就是反着来可以还原
🐍Python🐍
自己练习可以多写写代码
strEncode = ':"AL_RT^L*.?+6/46' #字符串中包含双引号("),所以要使用单引号赋值
key = "harambe"
lenKey = 7
print("密文:", strEncode)
print("密钥:", key)
def Xor(str):
strXOR = ""
for i in range(len(str)):
strXOR += chr(ord(str[i]) ^ ord(key[i%lenKey]))
return strXOR
flag = Xor(strEncode)
print("Flag:", flag)
print("再将Flag加密就是参数中的密文了:", Xor(flag))