XCTF2016 类似培根

来源:互联网 发布:decode函数在sql种用法 编辑:程序博客网 时间:2024/06/11 18:42
题目描述

   这不是培根,也许是香肠吧~


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


0 0