1. 程式人生 > >WeChall-writeup-3-11.14

WeChall-writeup-3-11.14

    啊哈,這次只隔了一天,是昨天剛寫完的writeup。這次收集到了幾個好用的小工具,會在下面貼出來~

Training: Crypto - Transposition I

首先按照題意學習了一下 transposition ciphers,手動推算了一下這題是六個字元為一組。如下面的程式來調整字元的位置。

#include<iostream>
using namespace std;
int main()
{
    string a;
    while(getline(cin,a))
    {

        for(int i=0;i<a.size();i+=6)
        {
            cout<<a[i+1]<<a[i]<<a[i+3]<<a[i+2]<<a[i+5]<<a[i+4];
        }
        cout<<endl;
        if((6-(a.size()%6))!=0)  cout<<6-(a.size()%6)<<endl;
    }
    return 0;
}

    程式中有一行輸出劃分後不符合六個一組的,多出來的字元位數。在提交答案時去掉多出來的位數即可。

Training: Crypto - Substitution I

Training: Crypto - Caesar II

思想還是凱撒密碼,但是k的大小從0-25變為了0-127.所以程式設計跑程式碼吧~總的思路是:十六進位制->十進位制->移位->(ASCII代表的)實際字元。發現作者有點調皮2333,把C替換成空格就好啦。

#include<iostream>
#include<string>
#include<math.h>
#include<stdio.h>
using namespace std;
int ch[300];
int main()
{
    string ss;
    cin>>ss;
    for(int i=0;i<ss.size();i++){
        if(ss[i]!='C')
            cout<<ss[i];
            else
                cout<<' ';
    }
    cout<<endl;
    string s;
    int sum=0;
    int T=245;
    int cnt=0;
    while(T--)
    {
        sum=0;
        cin>>s;
        sum+=(s[0]-'0')*16;
        if(s[1]>='A'&&s[1]<='F')
            {
                sum+=(s[1]-'A'+10);
            }
        else{
            sum+=(s[1]-'0');
        }
        ch[cnt]=sum;
        cnt++;
    }
    for(int i=1;i<=128;i++){
        for(int j=0;j<cnt;j++){
            char tmp=(ch[j]+i)%128;
            cout<<tmp;
        }
        cout<<endl;
    }
    cout<<endl;
    return 0;
}

    雖然這個程式碼可以直接看到解題結果,但其實有一段是後面加的喔~如果自己實在寫不出來參考了這個程式碼,要看懂它的意思喔!

Training: Crypto - Digraphs

題意是一個字母加密成兩個字元。做題前線猜了一下,前三十個是單詞Congratulations。從這個資訊點開始擴充,手動推算整個文字資訊(但我還是有幾個大寫字母不確定,不影響這題最後的答案)
    每重新開啟一次題目密文都會變…等找個時間寫一下程式碼,大概思路是替換了已經確定的字母以後,按照英語單詞,猜測其餘的字母。小寫全部能夠確定以後把整個文字都替換出來,得到solution。
P.S.我覺得自己手工推的方法有點慢,有時間寫下程式碼。

Training: MySQL I

遇到的第一道sql注入題!之前就學習過這個知識點,但是沒有進行實操。讓我們來看看原始碼叭!(躍躍欲試)
    首先點開作者貼心的放的高亮版本23333,抓住這句話:
$ query = “SELECT * FROM users WHERE username=‘usernameANDpassword=username&#x27; AND password=&#x27;password’”;
    在username處,利用 # 將password的驗證部分註釋掉,就可以通過啦。

Training: MySQL II

仔細一想倒是跟資料庫有很大關係,查了一下可以用UNION和SELECT來完成這次注入。主要思想是在輸入使用者名稱是向資料庫加入一條我們自己寫的資料,密碼填加入的這條資料中設定的程式碼。就可以騙過驗證。
     123 ’ union select 1 , ‘admin’ , md5(‘password’) #

Guesswork
看見群裡大家在討論這題【誤】不會寫爆破…就各種猜:
Do not re-use important passwords!
I think you are not even a legit user, since you post news items :WEIRD:
P.S.有沒有大佬告訴一下不這樣抖機靈的解法。

No Escape
看這道題好像提交的人挺多的就順手開始看了【大誤】
     題目說要求有一個人的票數達到111票,試了一下手工點可以計票,但是題目裡說明設定了在票數到達100的時候會清空【我沒手工去做,那樣去驗證也太煩了吧!】於是開始看程式碼,看一看關於計票的部分。
     在這一行上可以做文章:
$ query = “UPDATE noescvotes SET $who=$who+1 WHERE id=1”;index.php?vote_for=bill=111--
    Tip:一開始反單引號【`】打不對,一直在打單引號【‘】= =