如何Crack Command Line Program

本次破解練習(xí)的對(duì)象下載地址如下:https://github.com/GeoSn0w/Reverse-Engineering-Tutorials涌矢。選擇了其中的Level 3坤学, cat 這個(gè)例子。cat這個(gè)程序是個(gè)命令行程序黍图,運(yùn)行時(shí)輸入正確的Serial即可通過驗(yàn)證。截圖如下:

Snip20171025_1.png

這個(gè)例子比較簡(jiǎn)單,主要目的是演示如何用Hopper調(diào)試命令行程序靶庙。程序自帶說明Readme如下。

  • The level 3 consists into a binary that requires a serial number to work. Once a serial number (the correct one) is fed to the app, a function executes that prints out data about the Kernel (uname).
    Your challenge is to bypass the signature check so that any serial would do.

0x1 代碼分析

Hopper中可以看到代碼如下娃属。只有一個(gè)_main方法六荒。

                     _main:
0000000100000a50         push       rbp
0000000100000a51         mov        rbp, rsp
0000000100000a54         sub        rsp, 0x580
0000000100000a5b         lea        rax, qword [0x100000d3c]                    ; "Welcome to the iOS Reverse Engineering Level 3! \\n"
0000000100000a62         mov        rcx, qword [___stack_chk_guard_100001000]
0000000100000a69         mov        rcx, qword [rcx]
0000000100000a6c         mov        qword [rbp+var_8], rcx
0000000100000a70         mov        dword [rbp+var_50C], 0x0
0000000100000a7a         mov        dword [rbp+var_510], edi
0000000100000a80         mov        qword [rbp+var_518], rsi
0000000100000a87         mov        rdi, rax                                    ; argument "format" for method imp___stubs__printf
0000000100000a8a         mov        al, 0x0
0000000100000a8c         call       imp___stubs__printf
0000000100000a91         lea        rdi, qword [0x100000d6e]                    ; "Created by GeoSn0w (@FCE365)\\n\\n", argument "format" for method imp___stubs__printf
0000000100000a98         mov        dword [rbp+var_524], eax
0000000100000a9e         mov        al, 0x0
0000000100000aa0         call       imp___stubs__printf
0000000100000aa5         lea        rdi, qword [0x100000d8d]                    ; "The challenge is to hack this application so that you can use it without any serial number and obtain the flag! \\n\\n", argument "format" for method imp___stubs__printf
0000000100000aac         mov        dword [rbp+var_528], eax
0000000100000ab2         mov        al, 0x0
0000000100000ab4         call       imp___stubs__printf
0000000100000ab9         lea        rdi, qword [0x100000e00]                    ; "**************** START **************** \\n\\n", argument "format" for method imp___stubs__printf
0000000100000ac0         mov        dword [rbp+var_52C], eax
0000000100000ac6         mov        al, 0x0
0000000100000ac8         call       imp___stubs__printf
0000000100000acd         cmp        dword [rbp+var_510], 0x2
0000000100000ad4         mov        dword [rbp+var_530], eax
0000000100000ada         jne        loc_100000c83

0000000100000ae0         lea        rdi, qword [0x100000e2b]                    ; "Preparing to check access key: %s\\n", argument "format" for method imp___stubs__printf
0000000100000ae7         mov        rax, qword [rbp+var_518]
0000000100000aee         mov        rsi, qword [rax+8]
0000000100000af2         mov        al, 0x0
0000000100000af4         call       imp___stubs__printf
0000000100000af9         mov        dword [rbp+var_51C], 0x0
0000000100000b03         mov        dword [rbp+var_520], 0x0
0000000100000b0d         mov        dword [rbp+var_534], eax

                     loc_100000b13:
0000000100000b13         movsxd     rax, dword [rbp+var_520]                    ; CODE XREF=_main+290
0000000100000b1a         mov        rcx, qword [rbp+var_518]
0000000100000b21         mov        rdi, qword [rcx+8]                          ; argument "s" for method imp___stubs__strlen
0000000100000b25         mov        qword [rbp+var_540], rax
0000000100000b2c         call       imp___stubs__strlen
0000000100000b31         mov        rcx, qword [rbp+var_540]
0000000100000b38         cmp        rcx, rax
0000000100000b3b         jae        loc_100000b77

0000000100000b41         movsxd     rax, dword [rbp+var_520]
0000000100000b48         mov        rcx, qword [rbp+var_518]
0000000100000b4f         mov        rcx, qword [rcx+8]
0000000100000b53         movsx      edx, byte [rcx+rax]
0000000100000b57         add        edx, dword [rbp+var_51C]
0000000100000b5d         mov        dword [rbp+var_51C], edx
0000000100000b63         mov        eax, dword [rbp+var_520]
0000000100000b69         add        eax, 0x1
0000000100000b6c         mov        dword [rbp+var_520], eax
0000000100000b72         jmp        loc_100000b13

                     loc_100000b77:
0000000100000b77         cmp        dword [rbp+var_51C], 0x4f4                  ; CODE XREF=_main+235
0000000100000b81         jne        loc_100000c56

0000000100000b87         lea        rdi, qword [0x100000e4e]                    ; "Welcome! F.C.E. 365 Tool v36.1\\n", argument "format" for method imp___stubs__printf
0000000100000b8e         mov        al, 0x0
0000000100000b90         call       imp___stubs__printf
0000000100000b95         lea        rdi, qword [0x100000e6e]                    ; "\\n", argument "format" for method imp___stubs__printf
0000000100000b9c         mov        dword [rbp+var_544], eax
0000000100000ba2         mov        al, 0x0
0000000100000ba4         call       imp___stubs__printf
0000000100000ba9         lea        rdi, qword [0x100000e70]                    ; "Blimey! You're not a good man! You've hacked the app!\\n \\n", argument "format" for method imp___stubs__printf
0000000100000bb0         mov        dword [rbp+var_548], eax
0000000100000bb6         mov        al, 0x0
0000000100000bb8         call       imp___stubs__printf
0000000100000bbd         lea        rdi, qword [0x100000ea9]                    ; "Flag: 0x038948FFFF83--DS \\n", argument "format" for method imp___stubs__printf
0000000100000bc4         mov        dword [rbp+var_54C], eax
0000000100000bca         mov        al, 0x0
0000000100000bcc         call       imp___stubs__printf
0000000100000bd1         lea        rdi, qword [0x100000ec4]                    ; "System Identity:\\n", argument "format" for method imp___stubs__printf
0000000100000bd8         mov        dword [rbp+var_550], eax
0000000100000bde         mov        al, 0x0
0000000100000be0         call       imp___stubs__printf
0000000100000be5         lea        rdi, qword [rbp+var_508]                    ; argument "name" for method imp___stubs__uname
0000000100000bec         mov        dword [rbp+var_554], eax
0000000100000bf2         call       imp___stubs__uname
0000000100000bf7         lea        rdi, qword [0x100000ed6]                    ; "%s Release %s (Version %s) on %s\\n", argument "format" for method imp___stubs__printf
0000000100000bfe         lea        rcx, qword [rbp+var_508]
0000000100000c05         mov        rdx, rcx
0000000100000c08         add        rdx, 0x200
0000000100000c0f         mov        rsi, rcx
0000000100000c12         add        rsi, 0x300
0000000100000c19         mov        r8, rcx
0000000100000c1c         add        r8, 0x400
0000000100000c23         mov        qword [rbp+var_560], rsi
0000000100000c2a         mov        rsi, rcx
0000000100000c2d         mov        rcx, qword [rbp+var_560]
0000000100000c34         mov        dword [rbp+var_564], eax
0000000100000c3a         mov        al, 0x0
0000000100000c3c         call       imp___stubs__printf
0000000100000c41         mov        dword [rbp+var_50C], 0x0
0000000100000c4b         mov        dword [rbp+var_568], eax
0000000100000c51         jmp        loc_100000cb5

                     loc_100000c56:
0000000100000c56         lea        rdi, qword [0x100000ef8]                    ; "The serial number is not correct!\\n", argument "format" for method imp___stubs__printf, CODE XREF=_main+305
0000000100000c5d         mov        al, 0x0
0000000100000c5f         call       imp___stubs__printf
0000000100000c64         lea        rdi, qword [0x100000f1b]                    ; "The application is locked!\\n", argument "format" for method imp___stubs__printf
0000000100000c6b         mov        dword [rbp+var_56C], eax
0000000100000c71         mov        al, 0x0
0000000100000c73         call       imp___stubs__printf
0000000100000c78         mov        dword [rbp+var_570], eax
0000000100000c7e         jmp        loc_100000cab

                     loc_100000c83:
0000000100000c83         lea        rdi, qword [0x100000f37]                    ; "This application requires a serial number to work! You can validate it with <key>\\n", argument "format" for method imp___stubs__printf, CODE XREF=_main+138
0000000100000c8a         mov        al, 0x0
0000000100000c8c         call       imp___stubs__printf
0000000100000c91         lea        rdi, qword [0x100000f8a]                    ; "Or you can do what hackers do the best...\\n", argument "format" for method imp___stubs__printf
0000000100000c98         mov        dword [rbp+var_574], eax
0000000100000c9e         mov        al, 0x0
0000000100000ca0         call       imp___stubs__printf
0000000100000ca5         mov        dword [rbp+var_578], eax

                     loc_100000cab:
0000000100000cab         mov        dword [rbp+var_50C], 0x0                    ; CODE XREF=_main+558

                     loc_100000cb5:
0000000100000cb5         mov        rax, qword [___stack_chk_guard_100001000]   ; CODE XREF=_main+513
0000000100000cbc         mov        ecx, dword [rbp+var_50C]
0000000100000cc2         mov        rax, qword [rax]
0000000100000cc5         cmp        rax, qword [rbp+var_8]
0000000100000cc9         mov        dword [rbp+var_57C], ecx
0000000100000ccf         jne        loc_100000ce4

0000000100000cd5         mov        eax, dword [rbp+var_57C]
0000000100000cdb         add        rsp, 0x580
0000000100000ce2         pop        rbp
0000000100000ce3         ret
                        ; endp

                     loc_100000ce4:
0000000100000ce4         call       imp___stubs____stack_chk_fail               ; CODE XREF=_main+639
                        ; endp

靜態(tài)分析代碼,知 loc_100000b77為關(guān)鍵跳轉(zhuǎn)矾端。

       loc_100000b77:
0000000100000b77         cmp        dword [rbp+var_51C], 0x4f4                  ; CODE XREF=_main+235
0000000100000b81         jne        loc_100000c56

此處條件跳轉(zhuǎn)掏击,比較[rbp+var_51C]與0x4f4的大小,相等則通過秩铆。0x4f4為多少呢砚亭?轉(zhuǎn)為十進(jìn)制為1268。如下圖殴玛。

Snip20171025_7.png

0x2動(dòng)態(tài)分析

[rbp+var_51C] 的值是如何計(jì)算得來的呢捅膘?Hopper提供了動(dòng)態(tài)調(diào)試功能,也能單步驟調(diào)試運(yùn)行命令行程序滚粟。
見下圖寻仗。Arguments 輸入?yún)?shù),Application Output窗口打印程序的輸出凡壤。

Snip20171025_3.png

切換窗口到GPR署尤,也可以看到各個(gè)寄存器值耙替。

Snip20171025_2.png

通過運(yùn)行,得知曹体,程序遍歷輸入的參數(shù)俗扇,進(jìn)行累加,最后的結(jié)果與1268相比較混坞,相等則通過驗(yàn)證狐援。

0x3驗(yàn)證

根據(jù)分析,可以算出Serial究孕。例如:1268 = 120*10+68 啥酱; ASCII碼120對(duì)應(yīng)的字符為x,ASCII碼68對(duì)應(yīng)的字符為D厨诸,所以Serial可以為:xxxxxxxxxxD镶殷。代入程序驗(yàn)證,成功微酬。:)绘趋!

