坐标HIT,二进制炸弹第六关为众所周知的毒瘤点,今天来电大家想看的交作业邪道速通
先挂环境,Ubuntu22.04LTS系统,VS Code,编译插件C/C++ Compile Run
不说废话,直接贴代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
int _dfs(int arr[], int depth, int check) {
if (depth == 6) {
if (check != 126)
return 0;
freopen("input.txt", "w", stdout);
cout << "I am not part of the problem. I am a Republican.\n0 1 1 2 3 5\n1 809\n7 7\n9?1057\n";
for (int i = 1; i <= 6; i ++)
cout << arr[i] << ' ';
cout << endl;
system("./bomb < input.txt > ans.txt");
freopen("ans.txt", "r", stdin);
char s[100] = { 0 };
scanf("%[^\n]", s); getchar();
scanf("%[^\n]", s); getchar();
scanf("%[^\n]", s); getchar();
scanf("%[^\n]", s); getchar();
scanf("%[^\n]", s); getchar();
scanf("%[^\n]", s); getchar();
scanf("%[^\n]", s); getchar();
scanf("%[^\n]", s); getchar();
scanf("%[^\n]", s); getchar();
if (s[0] == 'C') {
for (int i = 1; i <= 6; i ++)
cout << arr[i] << ' ';
exit(0);
}
return 0;
}
for (int i = 1; i <= 6; i ++) {
arr[depth + 1] = i;
_dfs(arr, depth + 1, check | (1 << i));
}
}
int main() {
int arr[10] = { 0 };
_dfs(arr, 0, 0);
return 0;
}
思路是硬搜,但是使用前提是知道前五关的密码(这个是白给)
由于总共只有720种情况,所以可以全部遍历一遍检测哪个是对的,其中
system("./bomb < input.txt > ans.txt");
这一行是把输入定向到input.txt,输出定向到ans.txt,这样只需要在input中枚举输入即可,最后答案文件如下所示
I am not part of the problem. I am a Republican.
0 1 1 2 3 5
1 809
7 7
9?1057
4 6 1 5 3 2
4 6 1 5 3 2
最后两行即为第六关结果,同理这个方法也可以用来暴力破解第四关
大家在用的时候记得把代码里面的前五关输出换成自己的,不会做的可以用Ghidra软件在Windows下跑反编译直接看,并且跑出来的代码可以问New Bing/ChatGPT