江西會昌建設局網站建站軟件可以不通過網絡建設嗎
目錄
一.查殼
二.運行缺少dll
三.主函數(shù)
四.hObject線程
五.Thread線程
六.judge函數(shù)
七.解題腳本
這題的關鍵在于了解一定的線程相關知識
一.查殼
32位帶殼,用upx脫殼
?
二.運行缺少dll
后續(xù)嘗試了各種方法修復dll但是還是運行不了
?
?值得一提的是脫殼后的程序不能動態(tài)調試,如果動態(tài)調試會導致原本識別出來的函數(shù)和線程名變成紅色的JMPOUT(地址)的形式,難以閱讀和理解
三.主函數(shù)
1.menu函數(shù)
打印一個menu,執(zhí)行輸入輸出
?
2.兩個線程
根據(jù)微軟官方文檔可以得知由CreateMutexW()創(chuàng)建的::hObject是一個互斥鎖(與下方的hObject線程區(qū)分開)
hObject和Thread是兩個線程,其中CreateThread()函數(shù)第三個參數(shù)是運行的線程函數(shù)
CloseHandle()可以關閉線程
3.judge函數(shù)用于判斷輸入字符是否滿足條件
?
四.hObject線程
1.線程函數(shù)基本功能
WaitForSingleObject 函數(shù)實際上就是搶占主函數(shù)創(chuàng)建的::hObject互斥鎖,搶占成功后執(zhí)行判斷
這里的count初始值是29,用于控制循環(huán)次數(shù),所以可以猜測flag有29位
顯然執(zhí)行encode()函數(shù)后休眠一段時間,最后釋放互斥鎖,釋放之后會使Thread線程開始運行
2.encode()函數(shù)的功能
①先判斷輸入字符串的count下標字符是否為字母,不是字母則結束程序,也就是說flag全是字母
②第二條if語句是判斷該字符是否為大寫字符,如果是大寫字符那么在off_418000指針指向的字符表中根據(jù)chr-38后的偏移值查表確定字符
③如果是小寫字符,根據(jù)chr-96的偏移值查表確定字符
④值得一提的是off_418000指針指向的字符表為?QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm
這里的0-25是大寫字母,26-52是小寫字母,所以經過查表操作后,原來的小寫字母必定變成大寫字母,大寫字母必定變成小寫字母
?
五.Thread線程
當hObject線程交出互斥鎖后,輪到Thread線程運行線程函數(shù),很顯然這個函數(shù)的功能是--count
那么count初始值是29,由hObject運行后變成28,再由Thread線程運行后變成27
這樣往復循環(huán),所以hObject線程中,只對下標為奇數(shù)的字符進行了操作,偶數(shù)字符由于Thread線程對count的作用所以不被執(zhí)行
?
?
六.judge函數(shù)
?可以看到是對輸入的字符串和off_418004指針指向的字符表進行比較
off_418004 : TOiZiZtOrYaToUwPnToBsOaOapsyS
七.解題腳本
根據(jù)比較用的字符表可以得知flag經加密后內容為:TOiZiZtOrYaToUwPnToBsOaOapsyS
同時只對奇數(shù)下標進行操作,偶數(shù)下標不操作,所以不妨直接令flag=arr
根據(jù)每個字符在字符表中的位置可以確定偏移值
如果加密后的字符是小寫,那么原來是大寫,要加38
加密后的字符是大寫則原來是小寫,加96
#include <iostream>
using namespace std;
unsigned char table[53] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
unsigned int find(unsigned char ch)
{for (int i = 0; i < 52; i++)if (ch == table[i])return i;
}
int main()
{unsigned char arr[30] = "TOiZiZtOrYaToUwPnToBsOaOapsyS";unsigned char flag[30] = "TOiZiZtOrYaToUwPnToBsOaOapsyS";for (int i = 29; i >-1;i--){if (arr[i] <= 'Z'&& arr[i]>='A')flag[i] = find(arr[i]) + 96;elseflag[i] = find(arr[i]) + 38;i--;}flag[29] = 0;cout << flag;//ThisisthreadofwindowshahaIsESreturn 0;
}
最終輸出ThisisthreadofwindowshahaIsES
但是提交flag{ThisisthreadofwindowshahaIsES}是錯誤的,看了其他大佬的wp才知道最后一位要加一位E