Snip20171025_8.png

打開練習(xí)對(duì)應(yīng)的源碼,分析也是對(duì)的颗管。如下陷遮。

//GeoSn0w's Reverse Engineering Tutorial
//Use the code as you want, WTFPL
#include <string.h>
#include <stdio.h>
#include <sys/utsname.h>

int main(int argc, char *argv[]) {
printf("Welcome to the iOS Reverse Engineering Level 3! \n");
printf("Created by GeoSn0w (@FCE365)\n\n");
printf("The challenge is to hack this application so that you can use it without any serial number and obtain the flag! \n\n");
printf("**************** START **************** \n\n");
if(argc==2) {
  printf("Preparing to check access key: %s\n", argv[1]);
  int hex = 0;
  for(int access=0; access<strlen(argv[1]); access++){
    hex += (int)argv[1][access];
  }
  if(hex==1268) {
    printf("Welcome! F.C.E. 365 Tool v36.1\n");
    printf("\n");
    printf("Blimey! You're not a good man! You've hacked the app!\n \n");
    printf("Flag: 0x038948FFFF83--DS \n");
    printf("System Identity:\n");
    struct utsname u;
    uname (&u);
    printf ("%s Release %s (Version %s) on %s\n", u.sysname, u.release, u.version, u.machine);
    return 0;
  }
  else {
    printf("The serial number is not correct!\n");
    printf("The application is locked!\n");
    
  }
 } 
else {
   printf("This application requires a serial number to work! You can validate it with <key>\n");
   printf("Or you can do what hackers do the best...\n");
}
return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市垦江,隨后出現(xiàn)的幾起案子帽馋,更是在濱河造成了極大的恐慌,老刑警劉巖比吭,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绽族,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡衩藤,警方通過查閱死者的電腦和手機(jī)吧慢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赏表,“玉大人检诗,你說我怎么就攤上這事∑敖耍” “怎么了逢慌?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)跋选。 經(jīng)常有香客問我涕癣,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任坠韩,我火速辦了婚禮距潘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘只搁。我一直安慰自己音比,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布氢惋。 她就那樣靜靜地躺著洞翩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焰望。 梳的紋絲不亂的頭發(fā)上骚亿,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音熊赖,去河邊找鬼来屠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛震鹉,可吹牛的內(nèi)容都是我干的俱笛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼传趾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼迎膜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浆兰,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤磕仅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后镊讼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宽涌,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡平夜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年蝶棋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忽妒。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玩裙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出段直,到底是詐尸還是另有隱情吃溅,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布鸯檬,位于F島的核電站决侈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏喧务。R本人自食惡果不足惜赖歌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一枉圃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庐冯,春花似錦孽亲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至栖茉,卻和暖如春篮绿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吕漂。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工搔耕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痰娱。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓弃榨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親梨睁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鲸睛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)坡贺,斷路器官辈,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,743評(píng)論 0 33
  • 自己的小思考 當(dāng)下我們正處在物聯(lián)網(wǎng)的構(gòu)建中遍坟,如智能手機(jī)拳亿,智能汽車,智慧城市愿伴,無人機(jī)肺魁,機(jī)器人,以及VR/AR等技術(shù)隔节。...
    了行閱讀 169評(píng)論 0 0
  • 問題 熟悉iOS開發(fā)的都知道鹅经,如果我們往Array或Dictionary中插入nil,應(yīng)用就會(huì)崩潰怎诫。如有下面客戶端...
    俞子將閱讀 5,177評(píng)論 10 35
  • 最近我的家教學(xué)生突然問到我一個(gè)深?yuàn)W的問題幻妓,“你有什么目標(biāo)或者理想嗎蹦误?”。 我心想,我以前也一直覺得沒夢(mèng)想挺可怕...
    Nan嵐閱讀 732評(píng)論 0 2