题目

CSDN免积分下载

文件

先查壳,有壳脱壳,没壳拖入IDA
64位无壳ELF

IDA

image.png

⚠数据显示问题之显示格式⚠

v7的类型是int64的“28537194573619560LL”,查看内存可以发现是“65626D61726168”:
image.png
一看就是英文字母字符串(十六进制范围(0x41-0x5A ∩ 0x61-0x7A)),可以按“C”键转为Char类型:
image.png
IDA反汇编时可能将数据以不同的形式展示,在Hex窗口可以查看十六进制的原始数据——同时发现了一个问题⚠⚠⚠
另一个字符串并没有“\”
image.png

⚠数据显示问题之字符串转义符号⚠

返回IDA View窗口确认数据:
image.png
数据没有错,只是IDA为了显示字符串,又因为字符串中有双引号会闭合字符串,所以在“显示”时,多加了转义符号“\”,显示和实际数据有所不同,以实际数据为准:
image.png

解题

答案

RC3-2016-XORISGUD

查看Writeup

解题思路

题目提示是“RC3”

加密相关概念

需要对RC4有个大概的了解,因为很可能直接可以用在线的RC4解密解出flag——答案是🉑
密码学
虽然看了但没看懂😅RC4的代码和题目的代码好像一样又好像不一样😅
src=http_%2F%2Fnimg.ws.126.net%2F_url=http%3A%2F%2Fdingyue.ws.126.net%2F2021%2F0417%2F896096e4j00qrpqaf0014d200c800aig00c800ai.jpg&thumbnail=650x2147483647&quality=80&type=jpg&refer=http_%2F%2Fnimg.ws.126.jpg
那么就不看代码看概念,对称加密中,密钥可以把加密后的密文还原。
密文=加密算法(原文,密钥),原文=加密算法(加密算法(原文,密钥))
原文=加密算法(密文,密钥),密文=加密算法(加密算法(密文,密钥))

代码逻辑

上面说到,其实数据有可能IDA显示的那样,所以实际上逻辑是:

  1. v8 = “:"AL_RT^L*.?+6/46 //密文,注意没有转义符“\”
  2. v7 = harambe //密钥
  3. v6 = 7; //密钥长度
  4. __isoc99_scanf("%32s", strInput); // 输入字符串
  5. lenInput = strlen(strInput);
  6. if ( lenInput < strlen((const char *)v8) ) // 长度不能小于v8
  7. ERROR();
  8. for ( i = 0; i < strlen(strInput); ++i )
  9. {
  10. if ( i >= strlen((const char *)v8) ) // 字符串长度要比v8少1
  11. ERROR();
  12. if ( strInput[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ *((_BYTE *)v8 + i)) )
  13. ERROR(); // 等于时,才能不进入成立逻辑
  14. }
  15. 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。

  1. 使用CyberChef的XOR异或功能“XOR”
  2. 输入Key值,注意数据类型,本题为“UTF-8”
  3. 输入需要异或的字符串
  4. 得flag&input=OiJBTF9SVF5MKi4/KzYvNDY)“RC3-2016-XORISGUD”:

image.png
对称加密就是加密和还原,还原=加密再加密(加密平方,加密²),也就是反着来可以还原
image.png

🐍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))

image.png

CTF汇总

2021.05.25 XCTF入门RE _ CTF - RE