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

  • 751