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

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}提交

posted @ 2021-11-18 09:06  上辰  阅读(542)  评论(0编辑  收藏  举报