BUUCTF學習記錄-Reverse(六)
題目:xor
平臺:buuctf
題目提示資訊:or的敵人,and 有個兄弟叫or,or有個敵人叫xor,那麼你能幫助or戰勝他的敵人xor嗎,xor的奧秘就在附件中,開始戰鬥吧!注意:得到的 flag 請包上 flag{} 提交
解題思路
發現是64位程式,應該是macOSx的程式,那麼我們使用ida64開啟。
直接F5
{
char *v3; // rsi
int result; // eax
signed int i; // [rsp+2Ch] [rbp-124h]
char v6[264]; // [rsp+40h] [rbp-110h]
__int64 v7; // [rsp+148h] [rbp-8h]
memset(v6, 0, 0x100uLL);
v3 = (char *)256;
printf(“Input your flag:\n”, 0LL);
get_line(v6, 256LL);
if ( strlen(v6) != 33 )
goto LABEL_12;
for ( i = 1; i < 33; ++i )
v6[i] ^= v6[i - 1];
v3 = global;
if ( !strncmp(v6, global, 0x21uLL) )
printf(“Success”, v3);
else
LABEL_12:
printf(“Failed”, v3);
result = __stack_chk_guard;
if ( __stack_chk_guard == v7 )
result = 0;
return result;
}
我們發現,是字元異或,然後與globa比較。
有兩個關鍵函式strlen和strcmp,strlen指出該字串長度是33,strcmp將v6和global進行對比,可見global是xor後的結果,點選global來到字串的位置,看到下面的字串,一看好像沒有33個字元。
雙擊globa
點選繼續跟它的資料
找到了最終的字串結果
那麼我們得到了就肯定是要幹他了
s = [‘f’,0xA,‘k’,0xC,‘w’,‘&’,‘O’,‘。’,‘@’,0x11,‘x’,0xD,‘Z’,‘;’,‘U’,0x11,‘p’,0x19,‘F’,0x1F,‘v’,‘“’,‘M’,‘#’,‘D’,0xE,‘g’,6,‘h’,0xF,‘G’,‘2’,‘O’]
flag = ‘f’#第一個字元不用進行異或運算
for i in range(1,len(s)):
if(isinstance(s[i],int)):#將數字轉化為字元
s[i] = chr(s[i])
for i in range(1,len(s)):
flag += chr(ord(s[i]) ^ ord(s[i-1]))#a^b=c 等於 a^c=b
print(flag)
寫一個Python指令碼(異或的異或還是異或)
跑結果
得到結果flag
題感
這道題是一道比較簡單的revers題目,我們所需要的東西有下:
1。IDA工具使用經驗
2。逆向思路
3。C語言基礎
4。ASCII編碼表
5。系統常識
6。能認識一些組合語言
7。異或
寫到後面
大家可以關注一下我們的公眾號,如果覺得這個文章有用的話,可以推薦給你的朋友或者轉發到朋友圈分享一下。你的分享、你的點贊、你的每一次瀏覽,都將是我持續更新的動力。非常感謝看到文章的每一個人!
另外,CTF團隊也在持續招人,如果有意向的可以與我聯絡,公眾號內直接透過選單獲取資訊即可!