REVERSE-PRACTICE-CTFSHOW-1
REVERSE-PRACTICE-CTFSHOW-1
- 逆向簽到題
- re2
- 逆向4
- 逆向5
逆向簽到題
ida打開即可得到明文flag
re2
附件是一個加密過的flag文本和勒索病毒exe
運行程序,輸入1,回車,直接退出,ida分析
選項1的邏輯為,打開flag.txt和enflag.txt,要求輸入正確的密鑰,然后使用密鑰對明文flag進行RC4加密,密文寫到enflag.txt
分析check_key部分,簡單的異或運算和比較
寫腳本可得到密鑰
程序用密鑰對明文flag進行RC4加密,現已知密文和密鑰,寫RC4解密腳本即可得到flag
#include<stdio.h> void rc4_init(unsigned char* s, unsigned char* key, unsigned long Len_k) //初始化函數 {int i = 0, j = 0;char k[256] = { 0 };unsigned char tmp = 0;for (i = 0; i < 256; i++) {s[i] = i;k[i] = key[i % Len_k];}for (i = 0; i < 256; i++) {j = (j + s[i] + k[i]) % 256;tmp = s[i];s[i] = s[j];s[j] = tmp;} } void rc4_crypt(unsigned char* Data, unsigned long Len_D, unsigned char* key, unsigned long Len_k) //加解密 {unsigned char s[256];rc4_init(s, key, Len_k);int i = 0, j = 0, t = 0;unsigned long k = 0;unsigned char tmp;for (k = 0; k < Len_D; k++) {i = (i + 1) % 256;j = (j + s[i]) % 256;tmp = s[i];s[i] = s[j];s[j] = tmp;t = (s[i] + s[j]) % 256;Data[k] = Data[k] ^ s[t];} } void main() {unsigned char key[] = "[Warnning]Access_Unauthorized";unsigned long key_len = sizeof(key) - 1;unsigned char data[] = { 0xC3,0x82,0xA3,0x25,0xF6,0x4C,0x36,0x3B,0x59,0xCC,0xC4,0xE9,0xF1,0xB5,0x32,0x18,0xB1,0x96,0xAe,0xBF,0x08,0x35};rc4_crypt(data, sizeof(data), key, key_len);for (int i = 0; i < sizeof(data); i++){printf("%c", data[i]);}printf("\n");return; } //flag{RC4&->ENc0d3F1le}逆向4
exe程序,要求輸入正確的數字,ida分析
靜態看不明白,起調試
可以看到,輸入作為第一個參數,傳入了sub_7FF62E5010E0函數
F7步入sub_7FF62E5010E0函數,先分析第一部分
21行和22行合并后,可以理解為,輸入的數字對26取余,余數作為下標在一個table里取值,然后輸入的數字除以26得到新的數字,再用新的數字對26取余,余數作為下標在table取值,以此類推,直到最后的數字除以26為0終止,取出的值放到一塊連續的內存
然后分析第二部分
index是上面取出的值的數目,也就是說v7是從高地址向低地址依次取值的
因為上面先用余數作的下標,再做的除運算,于是每次取出的值可以理解為是按輸入的數字的較小的部分取出的
暫時忽略在table里取值這一步,實際上就是小值存儲在小地址,小端序的特點
v7依次取值,和7異或一下,結果存儲到一塊內存
sub_7FF62E501220函數是check的部分,最后要比較的字符串是明文可知的,每次循環比較兩個字符
最后寫腳本即可得到正確的輸入數字
逆向5
附件是一個dll和一個exe,exe運行直接彈窗,點擊確定后直接退出,ida分析
main->sub_4015BD
可以看到,這里判斷Str[1]是否等于1,而Str是給定的明文且Str[1]!=1,于是這個判斷不成立
分析sub_401520函數,這里加載了另一個附件1.dll,然后找到了H
循環體中依次取Str中的值,然后作為參數傳入H
最后sub_40163E函數里有個putchar打印H處理Str[i]后的內容
因為之前Str[1]!=1,所以不會執行sub_401520函數
起調試,停在那條if語句處,在執行jnz之前把ZF標志為由0改為1
修改后在下圖所示語句處下斷點,F9運行到此處,再F8執行sub_40163E函數,即可在黑窗看到flag
總結
以上是生活随笔為你收集整理的REVERSE-PRACTICE-CTFSHOW-1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 数据分析三剑客之 Matp
- 下一篇: 解决Hbase输入list,创建表报错,