BUUCTF第二十四、二十五題解題思路

目錄

第二十四題CrackRTF

第二十五題[2019紅帽杯]easyRE1


第二十四題CrackRTF

查殼

無殼,32位,用32位IDA打開,打開后的main函數很短,可以找到一句“jmz? _main_0”——跳轉到 _main_0,說明真正的主函數是_main_0,跟進。

int __cdecl main_0(int argc, const char **argv, const char **envp)
{DWORD v3; // eaxDWORD v4; // eaxchar Str[260]; // [esp+4Ch] [ebp-310h] BYREFint v7; // [esp+150h] [ebp-20Ch]char String1[260]; // [esp+154h] [ebp-208h] BYREFchar Destination[260]; // [esp+258h] [ebp-104h] BYREFmemset(Destination, 0, sizeof(Destination));memset(String1, 0, sizeof(String1));v7 = 0;printf("pls input the first passwd(1): ");scanf("%s", Destination);if ( strlen(Destination) != 6 ){printf("Must be 6 characters!\n");ExitProcess(0);}v7 = atoi(Destination);if ( v7 < 100000 )ExitProcess(0);strcat(Destination, "@DBApp");v3 = strlen(Destination);sub_40100A((BYTE *)Destination, v3, String1);if ( !_strcmpi(String1, "6E32D0943418C2C33385BC35A1470250DD8923A9") ){printf("continue...\n\n");printf("pls input the first passwd(2): ");memset(Str, 0, sizeof(Str));scanf("%s", Str);if ( strlen(Str) != 6 ){printf("Must be 6 characters!\n");ExitProcess(0);}strcat(Str, Destination);memset(String1, 0, sizeof(String1));v4 = strlen(Str);sub_401019((BYTE *)Str, v4, String1);if ( !_strcmpi("27019e688a4e62a649fd99cadaafdb4e", String1) ){if ( !(unsigned __int8)sub_40100F(Str) ){printf("Error!!\n");ExitProcess(0);}printf("bye ~~\n");}}return 0;
}

代碼分析:初始化Destination和string1兩個字符串數組,令v7的值為0,用Destination接收輸入的密碼一,根據后面的判斷可以確定密碼一有6位,把Destination的值轉化為整型賦給v7,將Destination的值與“@DBApp”連接起來,把“Destination”的長度賦給v3,調用函數sub_40100A(參數為Destination,v3,string1),if判斷,如果string1的值與“6E32D0943418C2C33385BC35A1470250DD8923A9”相等,繼續,用str接受密碼2(同樣是6位),將str的長度賦值給v4,調用sub_401019(參數為str,v4,string1),if嵌套,如果string1與27019e688a4e62a649fd99cadaafdb4e相等,且sub_40100F(Str)為0,繼續輸出。

解題關鍵在于那兩個函數,先考慮加密,用插件檢索一下是否有加密算法。

存在加密,但不好判斷是什么加密方式,跟進第一個函數。

int __cdecl sub_401230(BYTE *pbData, DWORD dwDataLen, LPSTR lpString1)
{DWORD i; // [esp+4Ch] [ebp-28h]CHAR String2[4]; // [esp+50h] [ebp-24h] BYREFBYTE v6[20]; // [esp+54h] [ebp-20h] BYREFDWORD pdwDataLen; // [esp+68h] [ebp-Ch] BYREFHCRYPTHASH phHash; // [esp+6Ch] [ebp-8h] BYREFHCRYPTPROV phProv; // [esp+70h] [ebp-4h] BYREFif ( !CryptAcquireContextA(&phProv, 0, 0, 1u, 0xF0000000) )return 0;if ( CryptCreateHash(phProv, 0x8004u, 0, 0, &phHash) ){if ( CryptHashData(phHash, pbData, dwDataLen, 0) ){CryptGetHashParam(phHash, 2u, v6, &pdwDataLen, 0);*lpString1 = 0;for ( i = 0; i < pdwDataLen; ++i ){wsprintfA(String2, "%02X", v6[i]);lstrcatA(lpString1, String2);}CryptDestroyHash(phHash);CryptReleaseContext(phProv, 0);return 1;}else{CryptDestroyHash(phHash);CryptReleaseContext(phProv, 0);return 0;}}else{CryptReleaseContext(phProv, 0);return 0;}
}

通過查詢標識符0x8004u,發現是sha加密。

寫腳本,解出密碼一:

import hashlib
string = '@DBApp'
for i in range(100000, 999999):flag = str(i) + stringx = hashlib.sha1(flag.encode("UTF8"))y = x.hexdigest()if "6E32D0943418C2C33385BC35A1470250DD8923A9" == y:print(flag)break

密碼一:123321

跟進第二個函數。

int __cdecl sub_401040(BYTE *pbData, DWORD dwDataLen, LPSTR lpString1)
{DWORD i; // [esp+4Ch] [ebp-24h]CHAR String2[4]; // [esp+50h] [ebp-20h] BYREFBYTE v6[16]; // [esp+54h] [ebp-1Ch] BYREFDWORD pdwDataLen; // [esp+64h] [ebp-Ch] BYREFHCRYPTHASH phHash; // [esp+68h] [ebp-8h] BYREFHCRYPTPROV phProv; // [esp+6Ch] [ebp-4h] BYREFif ( !CryptAcquireContextA(&phProv, 0, 0, 1u, 0xF0000000) )return 0;if ( CryptCreateHash(phProv, 0x8003u, 0, 0, &phHash) ){if ( CryptHashData(phHash, pbData, dwDataLen, 0) ){CryptGetHashParam(phHash, 2u, v6, &pdwDataLen, 0);*lpString1 = 0;for ( i = 0; i < pdwDataLen; ++i ){wsprintfA(String2, "%02X", v6[i]);lstrcatA(lpString1, String2);}CryptDestroyHash(phHash);CryptReleaseContext(phProv, 0);return 1;}else{CryptDestroyHash(phHash);CryptReleaseContext(phProv, 0);return 0;}}else{CryptReleaseContext(phProv, 0);return 0;}
}

查詢標識符0x8003u,發現是md5加密,可以用工具網站在線解密。

解得~!3a@0123321@DBApp,這個字符串是由str和Destination連接而成,因此密碼二是~!3a@0

將兩個密碼帶入程序中驗證。

運行成功,生成了一個新的文件,打開后里面就是flag

第二十五題[2019紅帽杯]easyRE1

查殼

64位ELF文件,無殼,用64位IDA打開,檢索字符串

發現了一個類似字母表的結構,可能是base64加密,使用插件檢索加密方式。

的確是base64加密,再回到檢索字符串的界面,可以看到有一個字符串“'You found me!!!'”,對其交叉引用找到函數,反匯編查看偽代碼。

__int64 sub_4009C6()
{__int64 result; // raxint i; // [rsp+Ch] [rbp-114h]__int64 v2; // [rsp+10h] [rbp-110h]__int64 v3; // [rsp+18h] [rbp-108h]__int64 v4; // [rsp+20h] [rbp-100h]__int64 v5; // [rsp+28h] [rbp-F8h]__int64 v6; // [rsp+30h] [rbp-F0h]__int64 v7; // [rsp+38h] [rbp-E8h]__int64 v8; // [rsp+40h] [rbp-E0h]__int64 v9; // [rsp+48h] [rbp-D8h]__int64 v10; // [rsp+50h] [rbp-D0h]__int64 v11; // [rsp+58h] [rbp-C8h]char v12[13]; // [rsp+60h] [rbp-C0h] BYREFchar v13[4]; // [rsp+6Dh] [rbp-B3h] BYREFchar v14[19]; // [rsp+71h] [rbp-AFh] BYREFchar v15[32]; // [rsp+90h] [rbp-90h] BYREFint v16; // [rsp+B0h] [rbp-70h]char v17; // [rsp+B4h] [rbp-6Ch]char v18[72]; // [rsp+C0h] [rbp-60h] BYREFunsigned __int64 v19; // [rsp+108h] [rbp-18h]v19 = __readfsqword(0x28u);qmemcpy(v12, "Iodl>Qnb(ocy", 12);v12[12] = 127;qmemcpy(v13, "y.i", 3);v13[3] = 127;qmemcpy(v14, "d`3w}wek9{iy=~yL@EC", sizeof(v14));memset(v15, 0, sizeof(v15));v16 = 0;v17 = 0;sub_4406E0(0LL, v15, 37LL);v17 = 0;if ( sub_424BA0(v15) == 36 ){for ( i = 0; i < (unsigned __int64)sub_424BA0(v15); ++i ){if ( (unsigned __int8)(v15[i] ^ i) != v12[i] ){result = 4294967294LL;goto LABEL_13;}}sub_410CC0("continue!");memset(v18, 0, 65);sub_4406E0(0LL, v18, 64LL);v18[39] = 0;if ( sub_424BA0(v18) == 39 ){v2 = sub_400E44(v18);v3 = sub_400E44(v2);v4 = sub_400E44(v3);v5 = sub_400E44(v4);v6 = sub_400E44(v5);v7 = sub_400E44(v6);v8 = sub_400E44(v7);v9 = sub_400E44(v8);v10 = sub_400E44(v9);v11 = sub_400E44(v10);if ( !(unsigned int)sub_400360(v11, off_6CC090) ){sub_410CC0("You found me!!!");sub_410CC0("bye bye~");}result = 0LL;}else{result = 4294967293LL;}}else{result = 0xFFFFFFFFLL;}
LABEL_13:if ( __readfsqword(0x28u) != v19 )sub_444020();return result;
}

將"Iodl>Qnb(ocy"賦值給v12,將v12的第12位賦值為127,ASCII碼127對應刪除命令,所以應該是刪除v12的第十二位。下面函數同理,將"y.i"賦值給v13,刪除第三位。將"d`3w}wek9{iy=~yL@EC"

賦值給v14。將v15全部位初始化為0,如果v15長度為36,遍歷v15,如果(v15[i] ^ i) 不等于?v12[i]?

將result 賦值為?4294967294LL,跳轉到LABEL_13。跟進這個函數,發現與flag無關,根據上面的if循環嵌套語句寫一個腳本。

str = [73, 111, 100, 108, 62, 81, 110, 98, 40, 111, 99, 121, 127, 121, 46, 105, 127, 100, 96, 51, 119, 125, 119, 101, 107, 57, 123, 105, 121, 61, 126, 121, 76, 64, 69, 67]
flag = ""
for i in range(0, 35):flag += chr(str[i] ^ i)
print(flag)

前四個字符是flag

繼續分析sub_400E44函數:

__int64 __fastcall sub_400E44(__int64 a1)
{int v2; // [rsp+18h] [rbp-28h]int v3; // [rsp+1Ch] [rbp-24h]__int64 v4; // [rsp+20h] [rbp-20h]__int64 v5; // [rsp+30h] [rbp-10h]__int64 v6; // [rsp+38h] [rbp-8h]v5 = sub_424BA0(a1);if ( v5 % 3 )v4 = 4 * (v5 / 3 + 1);elsev4 = 4 * (v5 / 3);v6 = sub_41EF60(v4 + 1);*(_BYTE *)(v4 + v6) = 0;v2 = 0;v3 = 0;while ( v2 < v4 - 2 ){*(_BYTE *)(v6 + v2) = BASE64_table_4A26C0[*(_BYTE *)(v3 + a1) >> 2];*(_BYTE *)(v6 + v2 + 1LL) = BASE64_table_4A26C0[(16 * (*(_BYTE *)(v3 + a1) & 3)) | (*(_BYTE *)(v3 + 1LL + a1) >> 4)];*(_BYTE *)(v6 + v2 + 2LL) = BASE64_table_4A26C0[(4 * (*(_BYTE *)(v3 + 1LL + a1) & 0xF)) | (*(_BYTE *)(v3 + 2LL + a1) >> 6)];*(_BYTE *)(v6 + v2 + 3LL) = BASE64_table_4A26C0[*(_BYTE *)(v3 + 2LL + a1) & 0x3F];v3 += 3;v2 += 4;}if ( v5 % 3 == 1 ){*(_BYTE *)(v2 - 2LL + v6) = 61;*(_BYTE *)(v2 - 1LL + v6) = 61;}else if ( v5 % 3 == 2 ){*(_BYTE *)(v2 - 1LL + v6) = 61;}return v6;
}

