代码编译,但启动后崩溃(rot13)

时间:2015-03-20 23:40:27

标签: c++ rot13

所以,我一直在摆弄ctf比赛的代码。但是,每次运行实际的控制台应用程序时,它都会崩溃。有人可以向我解释原因。非常感谢你。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int lowerConvert(char x)
{
    int y;

    if (x == 'a')
        y = 1;
    if (x == 'b')
        y = 2;
    if (x == 'c')
        y = 3;
    if (x == 'd')
        y = 4;
    if (x == 'e')
        y = 5;
    if (x == 'f')
        y = 6;
    if (x == 'g')
        y = 7;
    if (x == 'h')
        y = 8;
    if (x == 'i')
        y = 9;
    if (x == 'j')
        y = 10;
    if (x =='k')
        y = 11;
    if (x == 'l')
        y = 12;
    if (x == 'm')
        y = 13;
    if (x == 'n')
        y = 14;
    if (x == 'o')
        y = 15;
    if (x == 'p')
        y = 16;
    if (x == 'q')
        y = 17;
    if (x == 'r')
        y = 18;
    if (x == 's')
        y = 19;
    if (x == 't')
        y = 20;
    if (x == 'u')
        y = 21;
    if (x == 'v')
        y = 22;
    if (x == 'w')
        y = 23;
    if (x == 'x')
        y = 24;
    if (x == 'y')
        y = 25;
    if (x == 'z')
        y = 26;

    return y;

}
int upperConvert(char x)
{
    int y;

    if (x == 'A')
        y = 27;
    if (x == 'B')
        y = 28;
    if (x == 'C')
        y = 29;
    if (x == 'D')
        y = 30;
    if (x == 'E')
        y = 31;
    if (x == 'F')
        y = 32;
    if (x == 'G')
        y = 33;
    if (x == 'H')
        y = 34;
    if (x == 'I')
        y = 35;
    if (x == 'J')
        y = 36;
    if (x == 'K')
        y = 37;
    if (x == 'L')
        y = 38;
    if (x == 'M')
        y = 39;
    if (x == 'N')
        y = 40;
    if (x == 'O')
        y = 41;
    if (x == 'P')
        y = 42;
    if (x == 'Q')
        y = 43;
    if (x == 'R')
        y = 44;
    if (x == 'S')
        y = 45;
    if (x == 'T')
        y = 46;
    if (x == 'U')
        y = 47;
    if (x == 'V')
        y = 48;
    if (x == 'W')
        y = 49;
    if (x == 'X')
        y = 50;
    if (x == 'Y')
        y = 51;
    if (x == 'Z')
        y = 52;

    return y;
}
char lowerBack(int x)
{
    char y;

    if (x == 1)
        y = 'a';
    else if (x == 2)
        y = 'b';
    else if (x == 3)
        y = 'c';
    else if (x == 4)
        y = 'd';
    else if (x == 5)
        y = 'e';
    else if (x == 6)
        y = 'f';
    else if (x == 7)
        y = 'g';
    else if (x == 8)
        y = 'h';
    else if (x == 9)
        y = 'i';
    else if (x == 10)
        y = 'j';
    else if (x == 11)
        y = 'k';
    else if (x == 12)
        y = 'l';
    else if (x == 13)
        y = 'm';
    else if (x == 14)
        y = 'n';
    else if (x == 15)
        y = 'o';
    else if (x == 16)
        y = 'p';
    else if (x == 17)
        y = 'q';
    else if (x == 18)
        y = 'r';
    else if (x == 19)
        y = 's';
    else if (x == 20)
        y = 't';
    else if (x == 21)
        y = 'u';
    else if (x == 22)
        y = 'v';
    else if (x == 23)
        y = 'w';
    else if (x == 24)
        y = 'x';
    else if (x == 25)
        y = 'y';
    else if (x == 26)
        y = 'z';

        return y;
}
char upperBack(int x)
{
    char y;
    if (x == 27)
        y = 'A';
    if (x == 28)
        y = 'B';
    if (x == 29)
        y = 'C';
    if (x == 30)
        y = 'D';
    if (x == 31)
        y = 'E';
    if (x == 32)
        y = 'F';
    if (x == 33)
        y = 'G';
    if (x == 34)
        y = 'H';
    if (x == 35)
        y = 'I';
    if (x == 36)
        y = 'J';
    if (x == 37)
        y = 'K';
    if (x == 38)
        y = 'L';
    if (x == 39)
        y = 'M';
    if (x == 40)
        y = 'N';
    if (x == 41)
        y = 'O';
    if (x == 42)
        y = 'P';
    if (x == 43)
        y = 'Q';
    if (x == 44)
        y = 'R';
    if (x == 45)
        y = 'S';
    if (x == 46)
        y = 'T';
    if (x == 47)
        y = 'U';
    if (x == 48)
        y = 'V';
    if (x == 49)
        y = 'W';
    if (x == 50)
        y = 'X';
    if (x == 51)
        y = 'Y';
    if (x == 52)
        y = 'Z';


    return y;
}

 void primaryRot13()
{
    cout << "Please enter name of file to be decrypted: ";
    string name;
    getline(cin, name);

    name += ".txt";

    ifstream file;
    ofstream write;
    file.open(name);

    string message;

    file >> message;

    int converted[9999999];
    char reconvert[9999999];

    for (int i = 0; i < message.length();++i)
    {
        if (message[i] == 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9)
            message[i] += 53;

        if (message[i] == 'a' || 'b' || 'c' || 'd' || 'e' || 'f' || 'g' || 'h' || 'i' || 'j' || 'k' || 'l' || 'm' || 'n' || 'o' || 'p' || 'q' || 'r' || 's' || 't' || 'u' || 'v' || 'w' || 'x' || 'y' || 'z')
        converted[i] = lowerConvert(message[i]);    
        converted[i] += 13;
        if (converted[i] > 26)
            converted[i] -= 26;

        if (message[i] == 'A' || 'B' || 'C' || 'D' || 'E' || 'F' || 'G' || 'H' || 'I' || 'J' || 'K' || 'L' || 'M' || 'N' || 'O' || 'P' || 'Q' || 'R' || 'S' || 'T' || 'U' || 'V' || 'W' || 'X' || 'Y' || 'Z')
            converted[i] = upperConvert(message[i]);
        converted[i] += 13;
        if (converted[i] > 52)
            converted[i] -= 26;
    }
    for (int i = 0; i < message.length(); ++i)
    {
        if (converted[i] == 52 || 53 || 54 || 55 || 56 || 57 || 58 || 59 || 60 || 61){
            reconvert[i] = converted[i] - 53;
            continue;
        }
        if (converted[i] < 27){
            reconvert[i] = lowerBack(converted[i]);
            continue;
        }
        if (converted[i] < 51){
            reconvert[i] = upperBack(converted[i]);
            continue;
        }
        write.open("decode");
        write << reconvert[i];

    }


}

