Category:C
Found 3 records. At Page 1 / 1.
-
2017-12-24 12:29:37更新於 2017-12-24 19:36:21
最近不知道為啥,突然心血來潮一直想要來編譯 USB隨身碟,做一支 BadUSB,遺憾的是一直找不到目標型號的控制器(Controller)。後來搜尋,沒想到網路上竟然已經有賣類似功能的東西了!
BadUSB 顧名思義就是壞的 USB 碟,會執行一些程式碼,可能會讓電腦受損,而這類攻擊都是需要實體插入電腦裡面的,並且,防毒軟體有很大機率是掃描不到,程式碼都是在閃存控制器(Flash Memory Controller)裡面,除非很底層的軟體,否則幾乎是碰不到那區塊。
雖然一般隨身碟拿來修改的話,價格比較便宜,但是不太好操作,真正的 Rubbery Ducky 又太貴了,買不起。網路上的 Arduino 做成的微型控制器比較便宜一點。很久以前也有萌生用 Arduino 實作的想法,不過太醜了,就是一塊電路板,沒有殼,網路上找不太到賣殼的,而現在我找到的真的很精美,不是 MicroUSB 所以連轉接都不用,於是乎買來體驗一下。僅僅是測試,至於啥麼用途,可以自由發揮,例如:騙別人這是普通的隨身碟之類的,插上去就立刻變身成鍵盤執行惡意代碼。

上圖即是我網購的帶有 Arduino ATmega32U4 控制器的 USB,外觀就像正常的隨身碟,不是所有 Arduino 都可以當成鍵盤用,例如 Arduino Nano 就不行。
這樣一來就可以把 Arduino 當成 Rubbery Ducky 使用,直接實行 Hid Keyboard Attack。網路上已經有教學文章可以直接將 Rubbery Ducky 的程式碼 轉為 Arduino專用的程式碼。這樣就不太需要自己修改。
可以參考:https://github.com/Nurrl/Duckuino
以上是我編譯的 Script Example,用途是立刻將電腦關機,當我實際運行時有遇到不少麻煩,好像開不了 Windows Key + R Key,最後解決方法是把
就這個單雙引號害我 Debug 好久,加上 Delay 好像也沒用。覺得奇特。
運行結果如下方影片:

WeilsNetLogo
This entry was posted in Arduino, C, General, Experience, Functions, Note By Weil Jimmer
.
-
2017-11-02 13:56:57更新於 2017-11-03 23:48:45

0x00 前言
最近會想寫這篇文章主要是在網路上無意間看到了RFID相關裝置,突然萌生很久以前一直想玩的事情,於是乎,就打算來實作門禁卡的複製。再加上好久沒寫文章,現在我也懶得管是不是技術成分很重才寫,以後文章我大概也是這樣,寫得很淺,除非我研究了什麼很困難的東西。
其次,真心很感謝 Joe Jimmy 的裝置贊助,不然我大概也不會去做這個實驗,至少要等到以後購買裝備時才會做起。
0x01 目的
為了通過感應 MIFARE卡 的門禁系統,因此需要複製有效的密碼卡而進入該門。
0x02 原理
目前大部分學校門禁系統都採用 13.56 MHz 頻率的 RFID 感應卡,且學生證普遍都是和悠遊卡公司合作的學生證,基本上都是有 KeyA 和 KeyB 和 控制位元保護的。因此門禁系統想用學生證刷過,"應該是"只能採用識別 UID 的方式來驗證使用者的身分,進而決定是否開放使用者進入。如果是另外發放密碼卡,則可能該密碼卡有經過加密,驗證使用者可能不是驗證 UID,若如此,這篇文章就不適用於這種驗證方法。本篇文章僅針對 UID 部分的驗證做出複製卡 (Clone Card)。
0x03 配備
- Arduino Mega 2560
- MFRC522
- 數張 可修改 UID 的 S50 空白卡
- 蜂鳴器(非必須,覺得有聲音比較好。)
0x04 結果
以下是我寫卡UID的程式碼是參考 這篇文章 寫的,稍作修改,lib 也是採用同篇 GitHub 文章。
以上程式碼之功能是將要被複製的卡貼近 RC522模組,然後再將要被寫入UID的卡貼近,寫入動作結束時會B兩聲,此刻再去檢查Output的值看看有沒有寫入成功。我目前的設定是第二張卡超過10秒就不寫入了,不是無限等待,要再把第一張靠近,在10秒內放入第二張卡。
學會這個小伎倆,往後只要撿到別人的學生證就有機會可以複製對方卡的資訊,之後就可以直接進入別人的宿舍。或者是有設門禁卡的公寓、公司、飯店…等場所,就可以多備份幾把鑰匙卡。紀錄UID也未必要使用模組,有NFC功能的手機就可以讀取資訊,甚至是寫入卡片資料或模擬 UID。
再次提醒,目前複製卡的成果僅次於 UID 的讀寫,如果門禁系統採用非 UID 認證,而是使用 KeyA 或 KeyB 及 控制位元,那就可能必須破解其卡片密鑰才可以存取特定資料,否則就無法輕易的複製卡片資料。

以上是寫入卡片成功的示意圖片。

五張特製可修改 UID 的 S50 卡都被修改為相同的 UID。

這裡文章就差不多到結尾了,我想先說明幾件需要注意的事。
首先,空白卡不是所有卡片都可以修改 S0B0 (Sector 0 Block 0) 區塊的製造商資訊(這裡也是 卡號UID 的所在之處),有很多卡片都是直接燒死的,要嘛是 WriteOnce,要嘛就直接不給寫。要購買卡片時要先注意那張卡片到底可不可以修改,一般正常S50標準卡都是不可寫的,UID不給修改。
其次就是頻率一定要對得到。卡片也有頻率的,隨便亂買門禁空白卡,可能會買到 125KHz 的低頻卡,那就不合目前的模組的頻率,也比較少見。目前悠遊卡、一卡通普遍都是採用 13.56 MHz 的卡片。
最後,卡片也是大有學問的,每種卡都有使用說明書 DataSheet,扇區的數量那些都不一定,而且UID不僅僅是4個Byte,也許是7個Byte,甚至是10個。至於前面S0B0區呢,配置也是有一定規章的,這篇文章我就不講那麼詳細了。反正沒有要到完全複製卡的程度,講那麼多卡區的沒什麼意思。
差不多就這樣,日後想到新的再補充。

WeilsNetLogo
This entry was posted in Arduino, C, General, Experience, Privacy By Weil Jimmer
.
-
2016-03-31 19:50:24更新於 2017-03-04 14:48:03
最近學C、C++,想一塊學,因為大學程式的緣故,我想,我還是先修好了,練習演算法,順便複習以前的程式。我已經語法大混亂了,沒有編譯器糾正我,基本很難寫正確程式,除非最近都在攻某個專案,否則我平時都是一天寫好幾種不同語言的程式,函數偶爾會亂調用。我知道有些工程師很討厭什麼語言都碰一點的人,但,我不管啦,我就是什麼都學,反正最後我也只會主攻少數幾項,也不至於什麼語言都很淺。
Python | PHP | JS | |
if state: #do sth elif state:
#do sth else: #do sth | if(state){
//do sth }elseif(state){ //do sth }else{
//do sth } | if(state){ //do sth }else
if(state){ //do sth }else{
//do sth } | |
for x in range(0,10): #do sth |
for($i=0;$i<10;$i++){ //do sth } |
for(var i=0;i<10;i++){ //do sth } | |
for k in arr: #do sth | foreach ($arr as
$value) { //do sth } | for(var key in arr){
//value=arr[key]; } | |
Not Exist | switch($mod){ case 1:
//do sth break; case 2:
//do sth break; default:
//do sth } | switch(mod){ case 1:
//do sth break; case 2:
//do sth break; default:
//do sth } | |
def foo(v1,v2): return sth | function
foo($v1,$v2){ return sth; }
//call by
reference
function foo(&$v1,&$v2){ return
sth; } | function foo(v1,v2){ return sth;
} | |
Java | C# | C | C++ |
if(state){ //do sth }else if(state){
//do sth }else{ //do sth } |
if(state){ //do sth }else if(state){
//do sth }else{ //do sth } |
if(state){ //do sth }else if(state){
//do sth }else{ //do sth } |
if(state){ //do sth }else if(state){
//do sth }else{ //do sth } |
for(int i=0;i<10;i++){ //do sth } |
for(int i=0;i<10;i++){ //do sth } |
for(i=0;i<10;i++){ //do sth } |
for(i=0;i<10;i++){ //do sth } |
for(int k : arr){ //do sth } |
foreach (int k in arr){ //do sth } | Not
Exist | for(int k : arr){ //do sth } |
switch(mod){ case 1:
//do sth break; case 2:
//do sth break; default:
//do sth } | switch(mod){ case 1:
//do sth break; case 2:
//do sth break; default:
//do sth } | switch(mod){ case 1:
//do sth break; case 2:
//do sth break; default:
//do sth } | switch(mod){ case 1:
//do sth break; case 2:
//do sth break; default:
//do sth } |
public int foo(int v1, int v2){ return sth;
} | public int foo(int v1, int v2){
return sth; }
//call by reference
public int foo(ref
int v1, ref int v2){ return sth; }
foo(ref a,ref b);
public int foo(out int v1, out int v2){
return sth; }
foo(out a,out b); | int foo(int v1, int
v2){ return sth; }
//call by reference
int foo(int *v1, int *v2){ //調用引數都要加*
return sth; }
foo(&a,&b); | int foo(int v1, int v2){
return sth; }
//call by reference
int foo(int &v1, int
&v2){ return sth; }
foo(a,b);
//call by pointer
int foo(int *v1, int *v2){
//調用所有引數都要加* return sth; }
foo(&a,&b); |
WeilsNetLogo
This entry was posted in C#, C, C++, Java, JS, PHP, Python By Weil Jimmer
.