20240222

CSP

2023-9-1 坐标变换(其一)

简单的坐标平移操作。首先从输入中读取两个整数n和m,表示有n组坐标点和m组平移向量。然后通过一个循环读取n组坐标点的x和y坐标,并将它们的和分别累加到sumx和sumy中。接着再通过一个循环读取m组平移向量的x和y坐标,将它们分别加上sumx和sumy,得到新的x和y坐标,最后输出这两个新坐标。通过这个操作,实现了将n组坐标点进行平移的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
using namespace std;

int main()
{
int n,m,i,sumx=0,sumy=0,x,y;
cin>>n>>m;
for(i=0;i<n;i++)
{
cin>>x>>y;
sumx+=x;
sumy+=y;
}
for(i=0;i<m;i++)
{
cin>>x>>y;
x+=sumx;
y+=sumy;
cout<<x<<" "<<y<<endl;
}
return 0;
}
2023-9-2 坐标变换(其二)

二维坐标变换。首先从输入中读取两个整数n和m,表示有n个变换操作和m组坐标点需要进行变换。然后使用两个vector数组k和xt分别存储变换系数和坐标偏移量。接着通过一个循环读取n个变换操作,每个操作包含一个整数x和一个浮点数cz,根据x的值来更新变换系数k和坐标偏移量xt。最后通过一个循环读取m组坐标点和两个整数cz1和cz2,根据之前计算的变换系数和坐标偏移量,对坐标点进行线性变换,然后输出变换后的坐标点。

注意:

在C++中,fixedsetprecision(3)是用来设置输出浮点数的格式和精度的。具体说明如下:

  • fixed:指定浮点数的输出格式为固定小数点表示。即输出的浮点数将以小数点表示,而不是科学计数法。
  • setprecision(3):指定浮点数的输出精度为3位小数。即输出的浮点数将保留3位小数。

在代码中,cout<<fixed<<setprecision(3)的作用是设置之后输出的浮点数都将采用固定小数点表示,并保留3位小数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>
#include<cmath>
#include<iomanip>
#include<vector>
using namespace std;

int n,m;

vector<double> k(100005,1);
vector<double> xt(100005);

int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int x;
double cz;
cin>>x>>cz;
if(x==1)
{
k[i]=k[i-1]*cz;
xt[i]=xt[i-1];
}
else
{
k[i]=k[i-1];
xt[i]=xt[i-1]+cz;
}
}
for(int i=0;i<m;i++)
{
int cz1,cz2;
double x,y;
cin>>cz1>>cz2>>x>>y;
double bs=k[cz2]/k[cz1-1];
double ds=xt[cz2]-xt[cz1-1];
cout<<fixed<<setprecision(3)<<(x*cos(ds)-y*sin(ds))*bs<<" "<<(x*sin(ds)+y*cos(ds))*bs<<endl;
}
return 0;
}

BuuCTF

19、BuyFlag

查看源代码,发现有两个php文件链接,点击一个查看

image

点击右边的菜单,有PAYFLAG,点击查看

image

出现这段话

image

查看源代码,用POST的方式传参,money=100000000,password=404,但是password不能为数字,所以password等于404+任意字符

image

前面提示必须是cuit的学生,所以修改cookie里的user=0user=1

修改uesr=0为user=1,页面变了,提示输入password

image

post传参,password=404a&money=100000000,提示数字太长

image

尝试次方 1e9,得到flag

image

1
flag{2eaf1e59-0556-4816-b343-80a3466e934e} 
20、Easy MD5

查看源代码,找不到有用的信息,抓包

看到有一个提示:Hint: select * from 'admin' where password=md5($pass,true)

image

1
2
3
4
5
6
7
8
9
10
11
md5(string,raw)

string 必需,规定要计算的字符串。

raw 可选,规定十六进制或二进制输出格式: TRUE - 原始 16 字符二进制格式;FALSE - 默认。32 字符十六进制数

需要构造or来绕过password,md5(ffifdyop,true)='or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c

原sql查询语句则变为select * from user where username ='admin' and password =''or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c'即可绕过

类似的字符串还有:md5(129581926211651571912466741651878684928,true)=\x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8

输入ffifdyop

image

提交

image

查看源代码

image

用get传参,满足a!=b且md5(a)=md5(b)

md5加密后的值开头为0E,则说明它们的值相等

payload:/levels91.php?a=s878926199a&b=s155964671a

image

包含flag.php文件

用post传参,满足param1!=param2且md5(param1)=md5(param2)

这里用php数组绕过,由于哈希函数无法处理php数组,在遇到数组时返回false,我们就可以利用false==false成立使条件成立。

param1[]=1&param2[]=2

得到flag

image

1
flag{5699128f-b8b5-4580-9e90-8ab95639eb15}