天天看點

[Toddler's Bottle]-collision

有了第一個就會有之後的很多很多個吧

ssh [email protected] -p2222 (pw:guest)之後,發現跟上一個題的套路差不太多

看到了三個檔案col,col.c和flag,flag沒法直接打開,需要去看程式

cat col.c檢視源碼:發現有一個套路差不多:argc<2的判斷在第一題已經會了

另外,有了一個strlen的限制,長度必須是20位

想要拿到flag,就必須懂check_password這個函數

于是就拿着運作跑一次

./col ABCDEFGHIJKLMNOPQRST

說好的是20個不然退出了

按ASCII碼的順序寫入是為了便于判斷

看到了wrong passcode,說明分析得正确

于是,把源碼複制出來

在check_password()函數中,把所有的中間變量值輸出

同樣的輸入可以看到:

1145258561……

看到這個很明顯是10進制數,轉成16進制會有驚人發現:hex(1145258561)=0x44434241

就是ASCII碼哦!

那麼可以看到:現在的問題就是把20個字元分成五組每個四個字元

使得A1B1C1D1+A2B2C2D2+A3B3C3D3+A4B4C4D4=hashcode=0x21DD09EC

是以這個題肯定是多解的,從算法的角度來說找一組就可以

先算末尾,0xEC=236要分成5份就不可顯示了,是以要用0x1EC=492

492=5*98+2=3*98+2*99,是以呢,知道了寫3個b和2個c

注意,0x1EC借走1位,是以下一組用這種方法計算應該得到的是0x08,同理不夠分,再往上借

到了0x21呢,可以無數次借不用還,因為最高位自動溢出了不用管

注意!計算完了之後,需要看填寫的順序。

我們在輸入ABCD的時候,顯示的是0x44434241

有個分組和逆序的關系

提供一組可以看到flag的解:bhambhambhamchamchWl

想得到flag的話,自己去算一組其他的解吧

繼續閱讀