有了第一個就會有之後的很多很多個吧
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的話,自己去算一組其他的解吧