zoukankan      html  css  js  c++  java
  • NJCTF 极少部分wp

    前沿:刚刚结束了NJCTF,做出来的题目很少。

    1,----非常简单的misc , check QQ ,直接在QQ群可以看到发布的flag.

    2,konck----hint:韩琛截获了一张纸条,突然记起来记录到房间里有人敲桌子,先下载附件,我们解压可以看到两个txt文件夹,刚看到这个题目的时候,受到题目的影响,以为是摩斯密码,后来试了好几遍都失败了,所以不是摩斯密码,后来又对比着看,发现这个一个txt文件(...._....._.._...._..._....._...._..._..._...._...._......._._...._....._.._...._..._..._...._...._..._..._...._.._..._......._..................

    )中的.和另一个txt文件(zjqzhexjzmooqrssaidaiynlebnzjovosltahzjerhorrqxoeironlobdozavoouzjovosqfqsltahmqnqrrjotoerzjohorrqxoebooqydrztyqqojolx

    )中的字母是一样的,试着替换了一下,结果是:zjqz_hexjz_mo_oqrs_sai_daiyn_lebn_zjo_vos_ltah_zjer_horrqxo_e_iron_lobdo_za_voou_zjo_vos_qfqs_ltah_mqn_qrr_joto_er_zjo_horrqxo_ebooqydrztyqqojolx然后在线解密(http://quipqiup.com/)得到:that_ might_ be_ easy_ you_ could_ find_ the_ key_ from_ this_ message_ i_ used_ fence_ to_ keep_ the_ key_ away_ from_ bad_ as s_here_ is_ the_ message_ in e e alcs tr laaeh e f g,然后意思是说key在这段话里面,感觉是后面的,然后把后面的空格去掉,试了好几次,证明后面十八位然后栅栏密码得到下面图所示:然后提交即可。

    3,login----我首先登陆了进去,然后看到admin才能get the flag ,因为我不是admin,所以失败,然后想到用mysql数据库的数据类型长度截断的性质,如果数据超过了长度会被截断,所以注册的时候可以这样构造:admin                                 a,中间一大串空格,然后再登陆,登陆的时候直接用admin登陆就行了,然后输入刚刚注册时候的密码,进去之后就得到了flag。

    4,getflag----这个题是文件读取,使用Linux命令,我们可以构造语句,我们输入xxx%26ls ../../,这里的xxx是胡乱输的,%26是&,用&链接命令,但是&不行,所以转一下%26,ls是linux下的指令,ls ../把网站目录向上走,然后源码是base64,解密就行了,输入xxx%26ls ../../结果可以看到flag文件,用cat读文件就得到flag了。

    5,Wallet (这个题得到了P师傅的循循教导,不然可能做不出来)----首先把网站扫了一下,结果扫出来个www.zip压缩包,但是加密了,官方提示密码是弱口令,试了好几遍,后来njctf2017成功了,里面是admin.php,打开之后是乱码,然后找个网站解了一下密(http://tool.lu/php/用phpjm解密),得到了admin.php的php代码,首先我们分析一下,

    if ($auth)                                         
        {                                                  
            if(isset($_GET['query']))

     我们首先得让$auth等于1,那么我们看上面,

    else if (sha1((string)$hsh) == md5((string)$auth))
            {
                $auth = 1;
            }

     所以我们知道sha1((string)$hsh和md5((string)$auth相等的时候才能让$auth = 1;这个是==(  ===是恒等计算符   同时检查表达式的值与类型

    ==是比较运算符号  不会检查条件式的表达式的类型   ),不是绝对等于,相关知识不会的百度,所以我们需要找相关的字符串,往上面都有,我找了两个,其中s878926199a    md5后是0e545993274517709034328855841020,10932435112  sha1加密后是0e07766915004133176347055865026311692244(详情请看我上一篇0e开头MD5值小结),所以这两个就可以绕过if ($auth) ,接下来是query,$_GET['query'],看代码队伍说感觉是注入,首先我们先下载cookie管理器(火狐,这里我用bp没整出来flag你们可以试试,整出来了麻烦给我留言,谢谢),把题目的地址Refresh,然后收到cookie,我们把收到的auth和hsh都换成对应的s878926199a和10932435112,然后我们去注入,我们在admin.php后面输入 ?query=1,结果显示数字,所以存在注入,我们用union注,我刚开始猜的是flag,所以我刚开始输入了?query=1 and 1=2 union select flag from flag(注意这个后面不需要加#,用了反而会出错),结果是错误的,后来我又试了id,输入?query=1 and 1=2 union select id from flag结果flag出现了,这里我就不多说了,你们可以按照常规的来,当然就是你们的事情了,任重而道远。

    6,这个是队友做出来的,下面的是  easy_crypto  的writeup。
    easy_crypto的附件是一个压缩包。包中有四个文件,Cipher.txt encrypt.c flag.txt plain.txt。其中Cipher.txt是plain.txt加密后的文件。
    加密算法是encrypt.c。而flag.txt是明文加密后的文件,只要我们解密出来这个文件即可得出flag。
    下面给出加密算法:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    int main(int argc, char **argv) 
    {
        if (argc != 3) 
        {
            printf("USAGE: %s input_file output_file
    ", argv[0]);
            return 0;
        }
        FILE* input_file  = fopen(argv[1], "rb");
        FILE* output_file = fopen(argv[2], "wb");
        if (!input_file || !output_file) 
        {
            printf("Error
    ");
            return 0;
        }
        char key[] = "XXXXXXXXXXXX";
        char p, t, c = 0;
        int i = 0;
        while ((p = fgetc(input_file)) != EOF) 
        {
    
            c = ((key[i % strlen(key)] ^ t) + (p-t) + i*i ) & 0xff;
            t = p;
            i++;
            fputc(c, output_file);
        }
        return 0;
    }

    但是观察得出key不知道是多少?这时候,题目给的Cipher.txt ,plain.txt就起到作用了,通过这两个文件来得出key。
    下面给出代码。

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include<iostream>
    using namespace std;
    
    int main()
     {
        FILE* input_file  = fopen("plain.txt", "rb");
        FILE* output_file = fopen("cipher.txt", "rb");
        char key[100];
        char p, t, c = 0;
        int i = 0;
        while ((p = fgetc(input_file)) != EOF&&(c = fgetc(output_file))!=EOF)
        {
            key[i]=(c -((p-t) + i*i ))^t;
            t = p;
            i++;
        }
        cout<<key<<endl;
        return 0;
    }

    字符串如下:
    OKIWILLLETYOUKNOWWHATTHEKEYIS
    OKIWILLLETYOUKNOWWHATTHEKEYIS
    OKIWILLLETYOUKNOWWHATTHEKEYIS
    OKIW
    从这上面我们可以得出:
    key数组就是OKIWILLLETYOUKNOWWHATTHEKEYIS。
    得到key之后,我们就要解密密文,还要写出算法:

    #pragma once
    #pragma execution_character_set("utf-8")
    #include <stdlib.h>
    #include<ctype.h>
    #include <stdio.h>
    #include <cstring>
    #include<iostream>
    using namespace std;
    
    int main()
    {
        FILE* input_file = fopen("flag.txt", "rb");
        char key[] = "OKIWILLLETYOUKNOWWHATTHEKEYIS";
        char flag[100] = "";
        char p,t,c;
        p = t = c = 0;
        int i = 0;
        while ((c = fgetc(input_file)) != EOF)
        {
            p = c - i*i + t - (key[i % strlen(key)] ^ t);
            flag[i] = p;
            t = p;
            i++;
        }
        cout << flag << endl;
        return 0;
    }

    于是Flag:NJCTF{N0w_You90t_Th1sC4s3}。


    上面就是所以做出来的题目,任重而道远,还需要更加努力!
  • 相关阅读:
    安卓打包名称
    安卓判断麦克风权限
    Redis基础了解
    Redis的安装
    SVN的日常使用和安装
    Maven基础2
    Maven基础1
    ResultSet的Type
    Hibernate高级查询QBC条件设置——Restrictions用法 引自:http://www.cnblogs.com/evon168/archive/2010/10/29/1863059.html
    Spring配置事务 http://www.cnblogs.com/leiOOlei/p/3725911.html
  • 原文地址:https://www.cnblogs.com/Oran9e/p/6540538.html
Copyright © 2011-2022 走看看