算法分析丨Reversing-x64Elf-100逆向題
2022-04-08 14:07 作者:rkvir逆向工程學(xué)院 | 我要投稿
1.下載查殼

64位無殼
2.拖進(jìn)IDA具體分析
(1)shift+F12查找是否有關(guān)鍵字符串

發(fā)現(xiàn)關(guān)鍵字符串“nice!”,按照經(jīng)驗(yàn)來看這就是成功驗(yàn)證后的提示
(2)找到引用關(guān)鍵字符函數(shù)

(3)閱讀代碼可以知道流程:要求用戶輸入一個(gè)字符串存入s中,將s地址作為參數(shù)傳給sub_4006FD,將sub_4006FD的返回值最為調(diào)用sub_4006FD函數(shù)的if判斷條件,如果返回值為非零值則提示“Incorrect password!”,所以要讓sub_4006FD返回值為0
(4)跟進(jìn)sub_4006FD函數(shù)

閱讀代碼可以發(fā)現(xiàn)只有for中的if條件滿足時(shí)才會(huì)返回非零1,但是我們想要的是返回,所以要在這11次循環(huán)中讓if條件不成立,那查看條件
*(char *)(v3[i % 3] + 2 * (i / 3)) - *(char *)(i + a1) != 1
使每次循環(huán)v3對(duì)應(yīng)數(shù)組的值加上2 * (i / 3)的值作為地址,取該地址的值
減去每次(i + a1)地址的值,判斷相減的結(jié)果是否為1,不為1的話就繼續(xù)循環(huán),為1的話就會(huì)返回1,那么我們肯定是使它循環(huán)完11次返回0,仔細(xì)看這里的a1就是我們?cè)趍ain函數(shù)中出入進(jìn)來的我們輸入的字符串的地址值,那么重點(diǎn)來了,我們的目的就是不然if條件成立,那么就可以寫成
*(char *)(v3[i % 3] + 2 * (i / 3)) - *(char *)(i + a1) == 1
這樣算出來的(i + a1)對(duì)應(yīng)地址的值就是正確的值
那直接寫腳本
#includeint main()
{
? ?int i; // [rsp+14h] [rbp-24h]
? ?int n = 0;
? ?__int64 v3[4]; // [rsp+18h] [rbp-20h]
? ?int a1[11] = {1};
? ?v3[0] = (__int64)"Dufhbmf";
? ?v3[1] = (__int64)"pG`imos";
? ?v3[2] = (__int64)"ewUglpt";
? ?for (i = 0; i <= 11; ++i)
? ?{
? ? ? ?for (size_t n = 0; n < 222; n++)
? ? ? ?{
? ? ? ? ? ?if (*(char*)(v3[i % 3] + 2 * (i / 3)) - n == 1)
? ? ? ? ? ? ? ?a1[i] = n;
? ? ? ?}
? ?}
? ?for (size_t i = 0; i < 15; i++)
? ?{
? ? ? ?printf("%c",a1[i] );
? ?}
}
定義一個(gè)變量n最為我們輸入的每個(gè)字符對(duì)應(yīng)的ASCLL碼值,設(shè)n的最大ASCLL碼值為200,通過不斷地判斷(char)(v3[i % 3] + 2?(i / 3)) - n == 1來把滿足條件的n存入我們的正確flag數(shù)組中
3.結(jié)果

標(biāo)簽: