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+"\n"

 

 

挑一個最有可能的提交就是了。不要糾結為什么這么做,一道沒水平的腦洞題而已。

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[]="\x0B\x33\x33\x28\x20\x2E\x33\x26\x70\x20\x3D\x33\x39\x20\x37\x33\x30\x3A\x29\x28\x20\x33\x32\x29\x20\x31\x33\x36\x29\x20\x27\x2C\x25\x30\x30\x29\x32\x2B\x29\x20\x2D\x32\x20\x3D\x33\x39\x36\x20\x2E\x33\x39\x36\x32\x29\x3D\x72\x20\x18\x2C\x2D\x37\x20\x33\x32\x29\x20\x3B\x25\x37\x20\x2A\x25\x2D\x36\x30\x3D\x20\x29\x25\x37\x3D\x20\x38\x33\x20\x27\x36\x25\x27\x2F\x72\x20\x1B\x25\x37\x32\x6B\x38\x20\x2D\x38\x03\x20\x75\x76\x7C\x20\x2F\x29\x3D\x37\x20\x2D\x37\x20\x25\x20\x35\x39\x2D\x38\x29\x20\x37\x31\x25\x30\x30\x20\x2F\x29\x3D\x37\x34\x25\x27\x29\x70\x20\x37\x33\x20\x2D\x38\x20\x37\x2C\x33\x39\x30\x28\x32\x6B\x38\x20\x2C\x25\x3A\x29\x20\x38\x25\x2F\x29\x32\x20\x3D\x33\x39\x20\x38\x33\x33\x20\x30\x33\x32\x2B\x20\x38\x33\x20\x28\x29\x27\x36\x3D\x34\x38\x20\x38\x2C\x2D\x37\x20\x31\x29\x37\x37\x25\x2B\x29\x72\x20\x1B\x29\x30\x30\x20\x28\x33\x32\x29\x70\x20\x3D\x33\x39\x36\x20\x37\x33\x30\x39\x38\x2D\x33\x32\x20\x2D\x37\x20\x31\x25\x37\x37\x32\x34\x2A\x33\x25\x37\x26\x37\x72";

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}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM