1. 背景
群里有個小伙伴學習設計加密方法,如同某商用軟件輸入注冊碼后就能使用擴展功能。設計時他很自然的想著所寫的加密措施是否足夠健壯安全,是否有什么方法可以繞過加密檢查,也就是破解。
權限管理僅在啟動后檢查一次注冊碼是否有效——一個 if 判斷,他也認定,若反匯編軟件只要 欺騙過這條判斷加密措施蕩然無存。
群里我給他一個破解設計思想:“利用NOP指令覆蓋相關代碼繞開鑒權”。
2. 演示
下面是我做的一個例子演示運用NOP指令破解:軟件a.out在破解前不是vip,直接修改二進制文件后擁有了vip權限。
它是怎么實現(xiàn)的呢?先看看源碼,源碼邏輯很簡單,僅僅判斷用戶有沒有money,沒有錢當然沒權限。
為了便于闡述原理,我編譯源碼帶上調(diào)試選項:-g,生成的可執(zhí)行文件a.out反匯編后就能同時看到源碼和匯編內(nèi)容。
void main(){ int money = 0; int vip = 1;
asm(“nop”); asm(“nop”); asm(“nop”); asm(“nop”); asm(“nop”); asm(“nop”); asm(“nop”); // 無效指令 if (money == 0) { vip = 0; }
printf(“money %d vip %d
”, money, vip); if (vip == 1) { printf(“授權成功
”); } else { printf(“未授權
”); }}
a.dis 是反匯編文件,138行是vip=0的匯編代碼 “movl $0x0,-0x4(%rbp)”, 對應機器碼為 “c7 45 fc 00 00 00 00” , 左側窗口內(nèi)容是a.out二進制文件,文件第1168字節(jié)位置找到相應機器碼。
3. 開始破解
接下來這么修改呢?輪到主角nop指令登場。
據(jù)我所知,每種處理器都會有一條瞎忙活的空指令nop(No Operation)。CPU遇到nop指令僅空轉,浪費你的電費,不干實際有意義的事情(其實空轉也是為了更有意義的發(fā)揮效能,上班摸魚是不是能更有活力!), 那么想辦法把“vip=0”這條語句生成7字節(jié)機器碼 “c7 45 fc 00 00 00 00”,替換成nop指令的機器碼,是不是就破解了呢?如果nop機器碼是2字節(jié),我的還需考慮指令完整性對齊,覆蓋機器碼長度必須是nop機器碼整數(shù)倍。
問題來了:x86的nop指令對應的機器碼是什么呢?習慣性百度搜索 “x86 nop 機器碼”。我這里介紹更簡潔直接的方法,需要查詢什么反匯編指令,問問反匯編工具objdump。
有沒有注意到源碼里我寫了若干行指令 ‘a(chǎn)sm(“nop”)’,c語言可以嵌入?yún)R編,查看反匯編文件a.dis告訴我nop指令最終編譯得到的機器碼是什么。
反匯編后nop的機器碼是 0x90。謝天謝地,芯片工程師設計指令操作碼時只給它一個字符。任何正整數(shù)都是1的整數(shù)倍,不用考慮指令完整性對齊。
順帶留給讀者一個思考題:對于x86這種 CISC 復雜指令集,把nop指令的機器碼設計成只有一個字節(jié),有什么好處?
替換后的源碼 “vip = 0” 這行如同被注釋掉一樣。
保存修改,再次執(zhí)行,看到了嗎!已經(jīng)得到了VIP權限。
責任編輯:haq
-
軟件
+關注
關注
69文章
5003瀏覽量
87920 -
指令
+關注
關注
1文章
611瀏覽量
35792
原文標題:黑客最簡單的軟件破解方法,反匯編nop指令覆蓋
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論