能看到base64加密。

所以函數sub_400E44應該是加密操作。分析sub_400360發現該函數是strcmp,將v11與off_6CC090比較,如果非零,輸出“You found me!!!”

跟進off_6CC090。

繼續跟進aVm0wd2vhuxhtwg。

對其進行多次base64解碼。

找到一個網址,復制打開,發現網站可以說是與flag沒有任何關系,應該是被坑了。

查看一下下面的數據,對其交叉引用得到一個新函數。

unsigned __int64 sub_400D35()
{unsigned __int64 result; // raxunsigned int v1; // [rsp+Ch] [rbp-24h]int i; // [rsp+10h] [rbp-20h]int j; // [rsp+14h] [rbp-1Ch]unsigned int v4; // [rsp+24h] [rbp-Ch]unsigned __int64 v5; // [rsp+28h] [rbp-8h]v5 = __readfsqword(0x28u);v1 = sub_43FD20(0LL) - qword_6CEE38;for ( i = 0; i <= 1233; ++i ){sub_40F790(v1);sub_40FE60();sub_40FE60();v1 = sub_40FE60() ^ 0x98765432;}v4 = v1;if ( ((unsigned __int8)v1 ^ byte_6CC0A0[0]) == 102 && (HIBYTE(v4) ^ (unsigned __int8)byte_6CC0A3) == 103 ){for ( j = 0; j <= 24; ++j )sub_410E90((unsigned __int8)(byte_6CC0A0[j] ^ *((_BYTE *)&v4 + j % 4)));}result = __readfsqword(0x28u) ^ v5;if ( result )sub_444020();return result;
}

分析:賦值v1,再將v1賦值v4,如果高字節與低字節異或為“f”和“g”(四個字節異或很有可能是“flag”),循環取出v1的四個字節與*((_BYTE *)&v4 + j % 4))異或。

提取byte_6CC0A0的數據,寫腳本:

data = [0x40, 0x35, 0x20, 0x56, 0x5D, 0x18, 0x22, 0x45, 0x17, 0x2F, 0x24, 0x6E, 0x62, 0x3C, 0x27, 0x54, 0x48, 0x6C,0x24, 0x6E, 0x72, 0x3C, 0x32, 0x45, 0x5B]
string = ['f', 'l', 'a', 'g']
data2 = []
flag = ""
for i in range(4):data2.append(data[i] ^ ord(string[i])) 
for i in range(len(data)):flag += chr(data[i] ^ data2[i % 4])
print(flag)

解得flag為flag{Act1ve_Defen5e_Test}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697361.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697361.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

React 模態框的設計(二)

自定義組件是每個前端開發者必備的技能。我們在使用現有框架時難免有一些超乎框架以處的特別的需求&#xff0c;比如關于彈窗&#xff0c;每個應用都會用到&#xff0c;但是有時我們使用的框架中提供的彈窗功能也是功能有限&#xff0c;無法滿足我們的應用需求&#xff0c;今天…

【linux】使用 acme.sh 實現了 acme 協議生成免費的SSL 證書

acme.sh 實現了 acme 協議, 可以從 letsencrypt 生成免費的證書. 主要步驟: 安裝 acme.sh生成證書copy 證書到 nginx/apache 或者其他服務更新證書更新 acme.sh出錯怎么辦, 如何調試 下面詳細介紹. 1. 安裝 acme.sh 安裝很簡單, 一個命令: curl https://get.acme.sh | sh…

隱藏餓了么el-select組件的el-select-dropdown部分,只使用el-select的顯示框

隱藏餓了么el-select組件的el-select-dropdown部分,只使用el-select的顯示框 問題: 由于el-select組件的el-select-dropdown部分是自動插入在最外層Body上的&#xff0c;所以在當前組件的scoped中讓el-select-dropdown組件display:none不會生效所以需要&#xff1a; :popper-…

Java架構師之路六、高并發與性能優化:高并發編程、性能調優、線程池、NIO、Netty、高性能數據庫等。

目錄 高并發編程&#xff1a; 性能調優&#xff1a; 線程池&#xff1a; NIO&#xff1a; Netty&#xff1a; 高性能數據庫&#xff1a; 上篇&#xff1a;Java架構師之路五、微服務&#xff1a;微服務架構、服務注冊與發現、服務治理、服務監控、容器化等。-CSDN博客 下篇…

TiDB 7.5.0 LTS 高性能數據批處理方案

過去&#xff0c;TiDB 由于不支持存儲過程、大事務的使用也存在一些限制&#xff0c;使得在 TiDB 上進行一些復雜的數據批量處理變得比較復雜。 TiDB 在面向這種超大規模數據的批處理場景&#xff0c;其能力也一直在演進&#xff0c;其復雜度也變得越來越低&#xff1a; ○ 從…

11.CSS3的媒介(media)查詢

CSS3 的媒介(media)查詢 經典真題 如何使用媒體查詢實現視口寬度大于 320px 小于 640px 時 div 元素寬度變成 30% 媒體查詢 媒體查詢英文全稱 Media Query&#xff0c;顧名思義就是會查詢用戶所使用的媒體或者媒介。 在現在&#xff0c;網頁的瀏覽終端是越來越多了。用戶可…

C++:string類

標準庫中的string類 string類 1. 字符串是表示字符序列的類 2. 標準的字符串類提供了對此類對象的支持&#xff0c;其接口類似于標準字符容器的接口&#xff0c;但添加了專門用于操作單字節字符字符串的設計特性。 3. string類是使用char(即作為它的字符類型&#xff0c;使用…

ChatGPT 是什么

文章目錄 一、ChatGPT 是什么二、ChatGPT的發明者三、ChatGPT的運作方式四、ChatGPT的技術五、ChatGPT的優勢六、ChatGPT的局限性七、ChatGPT的應用八、ChatGPT的未來九、總結 一、ChatGPT 是什么 OpenAI的ChatGPT&#xff0c;即Chat Generative Pre-Trained Transformer&…

3個精美的wordpress企業網站模板

WordPress企業網站模板 https://www.zhanyes.com/qiye/6305.html WordPress企業官網模板 https://www.zhanyes.com/qiye/6309.html WordPress律師模板 https://www.zhanyes.com/qiye/23.html

SQL注入漏洞解析--less-2

首先我們進入第二關 思路&#xff1a; 1.先判斷是什么類型的注入 2.根據類型我們在找注入點 步驟&#xff1a; 1.提示我們輸入id數字&#xff0c;那我們先輸入1猜一下 2.這里正常回顯&#xff0c;當我們后邊加上時可以看到報錯&#xff0c;且報錯信息看不到數字&#xff0…

輕松掌握opencv的8種圖像變換

