zoukankan      html  css  js  c++  java
  • 2019年领航杯 江苏省网络信息安全竞赛 初赛部分writeup

    赛题已上传,下载连接:https://github.com/raddyfiy/2019linghangcup

    做出了全部的misc和前三道逆向题,排名第10,暂且贴一下writeup。

    关卡一 编码解码

    base64解码即可。flag:

    WelcometothepilotCup

    关卡二 取证分析

    注意到DNS查询名QNAME前面有一串16进制的串,先写脚本查看一下字符串:

    from scapy.all import *
    
    r = rdpcap("pacp.pcap")
    
    a = ""
    
    b = ""
    
    for i in range(0,len(r)):
    
    a = r[i][DNSQR].qname
    
    b = a.replace(".skullseclabs.org.","")
    
    print (b.replace(".","")).decode("hex")

    得到了

    看来方向是正确的,并提示我此流量是使用dnscat2生成的。

    在输出中,还可以找到 IEND。因此存在被传输的PNG文件。

    把部分字节dump下来,发现与图像相关的字节在跳过9个字节之后开始。于是写脚本生成图片文件:

    #!python2
    
    from scapy.all import *
    
    r = rdpcap("pacp.pcap")
    
    a = ""
    
    b = ""
    
    c = ""
    
    new = ""
    
    f = open("filedump","w")
    
    for i in range (0,len(r)):
    
    if r[i].haslayer(DNSQR) and not r[i].haslayer(DNSRR):
    
    a = r[i][DNSQR].qname
    
    b = a.replace(".skullseclabs.org.","")
    
    b = b.replace(".","").decode("hex")[9:]
    
    if b == c:
    
    continue
    
    c = b
    
    if 6 < i <365:
    
    new = new + b
    
    f.write(new)
    
    f.close()

    用winhex打开,发现确实如此。

    把首尾的垃圾数据删掉就能打开此图片了

     

    FLAG:b91011fc

    关卡三 steganoⅠ

    查看16进制,发现flag

    steganoI

    关卡四 stegano

    用binwalk扫一下,发现图片后面还包含了其他文件,提取后得到一个solution.txt,打开就是flag。

    EORDFFOMFPMA

    关卡五 LSB

    其实这道题不是LSB隐写,是吧flag写到了一个通道里,用stegsolve可以看到。

     

    ONPGRAMBCICM

    关卡六 恢复与解密

    用取证大师直接把删除的内容回复,可以看到很多文本。

     

    有价值的是这个

    在网上搜这个字符串,会指向https://blog.csdn.net/weixin_42213572/article/details/80322393

    ,应该是其他比赛的题。

    脚本:

    #!python2
    
    import string
    
    from base64 import *
    
    b=b64decode("aWdxNDs3NDFSOzFpa1I1MWliT08waWdx")
    
    data=list(b)
    
    for k in range(0,200):
    
        key=""
    
        for i in range(len(data)):
    
            key+=chr(ord(data[i])^k)
    
        print key+"
    "

    挑一个最有可能的提交就是了。不要纠结为什么这么做,一道没水平的脑洞题而已。

    jdr78472Q82jhQ62jaLL3jdr

    关卡七 文件提取

    用记事本打开文件,发现是data:image/jpeg开头的一个base64格式的图片,还原图片后把图片用winhex打开,在末尾发现flag

    flag{068EEF6A7BAD3FDF}

    关卡八     凯撒Ⅰ

    基本的凯撒密码,用工具枚举出所有可能,挑一个最有意义的。

    MOCONLFPEOLD

     

    关卡九 凯撒Ⅱ

    改成了ascii码下的凯撒密码,所以需要写个脚本枚举。

    #include<stdio.h>
    
    #include<string.h>
    
    #include<windows.h>
    
    int main(){
    
    int i,j;
    
    char str[]="x0Bx33x33x28x20x2Ex33x26x70x20x3Dx33x39x20x37x33x30x3Ax29x28x20x33x32x29x20x31x33x36x29x20x27x2Cx25x30x30x29x32x2Bx29x20x2Dx32x20x3Dx33x39x36x20x2Ex33x39x36x32x29x3Dx72x20x18x2Cx2Dx37x20x33x32x29x20x3Bx25x37x20x2Ax25x2Dx36x30x3Dx20x29x25x37x3Dx20x38x33x20x27x36x25x27x2Fx72x20x1Bx25x37x32x6Bx38x20x2Dx38x03x20x75x76x7Cx20x2Fx29x3Dx37x20x2Dx37x20x25x20x35x39x2Dx38x29x20x37x31x25x30x30x20x2Fx29x3Dx37x34x25x27x29x70x20x37x33x20x2Dx38x20x37x2Cx33x39x30x28x32x6Bx38x20x2Cx25x3Ax29x20x38x25x2Fx29x32x20x3Dx33x39x20x38x33x33x20x30x33x32x2Bx20x38x33x20x28x29x27x36x3Dx34x38x20x38x2Cx2Dx37x20x31x29x37x37x25x2Bx29x72x20x1Bx29x30x30x20x28x33x32x29x70x20x3Dx33x39x36x20x37x33x30x39x38x2Dx33x32x20x2Dx37x20x31x25x37x37x32x34x2Ax33x25x37x26x37x72";
    
    for(i=0;i<129;i++){
    
    for(j=0;j<strlen(str);j++){
    
    putchar((str[j]+i)%128);
    
    }
    
    putchar(10);
    
    }
    
    system("pause");
    
    return 0;
    
    }

    答案:

    Massnpfoasbs

     

    关卡十 ascii

    对照编码表,把ascii还原出来即可。

    Ihbdsieopdcn

     

    关卡十一       forensics

    用foremost提取docx文件里的所有文件,第二张图即是flag

     

     

    关卡十三       OldCypher-Easy

    维吉利亚加密

    在这个网站破解https://www.guballa.de/vigenere-solver

    flag{d06f849b8bb85a5821aa7d9aa5169a38d620016f}

     

     

    关卡十四  MasterofZip-Middle

    level1:因为是纯数字,所以先暴力破解,得到密码19950453796

    解压后出来Readme.txt和level2.zip,发现level2.zip里也有一个Readme.txt,把已知的Readme.txt压缩后发现与level2里的文件crc相同:

     

    此时符合zip明文攻击的条件,用AZPR攻击后得到一个无密码的文件,解压得level3.zip。

    经过不断测试,level3是一个伪加密,用ZipCenOp工具可以还原正常,解压得到图片flag.png,检查后发现crc校验不对,推测是高度隐写,把高度手动修改即可看到完整图片

     

     

     

    flag{4537ec3bd52ba2b41c4a780db841efc3ddccc4a4}

    关卡十五 数据包分析-Easy

    用strings直接可以看到flag

     

     flag{3eyufhnj87}

     

    关卡十六easyelf

    可以直接用angr分析,脚本:

     

    import angr
    
    import claripy
    
    p= angr.Project('./easyelf',auto_load_libs=False)
    
    state=p.factory.entry_state()
    
    simgr=p.factory.simgr(state)
    
    simgr.explore(find=lambda s: b"right." in s.posix.dumps(1))
    
    print(simgr.found[0].posix.dumps(0))

    flag{Thunk_c0des_xoR_thr3e_de4l}

     

    EasyRSA

    phint和qhint就是常见文章里的dp和dq,他俩加上c、e、n全部已知的话是可以实现任意密文解密。

    参考文章:

    https://skysec.top/2018/08/24/RSA%E4%B9%8B%E6%8B%92%E7%BB%9D%E5%A5%97%E8%B7%AF(1)/

    脚本:

    import gmpy2
    
    import libnum
    
    e = 65537
    
    n = 16969752165509132627630266968748854330340701692125427619559836488350298234735571480353078614975580378467355952333755313935516513773552163392952656321490268452556604858966899956242107008410558657924344295651939297328007932245741660910510032969527598266270511004857674534802203387399678231880894252328431133224653544948661283777645985028207609526654816645155558915197745062569124587412378716049814040670665079480055644873470756602993387261939566958806296599782943460141582045150971031211218617091283284118573714029266331227327398724265170352646794068702789645980810005549376399535110820052472419846801809110186557162127
    
    dp = 1781625775291028870269685257521108090329543012728705467782546913951537642623621769246441122189948671374990946405164459867410646825591310622618379116284293794090970292165263334749393009999335413089903796624326168039618287078192646490488534062803960418790874890435529393047389228718835244370645215187358081805
    
    c = "0x7b5d1ea2d92df27239817ce8d885e1f66569dd41e075efc13d09dd1df673a8fba68ec7487c1552028e9eb9ba6663983f96d01925bbdfd18398e44f970257fa0f96b6ec915d05d637ebb4c8f4c56c44b2bb46bd1afe5a67acd640585dccf1681155308c0663cb57fccdc10c097c454dafdd2a96ccd08e9a2a8b0a9727bbe9945e579b0652d1c1d826305f0dd716cfb647cadb8eca1a0286dfb938b60b89981403d4faa6df54cfac0fa4699c97aeba6e82ab575cd6aa4421018cf9b404836c02b5301dbc475a0bcc5eef86bcbeb89a73355dbeb80e7b4d23c7a39f32c6b6138125c73892633f46b0bf1114aa67f09e1d394dfa4020e318f7d8004b84fc835b1ee9L"
    
    c = int(c[:-1], 16)
    
    for i in range(1,65538):
    
        if (dp*e-1)%i == 0:
    
            if n%(((dp*e-1)/i)+1)==0:
    
                p=((dp*e-1)/i)+1
    
                q=n/(((dp*e-1)/i)+1)
    
                phi = (p-1)*(q-1)
    
                d = gmpy2.invert(e,phi)%phi
    
                print libnum.n2s(pow(c,d,n))

     

    关卡十八 KEYboard

    首先查看流量包,可以发现是抓取了键盘输入,第三个字节是有效键位,

    所以对照键位表一个个的读:https://web.archive.org/web/20160505193717if_/http://www.usb.org/developers/hidpage/Hut1_12v2.pdf

    可以还原出来输入内容:

    ipa<ESC>oover1<ESC>Ohonk<ESC>$jAe<ESC>As<ESC>joOF<RET>Nanle<ESC>k$3kAis<ESC>qqJxq3@qFFrfFaasswd

    但观察到里面有ESC等控制符,经过不断尝试,发现是在vim里的操作,于是使用gvim,照着敲一次可以得到:

    passwdishonkover1esOfNanle

    所以解压密码是honkover1esOfNanle

    用这个密码解压压缩包secret.zip即可。

    flag{aa3783395a0e50e0cd1e714e5427d8c0cc1a7fe5}

     

    关卡二十四   EasyRE

    用IDA打开,可以看到程序会把一个固定串按照偶数位在前奇数位在后的顺序与输入进行比较。所以写出解密脚本:

    #include<stdio.h>
    
    #include<string.h>
    
    int main(){
    
    int i;
    
    char str[]="lfgaL{teU__stsr4_t3R3vSr}e";
    
    for(i=0;i<=strlen(str);i+=2){
    
    putchar(str[i+1]);
    
    putchar(str[i]);
    
    }
    
    return 0;
    
    }

    flag{Let_Us_st4rt_R3v3rSe}

     

    关卡二十五 EASYReverse

    用IDA打开,可以看到程序是吧输入进行处理,再与一个固定串进行比较。由于处理过程涉及位运算,故无法从固定串逆推出输入,所以必须用符号执行的方式破解。

    把关键的输入处理代码提取出来,稍作修改后重写出一个程序。在这个简化版的程序就可以用angr直接跑出flag。

    程序代码:

    #include<stdio.h>
    
    #include<string.h>
    
    int main(){
    
    int v3,a3; // edi
    
    int v5,index; // esi
    
    char input[39];
    
    char newstr[53];
    
    char target[]="IVaQIg]:DfDcL7=VN64bF3TfEE=WCCDh<c@fM3ADHCPgME9ANGd";
    
    scanf("%s",&input);
    
    v3 =strlen(input);
    
    a3=strlen(input);
    
    v5 = 0;
    
    index=0;
    
    if ( a3 - 2 > 0 ){
    
    do{
    
    newstr[index] = ((input[v5] >> 2) & 0x3F) + 48;
    
    newstr[index+1] = (16 * (input[v5] & 3) | (input[v5 + 1] >> 4) & 0xF) + 48;
    
    newstr[index+2] = ((input[v5 + 2] >> 6) & 3 | 4 * (input[v5 + 1] & 0xF)) + 48;
    
    newstr[index+3] = (input[v5 + 2] & 0x3F) + 48;
    
    v5 += 3;
    
    index += 4;
    
    }
    
    while ( v5 < a3 - 2 );
    
    v3 = a3;
    
    }
    
    if ( v5 < v3 ){
    
    newstr[index] = ((input[v5] >> 2) & 0x3F) + 48;
    
    if ( v5 == v3 - 1 ){
    
    newstr[index+1] = 16 * ((input[v5] & 3) + 3);
    
    newstr[index+2] = 32;
    
    }
    
    else{
    
    newstr[index+1] = (16 * (input[v5] & 3) | (input[v5 + 1] >> 4) & 0xF) + 48;
    
    newstr[index+2] = 4 * ((input[v5 + 1] & 0xF) + 12);
    
    }
    
    index += 4;
    
    newstr[index+3] = 32;
    
    }
    
    newstr[index] = 0;
    
    if(strcmp(newstr,target)==0){
    
    puts("yes");
    
    }
    
    return 0;
    
    }

    Angr破解代码:

    import angr
    
    import claripy
    
    p= angr.Project('./basere',auto_load_libs=False)
    
    state=p.factory.entry_state()
    
    simgr=p.factory.simgr(state)
    
    simgr.explore(find=lambda s: b"yes" in s.posix.dumps(1))
    
    print(simgr.found[0].posix.dumps(0))

    结果就出来了:

     flag{JSe3psfxa2X96USgM58346t4Ta87uRQy}

  • 相关阅读:
    读《大道至简》第一章有感
    jdk和jre的区别
    题解 LA2911
    题解 UVa11461
    题解 UVa10791
    题解 UVa11489
    题解 LA2889
    题解 UVa11609
    题解 UVa11076
    题解 UVa11752
  • 原文地址:https://www.cnblogs.com/cnnnnnn/p/11939107.html
Copyright © 2011-2022 走看看