Capture the Flag
CTF 奪旗
aka 資安競賽、安全競賽、網路攻防戰
目標:取得隱藏的flag
CTF - 解謎形式
Crypt 古典密碼學 - 各種猜猜樂
難度:easy
easyctf{r_wlmg_vevm_mvvw_zm_zhxrr_gzyov}
CTF - 解謎形式
現代密碼學 - 演算法的漏洞
難度:easy
RSA、MD5碰撞、SHA-1碰撞
CTF - 解謎形式
Forensics - 資料鑑識
難度:?
還是猜猜樂
分析檔案
分析封包
分析映像檔
CTF - 解謎形式
Reverse - 逆向工程,不給你code
難度:mid+
用用GDB來debug
用用XXX Pro反組譯(支持正版)
用用Java Decompiler破解app
注入二進位資料
很便宜的歐(不看單位的話)
CTF - 解謎形式
Pwn - 弱點分析
難度:hard
SQL Injection
Binary code Injection
Any bugly code
...
CTF - 解謎形式
Recon
難度:Pro
My name is Julian Cohen.
CTF - 攻防戰
給大家充滿bug的伺服器網內互打
CTF 與 生活
雖然比的項目類型有些十分奇葩
但是就是生活的一部份
古典密碼學
恩尼格瑪密碼機
第二次世界大戰普遍被德國使用,傳遞軍事資訊。
密碼破解據信提早了兩年結束戰爭
雖然破解的主因是拿到密碼(物理)
現代密碼學
為何現代網站會要求HTTPS或一堆安全措施
資料鑑識
2006年的機密資料使用2007年公布的字體?
逆向工程
各大遊戲、資訊業頭痛問題
攻防戰
天天都在發生的事
CTF 不只是比賽
更是生活的縮影
常見Bug
使用PHP
型別系統
"1234"+1
你了解正在寫程式語言嗎?
C/C++
PHP
Javascript
Python3
C/C++
234
--------------------------------
Process exited after 0.1786 seconds with return value 0
請按任意鍵繼續 . . .
#include<bits/stdc++.h>
using namespace std;
int main()
{
cout<< "1234"+1 ;
}
PHP
C:\Users\USER>php
<?php
echo "1234"+1;
1235
Javascript
console.log("1234"+1)
"12341"
Python3
>>>"1234"+1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not int
型別變換
晦澀的型別容易忽略傳入錯誤型別的處理
是否存在特殊數值會意外導致型別改變?
PHP的型別變換
Int vs Double
如果整數大於PHP_INT_MAX,會自動變double
64 bit : 9223372036854775807
32 bit : 2147483647
PHP的型別變換
Int vs Double
負數的最小值?
<?php
echo var_dump(PHP_INT_MIN);// = -9223372036854775808
echo var_dump(-9223372036854775808);
int(-9223372036854775808)
float(-9.2233720368548E+18) //WTF?
PHP的型別變換
Int vs Double
一般的程式語言沒有負數,只有負號運算(Ex. C++)
#define MB_LEN_MAX 5
#define SHRT_MIN (-32768)
#define SHRT_MAX 32767
#define USHRT_MAX 0xffffU
#define INT_MIN (-2147483647 - 1)
#define INT_MAX 2147483647
PHP的型別變換
Int vs Double
一般的程式語言沒有負數,只有負號運算(Ex. C++)
#define MB_LEN_MAX 5
#define SHRT_MIN (-32768)
#define SHRT_MAX 32767
#define USHRT_MAX 0xffffU
#define INT_MIN (-2147483647 - 1)
#define INT_MAX 2147483647
PHP的型別變換
string vs int+double
如果一個字串表示了一個合法的int
這個字串在被運算時會轉成int
若可以表示合法的double
這個字串在被運算時會轉成double
ex : "7122" , "6666","1.2e77"
PHP的型別變換
- 如果不能完整轉換,就從一個字元開始嘗試轉換到不能轉
- aka strtod
- "1 apple" == 1
- "no apple" == 0
string vs int+double
PHP的型別變換
- 恩,很簡單
<?php
$data = "1000";
$str1 = "10e2";
$str2 = "ppap";
var_dump( $str1 == $data );
var_dump( $str2 == $data );
bool(true)
bool(false)
string vs int+double
PHP的型別變換
- 0 vs "0" vs "" vs false vs [] vs null
true轉成字串是"1"
false傳成字串是"" ??
var_dump( (bool)"0" );
var_dump( (bool)"000" );
bool(false)
bool(true)
PHP字串 - 方便
$name = "apple";
$sql = "SELECT * FROM `sql` WHERE `name` = '{$name}'";
$name = "' OR 1=1 -- ";
$sql = "SELECT * FROM `sql` WHERE `name` = '{$name}'";
SELECT * FROM `sql` WHERE `name` = 'apple'
SELECT * FROM `sql` WHERE `name` = '' OR 1=1 -- '
true?'G':false?'t':'f'
C/C++:G
PHP:t
CTF & PHP bugly code
By sylveon
CTF & PHP bugly code
- 735