參考文章:
re學習筆記(28)攻防世界-re-no-strings-attached_Forgo7ten的博客-CSDN博客
攻防世界逆向入門題之no-strings-attached_攻防世界 no-strings-attached_沐一 · 林的博客-CSDN博客 本人題解:
扔入Exepeinfo中查殼和其他信息:
如圖所示,32位ELF的linux文件,照例扔如IDA32位中查看代碼信息,跟進Main函數:
跟進authenticate()函數
這里有個decrypt函數,中文名是加密,不在導入表中說明不是系統函數,后面的if判斷條件是輸入,還有個比較的wcscmp函數,后面兩個wprintf分別是success 和access這些成功和拒絕的字符串地址。
fgetws函數是從輸入流stdin中獲取0x2000個字符給ws,也就是說s2是關鍵了,s2由decrypt函數得出,decrypt是用戶自定義函數,在這里學到了非系統函數的英文名會是題目給的暗示,所以這里是加密操作后與輸入的比較,只要輸入后與加密后的s2一樣就會打印success或access這些字符串,那flag自然也在加密函數中了。
然后開始動調:
這里有一個問題卡了我許久,就是在Ubuntu中無法打開32位調試文件,需要安裝一些配置才可以參考文章:
【BUG】Linux目錄下明明有可執行文件卻提示找不到,“No such file or directory”,解決:為64位Ubuntu安裝32位程序的運行架構_linux文件存在 但報錯說找不到_shandianchengzi的博客-CSDN博客
可以解決
?
?
程序在08048720執行完call,并將返回值存儲在eax里。
然后通過eax賦值給[ebp+s2],也就是字符串s2,
F8單步執行到08048725
然后跳轉到eax存儲的地址上
?
?
其實在這里也是可以看到flag的,一個一個寫出來就可以了,但是也可以提取數據,一塊弄出來
參考別人寫的腳本:
數據提取:
?
unsigned int data[38] = {0x00000039, 0x00000034, 0x00000034, 0x00000037, 0x0000007B, 0x00000079, 0x0000006F, 0x00000075,0x0000005F, 0x00000061, 0x00000072, 0x00000065, 0x0000005F, 0x00000061, 0x0000006E, 0x0000005F,0x00000069, 0x0000006E, 0x00000074, 0x00000065, 0x00000072, 0x0000006E, 0x00000061, 0x00000074,0x00000069, 0x0000006F, 0x0000006E, 0x00000061, 0x0000006C, 0x0000005F, 0x0000006D, 0x00000079,0x00000073, 0x00000074, 0x00000065, 0x00000072, 0x00000079, 0x0000007D};
?然后將其轉換為字符即為flag
#include <stdio.h>
int main()
{unsigned int data[38] = {0x00000039, 0x00000034, 0x00000034, 0x00000037, 0x0000007B, 0x00000079, 0x0000006F, 0x00000075,0x0000005F, 0x00000061, 0x00000072, 0x00000065, 0x0000005F, 0x00000061, 0x0000006E, 0x0000005F,0x00000069, 0x0000006E, 0x00000074, 0x00000065, 0x00000072, 0x0000006E, 0x00000061, 0x00000074,0x00000069, 0x0000006F, 0x0000006E, 0x00000061, 0x0000006C, 0x0000005F, 0x0000006D, 0x00000079,0x00000073, 0x00000074, 0x00000065, 0x00000072, 0x00000079, 0x0000007D};for(int i=0;i<38;i++)printf("%c",data[i]);return 0;
}
?flag為
9447{you_are_an_international_mystery}
總結:
不在導入表(import)中說明不是系統函數,非系統函數的英文名會是題目給的暗示
1.2.動態調試類似內存調試,在內存中找數據,尋找中間變量
3.IDA是根據自己的規則給無法解析變量名賦值的,也就是說在IDA里變量是s2這個名字,但是實際上程序里并沒有s2這個變量名,所以只能查看寄存器了,畢竟函數是先返回到eax寄存器中再移動到變量中的。