编辑和最终解决方案 几年后,我来这里重新发布。我最终做的只是在字符代码中添加所需的金额,然后如果它大于该集合的上限,我减去26以便重置。我最终也使用了向量,这确实解决了我的崩溃问题。现在我可以整天愉快地腐烂了所有的一切:)没有无数的if语句。

2 个答案:

答案 0 :(得分:2)

表查找

首先,介绍表或数组查找 给定一个字符数组:

static const char letters[] = "abcdefghijklmnopqrstuvwxyz";

'a'的索引是0,'b'是1,...,'z'是25 可以搜索该数组的字母。这封信的索引可以是它的数字。在你的情况下,它将是索引+ 1。

示例:

static const unsigned int letter_quantity = sizeof(letters) / sizeof(letters[0]);
unsigned int index = 0;
for (index = 0; index < letter_quantity; ++i)
{
  if (letters[i] == x)
  {
    break;
  }
}

在循环语句结束时,index变量将是x中字符的位置或数组的长度(如果未找到)。

模运算

使用%运算符的模运算返回余数。它具有环绕的行为。这可以与阵列一起使用。

unsigned int new_char_index = index + 13;  // We may have gone past the array.
new_char_index = new_char_index % letter_quantity; // Wrap around.

新ROT13角色

通过使用new_char_index作为数组的索引,可以找到转换后的字符。

char rot13 = letters[new_char_index];  

涵盖所有角色

可以将剩余的大写字符添加到数组中以占用所有字母。也可以添加其他符号。

所有这些都没有任何if陈述。

答案 1 :(得分:1)

您在stack上分配了两个9999999元素的静态数组。

如果int是32位且系统上char是8位,那么该内存为48 MB。这对于筹码来说太过分了。

尝试动态分配您的数组,即使用std::vector

std::vector<int> converted(9999999);
std::vector<char> reconvert(9999999);