生活随笔
收集整理的這篇文章主要介紹了
REVERSE-PRACTICE-BUUCTF-8
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
REVERSE-PRACTICE-BUUCTF-8
- [GUET-CTF2019]re
- 相冊
- [V&N2020 公開賽]strangeCpp
- [BJDCTF2020]easy
[GUET-CTF2019]re
elf文件,有upx殼,脫殼后ida分析
字符串交叉引用來到主邏輯函數sub_400E28
邏輯清晰,獲取輸入,驗證輸入,重要的是sub_4009AE函數
進入sub_4009AE函數,是對輸入每個字符的驗證,輸入長度為32,這里沒有驗證input[6]
寫腳本,由于程序沒有驗證input[6],即“#”位置的字符,試出來為“1”時提交成功
相冊
apk文件,用jadx-gui沒發現主邏輯
用Apktool Box反編譯apk,xiangce1->lib->armeabi->libcore.so
ida分析該so文件
shift+F12,在字符串窗口的最下面發現三段可疑字符串,很像base64
解這三段字符串,由題目的提示可知,flag的內容為完整的郵箱
[V&N2020 公開賽]strangeCpp
exe程序,運行后輸出了本機系統相關的信息,按任意鍵結束,無殼,ida分析
在字符串窗口找到一些字符串,提示真正的flag需要找找
字符串交叉引用來到sub_140013AA0函數,該函數就是獲取了本機系統信息然后打印,乍一看沒什么特殊的地方
__int64 __fastcall
sub_140013AA0(__int64 a1
, __int64 a2
, __int64
*a3
)
{char *v3
; signed __int64 i
; __int64 v5
; __int64 v6
; __int64 v7
; __int64 v8
; char v10
; struct _SYSTEM_INFO SystemInfo
; __int64
*j
; __int64 v13
; __int64
*v14
; v14
= a3
;v3
= &v10
;for ( i
= 94i64
; i
; --i
){*(_DWORD
*)v3
= -858993460;v3
+= 4;}sub_1400110AA(&unk_140027033
);GetSystemInfo(&SystemInfo
);putchar(byte_140021004
);putchar(byte_140021005
);putchar(byte_140021006
);putchar(byte_140021007
);putchar(byte_140021019
);putchar(byte_14002101A
);putchar(byte_140021005
);putchar(10);puts("Let me have a look at your computer...");for ( j
= v14
; *j
; ++j
){v13
= *j
;sub_140011226("%s\n", v13
);}std
::basic_ostream
<char,std
::char_traits
<char>>::operator
<<(std
::cout
, sub_140011127
);dword_140021190
= SystemInfo
.dwNumberOfProcessors
;sub_140011226("now system cpu num is %d\n", SystemInfo
.dwNumberOfProcessors
);if ( dword_140021190
< 8 ){puts("Are you in VM?");_exit(0);}if ( GetUserNameA(Str1
, &pcbBuffer
) ){v5
= sub_140011172(std
::cout
, "this is useful");std
::basic_ostream
<char,std
::char_traits
<char>>::operator
<<(v5
, sub_140011127
);}v6
= std
::basic_ostream
<char,std
::char_traits
<char>>::operator
<<(std
::cout
, sub_140011127
);v7
= sub_140011172(v6
, "ok,I am checking...");std
::basic_ostream
<char,std
::char_traits
<char>>::operator
<<(v7
, sub_140011127
);if ( !j_strcmp(Str1
, "cxx") ){v8
= sub_140011172(std
::cout
, "flag{where_is_my_true_flag?}");std
::basic_ostream
<char,std
::char_traits
<char>>::operator
<<(v8
, sub_140011127
);_exit(0);}system("pause");sub_1400113E3(&v10
, &unk_14001DE50
);return 0i64
;
}
仔細觀察發現,在sub_140013AA0函數開始的部分,幾個putchar的參數的存儲地址并不連續
進入到data段,在“welc”和“om”之間有一個在sub_140013AA0函數中沒有用到的數組
交叉引用這個數組來到sub_140013580函數,分析知道,有一個arg和這個數組的元素依次異或后輸出,重要的是求出這個arg
arg首先作為參數傳入了sub_140011384函數,返回結果存儲在result中,下面的if語句對result和arg都有要求,進入sub_140011384函數,可知resul可由arg求出
寫腳本即可得到flag
#include<stdio.h>
void main()
{unsigned char arr
[] = { 0x26, 0x2C, 0x21, 0x27, 0x3B, 0x0D, 0x04, 0x75, 0x68, 0x34,0x28, 0x25, 0x0E, 0x35, 0x2D, 0x69, 0x3D };__int64 result
= 607052314;int arg
= 0;while (arg
<= 14549743){int v5
= arg
>> 12;int v6
= arg
<< 8;if (result
==(v6
^v5
)*291){printf("%d——", arg
);for (int i
= 0; i
< 17; i
++){printf("%c", arr
[i
] ^ arg
);}printf("\n");}arg
+= 1;}return;
}
運行結果
[BJDCTF2020]easy
exe程序,運行后提示要找flag,無殼,ida分析
main函數沒什么特殊的地方
在函數窗main函數的上面有一個ques函數,ques函數沒有要求輸入,但是有輸出打印
想要看看ques函數打印了什么東西,要調試這個exe程序,在main函數return前下斷點
程序停下后,去到ques函數的第一條指令處,設置為當前IP
在ques函數return前下斷點,F9執行完ques函數,打印的內容即為flag
總結
以上是生活随笔為你收集整理的REVERSE-PRACTICE-BUUCTF-8的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。