文章目錄 opencv的8種圖像變換1. 圖像放大、縮小2. 圖像平移3. 圖像旋轉4. 圖像仿射變換5. 圖像裁剪6. 圖像的位運算&#xff08;AND, OR, XOR&#xff09;7. 圖像的分離和融合8. 圖像的顏色空間 opencv的8種圖像變換 1. 圖像放大、縮小 我們先看下原圖 import cv2 import ma…

C++面試:程序的編譯與運行

程序的編譯和運行是軟件開發中的基本環節&#xff0c;尤其是在使用編譯型語言&#xff08;如C/C、Java等&#xff09;進行開發時。這個過程涉及將人類可讀的源代碼轉換成機器能夠執行的指令&#xff0c;然后運行這些指令來完成既定的任務。下面是這一過程的詳細介紹&#xff0c…

基于java+springboot+vue實現的美食信息推薦系統(文末源碼+Lw)23-170

1 摘 要 使用舊方法對美食信息推薦系統的信息進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在美食信息推薦系統的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及時糾正等問題。這次開發…

Shell好用的工具: cut

目標 使用cut可以切割提取指定列\字符\字節的數據 介紹 cut 譯為“剪切, 切割” , 是一個強大文本處理工具&#xff0c;它可以將文本按列進行劃分的文本處理。cut命令逐行讀入文本&#xff0c;然后按列劃分字段并進行提取、輸出等操作。 語法 cut [options] filename opti…

樹中枝繁葉茂:探索 B+ 樹、B 樹、二叉樹、紅黑樹和跳表的世界

歡迎來到我的博客&#xff0c;代碼的世界里&#xff0c;每一行都是一個故事 樹中枝繁葉茂&#xff1a;探索 B 樹、B 樹、二叉樹、紅黑樹和跳表的世界 前言B樹和B樹B樹&#xff08;Binary Tree&#xff09;&#xff1a;B樹&#xff08;B Plus Tree&#xff09;&#xff1a;應用場…

Cobra在ubuntu中設置自動補全

Cobra在ubuntu中設置自動補全 yourprogram指的是你程序&#xff0c;并且必須是使用了Cobra cli bash設置 $ source <(yourprogram completion bash)$ yourprogram completion bash > /etc/bash_completion.d/yourprogramzsh設置 $ echo "autoload -U compinit; …

Linux之用戶和用戶組用戶賬號系統文件

一、簡介 1.用戶的定義 在linux系統中用戶&#xff08;User&#xff09;需要用用戶賬號來訪問系統&#xff0c;服務和信息&#xff0c;系統中的每個進程&#xff08;運行的程序&#xff09;都是使用一個特定的用戶運行。每個文件都屬于一個特定的用戶所有。對文件和目錄的訪…

STM32Cubemx TB6612直流電機驅動

一、TB6612FNG TB6612是一個支持雙電機的驅動模塊&#xff0c;支持PWM調速。PWMA、AIN1、AIN2 為一組控制引腳&#xff0c;PWMA 為 PWM 速度控制引腳&#xff0c;AIN1、AIN2 為方向控制引腳&#xff1b;PWMB、BIN1、BIN2 為一組控制引腳&#xff0c;PWMB 為 PWM 速度控制引腳&…

【力扣hot100】刷題筆記Day11

前言 科研不順啊......又不想搞了&#xff0c;隨便弄弄吧&#xff0c;多花點時間刷題&#xff0c;今天開啟二叉樹&#xff01; 94. 二叉樹的中序遍歷 - 力扣&#xff08;LeetCode&#xff09; 遞歸 # 最簡單遞歸 class Solution:def inorderTraversal(self, root: TreeNode) …

idea運行項目時右下角彈出“Lombok requires enabled annotation processing”

文章目錄 錯誤描述原因分析解決方式參考 錯誤描述 Lombok requires enabled annotation processing&#xff1a;翻譯過來就是Lombok 需要啟用注釋處理 原因分析 idea安裝了Lombok插件&#xff0c;但有些設置未做。 解決方式 參考 idea配置和使用Lombok