您的位置:首页 > 其它

WUST-CTF 2020 WriteUp

2020-04-24 09:50 731 查看

WUST-CTF 2020 WriteUp

  • Crypto
  • Misc
  • Reverse
  • 前言

    本文无任何跳步,过程十分详细,面向零基础的萌新(我也是萌新
    这次又被“面向萌新,题目友好”给骗了,我还是tcl。

    Web

    checkin

    打开链接发现要提交作者的名字,但是提交键无法点击

    于是按F12查看网页源代码找到提交键的元素,发现了disabled=“disabled”,把它删除后发现无法输入作者“52Hertz”,发现有maxlength="3"的限制,把3改成大数后就可以点击提交了。
    弹出来一个框,输入url进入博客。

    在主页发现了滚动的前半段flag,接着在博客里找后半段。

    文章翻到最后一页的最后一篇博客发现了“远古的blog”

    进入后翻到最下面找到了后半段,拼接即可。

    admin

    第一反应居然是sql注入。。。这里放的是我的奇yin方法,当时没想到要用万能密码(例如’or 1#)

    随便输个账号密码,用Burp Suite(以下简称BP)抓包
    把包复制粘贴到kali linux的文本文档里并保存

    sqlmap一下发现了一个302的url

    访问这个url,发现要本地ip,所以在BP抓的每一个包里都加上 X-Forwarded-For: 127.0.0.1


    GET请求,构造?ais=520

    POST请求,用Max HackBar 勾选Post Data wust=1314 Execution

    p和aste应该连起来,剩下的4dz,Rqr,cSf2排列组合即可

    把得到的这段base64解码即可

    CV Maker

    先注册一个账号并登录

    只有这个更换头像的地方可操作,看出是文件上传,试试一句话木马行不行


    更改content-type为image/jpg等操作都无法上传成功,查一下exif_imagetype


    找到CSDN里有这样一篇博客

    制作图片马

    上传2.jpg,抓包,send to repeater,把filename的后缀改为.php,send,在response里找到了上传的回显路径
    打开中国蚁剑进行连接,url为那个路径,密码为一句话木马的POST里的那个

    刚开始在html文件夹里翻了半天flag在哪(受ctfhub影响),最后在根目录里找到了flag和readflag

    打开flag发现是空的

    再打开readflag,是一堆乱七八糟的

    于是打开终端使用命令 ./readflag 执行文件得到flag

    朴实无华

    找不到什么注入点,sqlmap也无果,打开robots.txt看看发现了 /xxx.php

    进去看看有一个假flag

    按F12点网络看消息头,发现了look_at_me,进入/fl4g.php

    全是php代码,审计一波,有三个部分,第一个num要<2020,+1后还要>2021,查一下,php,弱类型,十六进制,构造num=0x2019成功了

    第2步要求md5加密前后相等,php把科学计数法0e后面全是数字的全当作0,Google到了这篇博客,piao过来一个md5=0e215962017

    最后一步:!strstr…可知get_flag里不能有空格,即空格被过滤了,要绕过,有<>,${IFS},%09等姿势;再看str_ireplace这句可知get_flag里面的cat都会被换成wctf2020,又要绕过;再看有system是执行get_flag里的命令语句,所以先用ls看一下目录(不用加"")
    cat用别的命令来代替,比如nl,tac等

    Crypto

    大数运算

    我也只配拿这种水题的第一解了。。。

    第一步在线算阶乘

    前八位转16进制

    第二步用电脑自带的计算器

    搜索宇宙终极,这篇文章里有三种xyz,第一种试了下不对,第二种对了

    算积分


    情书

    RSA算法,四位一组共八组,公钥2537和13,私钥2537和937,解出来iloveyou(也可根据“情书”盲猜诈胡)

    B@se

    base64的变种
    可知变种表里缺了四位,分别是j,u,3,4,排列组合一波
    写个python脚本,最后试出来34uj的顺序是对的

    import base64
    s1="JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs34ujkxyz012789+/"
    s2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    base=b'MyLkTaP3FaA7KOWjTmKkVjWjVzKjdeNvTnAjoH9iZOIvTeHbvD=='
    flag=''
    for i in base:
    if chr(i) != '=':
    index = s1.find(chr(i))
    flag += s2[index]
    else:
    flag +='='
    print(flag)
    print(base64.b64decode(flag))

    运行结果

    d2N0ZjIwMjB7YmFzZTY0XzFzX3YzcnlfZUBzeV9hbmRfZnVOfQ==
    b'wctf2020{base64_1s_v3ry_e@sy_and_fuN}'

    babyrsa

    又是RSA
    GitHub上下载RsaCtfTool,根据n和e算出来PEM格式的公钥
    再根据公钥算出来PEM格式的私钥
    用在线ctf工具根据私钥解析出d
    写个python脚本

    from binascii import a2b_hex
    c=28767758880940662779934612526152562406674613203406706867456395986985664083182
    d=30854876581442056228588093398155288897790570329196285069001545119486056472273
    n=73069886771625642807435783661014062604264768481735145873508846925735521695159
    flag=a2b_hex(hex(pow(c,d,n))[2:])
    print(flag)

    运行结果

    b'wctf2020{just_@_piece_0f_cak3}'

    佛说:只能四天

    根据提示“圣经分为《旧约全书》和《新约全书》”可知是新与佛论禅,Google一下在线工具,复制粘贴并在开头加上 佛曰: 参悟佛所言的真谛,解码出了核心价值观编码
    在线ctf工具解码,根据结尾的doyouknowfense可知是栅栏密码
    去掉结尾的doyouknowfense后在线解码,每组字数试到4出来了doyouknowCaesar可知是凯撒密码
    在线凯撒解码(凯撒因为位移是3所以被叫作凯撒)
    把得到的编码base解码,base64失败,base32成功了

    Misc

    Space Club

    打开文件是个空的txt,Ctrl+A发现有好多有规律的空格
    Google一下找到了一篇UUTCTF 2019的writeup(英文的,翻译一下)
    把代码copy一下,路径改成自己的,并要在前面加上一个r(报错了,百度才知道的),否则不行

    f = open(r"C:\Users\1\Desktop\space-1.txt", "r")
    
    text = f.read()
    
    to_hex = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ]
    
    space = 0
    for c in text:
    
    if c == ' ': space += 1
    if c != ' ' and space > 0:
    print(to_hex[space], end='')
    space = 0

    运行结果全是6和C

    6CCC6CCC6CC666CC6CCC6C666CC66CC666CC66C666CC666666CC66C666CC66666CCCC6CC6CC6C66666CC66CC6CCC66C66CC66C6C6C6CCCCC66CC666C6CCC66CC6C6CCCCC6CCCC66C66CC66666CCC6C6C6CCC66C66C6CCCCC6CC66CC66CC6CC666C6666666CC66CCC6C6CCCCC6CCC66CC66CC666C6CCCC6666C6CCCCC6CCC66CC66CC666C6CCCC6666C6CCCCC6CCC66CC66CC666C6CCCC6666CCCCC6C

    盲猜一波是二进制,自己写个C++把6换成0,C换成1

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    string s="6CCC6CCC6CC666CC6CCC6C666CC66CC666CC66C666CC666666CC66C666CC66666CCCC6CC6CC6C66666CC66CC6CCC66C66CC66C6C6C6CCCCC66CC666C6CCC66CC6C6CCCCC6CCCC66C66CC66666CCC6C6C6CCC66C66C6CCCCC6CC66CC66CC6CC666C6666666CC66CCC6C6CCCCC6CCC66CC66CC666C6CCCC6666C6CCCCC6CCC66CC66CC666C6CCCC6666C6CCCCC6CCC66CC66CC666C6CCCC6666CCCCC6C";
    for(int i=0;i<s.size();i++)
    {
    if(s[i]=='6')
    s[i]='0';
    else
    s[i]='1';
    }
    cout<<s;
    return 0;
    }

    运行结果
    在线二进制转字符串

    Welcome

    文件夹里的三个文件要一起,不能只把exe拿出来,丢到ida里也看不出来啥东西

    题目说明

    Google一下是第十二届全国大学生信息安全竞赛线上初赛的签到题,摄像头里要识别到三个人脸

    就出来flag了

    下载下来是无后缀文件

    丢到winhex里看一下在开头发现了PDF
    把后缀加上.pdf就可以打开了

    flag被图片覆盖住了,把图片拖开就看到了16进制字符串(不要转成word再拖),在线16进制转字符串即可

    Find me

    以为是图片隐写,winhex,binwalk都没啥线索
    属性的详细信息里发现了八点式盲文,Google在线工具(千千秀字)解码即可,不要丢掉结尾的=,我刚开始以为没用,解不出来,白费了我几个小时搜别的工具

    girlfriend

    音频文件隐写

    丢到Audacity里,刚开始以为是摩斯密码(长短),解出来不对,听一下像是电话按键音
    Google在线Detect DTMF Tones上传wav解出来下面的这段数字,像是手机拼音九键键盘,解出来发现只有前半段,根据名字girfriend盲猜是youaremygirlfriend,再跟音频对比一下发现位数不对,最后有一个连续按四下的音,再看九键键盘推理出来最后一位加上个s

    Shop


    在kali linux里输入一下命令,再输入1,2多试试
    Google一下找到了一篇英文的PicoCTF 2019 Writeup,里面有一道flag_shop,可知如果输入一个大数,就会溢出变成一个大负数


    输入3579138,就有钱了,有钱就能买flag了,有钱真好

    Reverse

    Cr0ssFun

    拖进ida里,把里面每一个函数都点开,再copy到自己的C++里,把&&,==等格式改一下输出a1就行了

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    char a1[100];
    a1[0] = 119 ;
    a1[6] = 50;
    a1[22] = 115;
    a1[31] = 110;
    a1[12] = 95;
    a1[7] = 48;
    a1[16] = 95;
    a1[11] = 112;
    a1[23] = 101;
    a1[30] = 117;
    a1[10] = 112;
    a1[13] = 64;
    a1[3] = 102;
    a1[26] = 114;
    a1[20] = 101;
    a1[1] = 99 ; a1[25] = 64;  a1[27] = 101;
    a1[4] = 50 ; a1[17] = 114 ; a1[29] = 102 ; a1[17] = 114 ; a1[24] = 95;
    a1[2] = 116;
    a1[9] = 99;
    a1[32] = 125;
    a1[19] = 118;
    a1[5] = 48;
    a1[14] = 110;
    a1[15] = 100;
    a1[8] = 123;
    a1[18] = 51;
    a1[28] = 95;
    a1[21] = 114;
    cout<<a1;
    return 0;
    }

    运行结果

    level1

    根据output可知这些数都是输出的结果
    拖进ida里看一下,把for循环里面的逆过来就行了
    把output作为a[20]里的值,但是注意i是从1开始的,所以要给a[0]赋个值,把ld改成c,unsigned int改成char,<<改成>>,*改成/

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    long a[20]={0,198,232,816,200,1536,300,6144,984,51200,570,92160,1200,565248,756,1474560,800,6291456,1782,65536000};
    for (int i = 1; i <= 19; ++i )
    {
    if ( i & 1 )
    printf("%c", (char)(a[i] >> i));
    else
    printf("%c", (char)(a[i]/i));
    }
    return 0;
    }

    运行结果

    • 点赞 1
    • 收藏
    • 分享
    • 文章举报
    WustHandy 发布了2 篇原创文章 · 获赞 2 · 访问量 783 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: