[英]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中。
開啟檔案
fopen("license.ini", "r") =0x55c088307380
打開許可證文件。
解析許可證持有人
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是當前行,因此大概是從當前行中提取電子郵件地址。
解析許可證密鑰
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);
。
文件結束
fgets("LicenseKey=aoeklycf", 4096, 0x55c088307380) = 0
它嘗試讀取另一行並命中EOF。 忽略第一個參數,它只是顯示上次調用在緩沖區中剩余的內容。
許可證密鑰比較
memfrob(0x7ffe72450840, 8, 0, 0xfbad2498) = 0x7ffe72450840
通過將每個字節與42異或來“加密”某些存儲區的8個字節。這可以通過再次運行memfrob()
來反轉。 我將“加密”放在空中引號中,因為這幾乎不能稱為加密。 這只是一點點混淆。
請注意,0x7ffe72450840是上面sscanf()
的地址。 它正在擾亂我licenseKey
上面稱為licenseKey的變量,它是從輸入文件中提取的LicenseKey=
字符串。
strncmp("KEOAFSIL", "aoeklycf", 8) = -22
這是錢線。 它比較實際值和預期值,但失敗。
錯誤信息
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.