日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XCTF-Reverse:logmein

發(fā)布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XCTF-Reverse:logmein 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目地址:https://adworld.xctf.org.cn/task/answer?type=reverse&number=4&grade=0&id=5078&page=1


發(fā)現(xiàn)程序是一個ELF文件,將其放入Linux環(huán)境中進(jìn)行分析,發(fā)現(xiàn)程序是64位的
直接拖進(jìn)ida64

step1、從main函數(shù)開始分析,使用F5查看偽代碼
題目說是涉及算法逆向,應(yīng)該是通過一系列比較可以得到正確的結(jié)果

void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) {size_t v3; // rsiint i; // [rsp+3Ch] [rbp-54h]char s[36]; // [rsp+40h] [rbp-50h]int v6; // [rsp+64h] [rbp-2Ch]__int64 v7; // [rsp+68h] [rbp-28h]char v8[8]; // [rsp+70h] [rbp-20h]int v9; // [rsp+8Ch] [rbp-4h]/* v8是":"AL_RT^L*.?+6/46"這個字符串 V7是一個ll型的十進(jìn)制數(shù)28537194573619560 然后逆序進(jìn)行計算的話,28537194573619560轉(zhuǎn)換為16進(jìn)制是65626d61726168 接著轉(zhuǎn)文本得到ebmarah 然后通過別的題解了解到這個需要將其倒序使用harambe */v9 = 0;strcpy(v8, ":\"AL_RT^L*.?+6/46"); //將指定字符串復(fù)制到v8v7 = 28537194573619560LL;//ebmarah 單擊鼠標(biāo)右鍵,先轉(zhuǎn)化為十六進(jìn)制,再轉(zhuǎn)化為字符串v6 = 7;printf("Welcome to the RC3 secure password guesser.\n", a2, a3);printf("To continue, you must enter the correct password.\n");printf("Enter your guess: ");__isoc99_scanf("%32s", s);//s是用戶輸入的字符串,先進(jìn)行比較長度v3 = strlen(s);if ( v3 < strlen(v8) )//如果長度比v8小,則進(jìn)入sub_4007C0函數(shù)sub_4007C0();//雙擊查看,可以看出輸出字符串Incorrect password,然后,退出for ( i = 0; i < strlen(s); ++i )//如果長度大于或等與v8則進(jìn)入下面的循環(huán){if ( i >= strlen(v8) )sub_4007C0();if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )//如果輸入的字符串和經(jīng)過運算后的后字符串不等,則進(jìn)入sub_4007c0sub_4007C0();//輸出Incorrect password}sub_4007F0();//You entered the correct password!\nGreat job!\n }

補:這里(char)(((_BYTE )&v7 + i % v6) ^ v8[i])
BYTE 經(jīng)查詢,是相當(dāng)于unsigned char
然后可以得到一個二進(jìn)制碼與后面v8[i]進(jìn)行異或運算,然后轉(zhuǎn)換為char類型依次比較
所以把每一個比較的字符存儲進(jìn)行輸出就可以得到flag
證明輸入的字符串就是flag

發(fā)現(xiàn)算法的關(guān)鍵在于 V6、V7、V8 的異或處理,通過分析得到如下代碼:

key1=":\"AL_RT^L*.?+6/46" #v8 key2="harambe" #v7 key3=7 #v6 flag='' for i in range(0,len(key1)):flag += chr(ord(key1[i])^ord(key2[i%key3])) print(flag)


RC3-2016-XORISGUD

ord():是將字符串轉(zhuǎn)換為ascii格式,為了方便運算
chr():是將ascii轉(zhuǎn)換為字符串

至于為什么要倒序使用harambe也是看了大佬的WP才知道的 [●′?`●] ~~
x86系列的CPU都是以小端序儲存數(shù)據(jù)的,即低位字節(jié)存入低地址,高位字節(jié)存入高地址,所以正確的字符串應(yīng)該反過來

總結(jié)

以上是生活随笔為你收集整理的XCTF-Reverse:logmein的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。