簡體   English   中英

我如何找到該程序的許可證密鑰?

[英]How do i find the license key for this program?

我正在嘗試解決大學的這一練習。 我們必須“破解”一個程序,該程序缺少啟動該程序所需的許可證文件。 我們僅使用Linux Shell。

因此,我已經完成的工作是創建此丟失的許可證文件。 它是一個.ini,其中包括許可證持有人和許可證密鑰。 我現在唯一要尋找的是正確的許可證密鑰。 任務說我們應該使用“ strace”和“ ltrace”來解決這個問題。 這是我得到的輸出:

fopen("license.ini", "r")                                   =0x55c088307380

fgets("LicenseHolder=annabell.krause@ex"..., 4096, 0x55c088307380)  = 0x7ffe72450860

strncmp("LicenseKey=", "LicenseHolder=annabell.krause@ex"..., 11)   = 3

strncmp("LicenseHolder=", "LicenseHolder=annabell.krause@ex"..., 14)    = 0

sscanf(0x7ffe72450860, 0x55c08753c16b, 0x7ffe72450800, 0xffffc000)  = 1

fgets("LicenseKey=aoeklycf", 4096, 0x55c088307380) = 0x7ffe72450860

strncmp("LicenseKey=", "LicenseKey=aoeklycf", 11)           = 0

sscanf(0x7ffe72450860, 0x55c08753c121, 0x7ffe72450840, 0xfffff800)  = 1

fgets("LicenseKey=aoeklycf", 4096, 0x55c088307380)          = 0

memfrob(0x7ffe72450840, 8, 0, 0xfbad2498)                   = 0x7ffe72450840

strncmp("KEOAFSIL", "aoeklycf", 8)                          = -22

fwrite("ERROR: License key is invalid.\n", 1, 31, 0x7faeabe60680
ERROR: License key is invalid.
)                                   = 31

+++ exited (status 1) +++

所以我猜答案在最后的memfrob和strncmp函數內。 但是我不知道下一步是什么。

讓我們逐個查看庫跟蹤調用。 重要的部分在步驟5中。

分析

  1. 開啟檔案

     fopen("license.ini", "r") =0x55c088307380 

    打開許可證文件。

  2. 解析許可證持有人

     fgets("LicenseHolder=annabell.krause@ex"..., 4096, 0x55c088307380) = 0x7ffe72450860 

    從文件中讀取一行: LicenseHolder=annabell.krause@ex…

     strncmp("LicenseKey=", "LicenseHolder=annabell.krause@ex"..., 11) = 3 

    該行是否以LicenseKey=開頭? 返回值3表示不,不是。

     strncmp("LicenseHolder=", "LicenseHolder=annabell.krause@ex"..., 14) = 0 

    該行是否以LicenseHolder=開頭? 是的,它確實。

     sscanf(0x7ffe72450860, 0x55c08753c16b, 0x7ffe72450800, 0xffffc000) = 1 

    不幸的是,ltrace尚未取消引用任何地址來向我們顯示內容。 我們知道0x7ffe72450860是當前行,因此大概是從當前行中提取電子郵件地址。

  3. 解析許可證密鑰

     fgets("LicenseKey=aoeklycf", 4096, 0x55c088307380) = 0x7ffe72450860 

    它讀取另一行: LicenseKey=aoeklycf

     strncmp("LicenseKey=", "LicenseKey=aoeklycf", 11) = 0 

    該行是否以LicenseKey=開頭? 是的,它確實。

     sscanf(0x7ffe72450860, 0x55c08753c121, 0x7ffe72450840, 0xfffff800) = 1 

    它正在解析當前行。 大概是提取您輸入的許可證密鑰aoeklycf ,並將其保存在變量中,以便以后與預期的許可證密鑰進行比較。 類似於sscanf(line, "LicenseKey=%s", licenseKey);

  4. 文件結束

     fgets("LicenseKey=aoeklycf", 4096, 0x55c088307380) = 0 

    它嘗試讀取另一行並命中EOF。 忽略第一個參數,它只是顯示上次調用在緩沖區中剩余的內容。

  5. 許可證密鑰比較

     memfrob(0x7ffe72450840, 8, 0, 0xfbad2498) = 0x7ffe72450840 

    通過將每個字節與42異或來“加密”某些存儲區的8個字節。這可以通過再次運行memfrob()來反轉。 我將“加密”放在空中引號中,因為這幾乎不能稱為加密。 這只是一點點混淆。

    請注意,0x7ffe72450840是上面sscanf()的地址。 它正在擾亂我licenseKey上面稱為licenseKey的變量,它是從輸入文件中提取的LicenseKey=字符串。

     strncmp("KEOAFSIL", "aoeklycf", 8) = -22 

    這是錢線。 它比較實際值和預期值,但失敗。

  6. 錯誤信息

     fwrite("ERROR: License key is invalid.\\n", 1, 31, 0x7faeabe60680) = 31 

    打印錯誤。

合成

但是作者不希望您能夠運行簡單的字符串搜索(例如strings ./program以將許可證密鑰從可執行文件中拉出。 為了防止這種情況,你有進入許可密鑰的frobbed版本license.ini ,而不是原始字符串, strings的發現。

該代碼可能類似於:

char *expected = "aoeklycf";
char actual[BUFSIZE];

sscanf(line, "LicenseKey=%s", actual);
memfrob(actual);
if (strncmp(actual, expected, strlen(expected)) != 0) {
    error("ERROR: License key is invalid.\n");
}

aoeklycf從程序中提取了aoeklycf 如果是這樣,則您錯過了memfrob()步驟。 license.ini需要列出許可證密鑰的“加密”版本: KEOAFSIL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM