作者:xd_xd
作者博客:http://xdxd.love/
solveme.peng.kr winter sleep
solveme是一個CTF的練習平台,其中winter sleep題目是這樣的。
<?php error_reporting(0); require __DIR__.'/lib.php'; if(isset($_GET['time'])){ if(!is_numeric($_GET['time'])){ echo 'The time must be number.'; }else if($_GET['time'] < 60 * 60 * 24 * 30 * 2){ echo 'This time is too short.'; }else if($_GET['time'] > 60 * 60 * 24 * 30 * 3){ echo 'This time is too long.'; }else{ sleep((int)$_GET['time']); echo $flag; } echo '<hr>'; } highlight_file(__FILE__);
輸入一個字符串,通過is_numric的判斷,要大於5184000小於777600,最後通過sleep函數,就可以輸出flag。顯然,如果輸入一個較大的數,會sleep很長時間。需要一個數大於5184000,然後int之後又要是一個很小的數。
解決的方案是這樣的:
<?php echo 60 * 60 * 24 * 30 * 2; echo "/n"; echo 6e6; echo "/n"; echo (int)'6e6'; echo "/n"; echo 60 * 60 * 24 * 30 * 3;
可以看以上腳本輸出內容:
5184000 6000000 6 7776000
使用科學計數法。
看了一些writeup,只是給出了解決的辦法,但是並沒有詳細的說明,為什麼會這樣。有的地方提到說是弱類型,雖然這幾次比較存在類型的自動轉換,但是跟我理解的弱類型的自動轉換存在差異。所以想要探究一番。
黑盒測試
转载请注明:IAMCOOL » 一個CTF GAME引發的php內核分析