您的位置:首页 > 其它

XCTF2016 类似培根

2016-09-20 19:32 363 查看
题目描述
   这不是培根,也许是香肠吧~

fIND PasswoRd:
fIrSt tHiNk OF thE PErSon wHo liVEs In diSguIse,
Who deals in SEcretS and tellS naUght But lIEs.
NExt, Tell Me whAT'S Always The LaSt tHiNg TO meND,ThE midDle oF MiDdle And End Of the end?
anD FinalLy give me The SounD oftEN hEArd DuriNg thE SEArch foR a hArD-to-FiNd WOrk.
NOW sTrinG theM ToGethEr, aNd aNswer me thiS,
Which Creature WouLd yoU be uNWiLLinG to kIss?

Writeup:

以前写的培根密码代码直接拿来用,

我写的这个只能读一行,用converter处理一下数据,保留字母,得到

fINDPasswoRdfIrSttHiNkOFthEPErSonwHoliVEsIndiSguIseWhodealsinSEcretSandtellSnaUghtButlIEsNExtTellMewhATSAlwaysTheLaSttHiNgTOmeNDThEmidDleoFMiDdleAndEndOftheendanDFinalLygivemeTheSounDoftENhEArdDuriNgthESEArchfoRahArDtoFiNdWOrkNOWsTrinGtheMToGethEraNdaNswermethiSWhichCreatureWouLdyoUbeuNWiLLinGtokIss

在程序里跑一遍

//培根密码 3合1

#include <iostream>
#include <string.h>
#include <string>
#include <ctype.h>
using namespace std;

string graph1[26] = {
"aaaaa", "aaaab", "aaaba", "aaabb", "aabaa",
"aabab", "aabba", "aabbb", "abaaa", "abaab",
"ababa", "ababb", "abbaa", "abbab", "abbba",
"abbbb", "baaaa", "baaab", "baaba", "baabb",
"babaa", "babab", "babba", "babbb", "bbaaa", "bbaab"
};
string graph2[26] = {
"AAAAA", "AAAAB", "AAABA", "AAABB", "AABAA",
"AABAB", "AABBA", "AABBB", "ABAAA", "ABAAA",
"ABAAB", "ABABA", "ABABB", "ABBAA", "ABBAB",
"ABBBA", "ABBBB", "BAAAA", "BAAAB", "BAABA",
"BAABB", "BAABB", "BABAA", "BABAB", "BABBA", "BABBB"
};
int main()
{
char a[1000], aa[1000]; string b, c, d;
cout << "请输入密文:" << endl;
gets_s(a);
for (int i = 0; i<strlen(a); i++)
{
if (islower(a[i]))b += 'b';
else if (isupper(a[i]))b += 'a';
}
if (b.length() % 5 != 0)
{
cout << "This string is not a Bacon's cipher." << endl;
return 0;
}
for (int i = 0; i<b.length(); i++)
{
c += b[i];
if ((i + 1) % 5 == 0)
for (int k = 0; k<26; k++)
if (c == graph1[k])
{
d += 'A' + k, c = ""; break;
}
}
cout << "培根加密第一种:" << d << endl;
b = c = d = "";
for (int i = 0; i<strlen(a); i++)
{
if (islower(a[i]))b += 'B';
else if (isupper(a[i]))b += 'A';
}
for (int i = 0; i<b.length(); i++)
{
c += b[i];
if ((i + 1) % 5 == 0)
for (int k = 0; k<26; k++)
if (c == graph2[k])
{
d += 'a' + k, c = ""; break;
}
}
cout << "培根加密第二种:" << d << endl;
b = c = d = "";
for (int i = 0; i<strlen(a); i++)
{
if (a[i] == 'A')b += 'B';
else if (a[i] == 'B')b += 'A';
}
for (int i = 0; i<b.length(); i++)
{
c += b[i];
if ((i + 1) % 5 == 0)
for (int k = 0; k<26; k++)
if (c == graph2[k])
{
d += 'a' + k, c = ""; break;
}
}
cout << "培根加密第三种:" << d << endl;
system("pause");
return 0;
}

结果只出了一个Q,显然不对,总共375个字母,对应75个字母
然后我看了一下过程中变量c的值,它出现了bbbbb,无法对应数组里面的数据,所以导致继续累加,

for (int i = 0; i<b.length(); i++)
{
c += b[i];
if ((i + 1) % 5 == 0)
for (int k = 0; k<26; k++)
if (c == graph1[k])
{
d += 'A' + k, c = ""; break;
}
}


而培根表里没有bbbbb,就猜测出题人把ab倒换,随即改了一下代码:

for (int i = 0; i<strlen(a); i++)
{
if (islower(a[i]))b += 'a';
else if (isupper(a[i]))b += 'b';
}

重新跑一遍,得到flag

改成小写提交ac
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ctf