2022-01-06
SimpleRev
說明這是一個win文件,沒有加殼,而且是64位的
用IDA64打開
很容易找到main函數
F5查看代碼
讀程序,發現當輸入的字符v4既不是d也不是D的時候會停止內層循環,反之會調用Decry()函數;過了內測循環之后是判斷v4如果等于q或者Q就會直接結束,如果沒有結束(繼續運行的話),會輸出:輸入格式錯誤!
可以查看這個Decry()函數,如下
i++,表示先取i的值進行表達式計算或函數調用,最后加法再計算 i=i+1;
++i,表示先加法計算i=i+1,然后在進行表達式計算或函數調用。
C 庫函數 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串進行比較。
如果返回值小于 0,則表示 str1 小于 str2。
如果返回值大于 0,則表示 str1 大于 str2。
如果返回值等于 0,則表示 str1 等于 str2。
C 庫函數 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的結尾。
join函數,它的作用是以指定的字符連接成一個新的字符串。
加上注釋,轉變為可讀性比較強的
__int64 Decry() {char *v0; // rax@1char v2; // [sp+Fh] [bp-51h]@19int v3; // [sp+10h] [bp-50h]@1signed int v4; // [sp+14h] [bp-4Ch]@1signed int i; // [sp+18h] [bp-48h]@1signed int v6; // [sp+1Ch] [bp-44h]@1char src[8]; // [sp+20h] [bp-40h]@1__int64 v8; // [sp+28h] [bp-38h]@1int v9; // [sp+30h] [bp-30h]@1__int64 v10; // [sp+40h] [bp-20h]@1__int64 v11; // [sp+48h] [bp-18h]@1int v12; // [sp+50h] [bp-10h]@1__int64 v13; // [sp+58h] [bp-8h]@1v13 = *MK_FP(__FS__, 40LL);*(_QWORD *)src = 'SLCDN';v8 = 0LL;v9 = 0;v10 = 'wodah';v11 = 0LL;v12 = 0;LODWORD(v0) = join(key3, &v10); // key3=='kills',v10='wodah'。連接key3,v10text = v0;strcpy(key, key1); // key1=='ADSFK',src=='SLCDN'。連接strcat(key, src);v3 = 0;v4 = 0;getchar();v6 = strlen(key); // 10for ( i = 0; i < v6; ++i ){if ( key[v4 % v6] > '@' && key[v4 % v6] <= 'Z' )key[i] = key[v4 % v6] + 32; // 如果key里有大寫字符,變成小寫++v4;}printf("Please input your flag:", src);while ( 1 ){v2 = getchar();if ( v2 == '\n' )break;if ( v2 == ' ' ){++v3;}else{if ( v2 <= '`' || v2 > 'z' ){if ( v2 > '@' && v2 <= 'Z' ) // 如果是大寫字符str2[v3] = (v2 - '\'' - key[v4++ % v6] + 'a') % 26 + 'a';}else // 如果是小寫字母{str2[v3] = (v2 - '\'' - key[v4++ % v6] + 'a') % 26 + 'a';// 都變成小寫字符,并且按位減去key中字符-'a'}if ( !(v4 % v6) )putchar(' ');++v3;}}if ( !strcmp(text, str2) )//如果text==str2puts("Congratulation!\n");elseputs("Try again!\n");return *MK_FP(__FS__, 40LL) ^ v13; }了解過程就容易寫程序了
#include <stdio.h> int main() {char key[] = "adsfkndcls";char text[] = "killshadow";int v = 10;for (int i = 0; i < 10; i++){for (int j = 65; j < 123; j++){if (j > 'Z' && j < 'a'){continue;}if ((j - 39 - key[v % 10] + 'a') % 26 + 'a' == text[i]){printf("%c",j);v++;break;}}}printf("\n");return 0; }運行得到
提交flag{KLDQCUDFZO}顯示正確
Java逆向解密
程序員小張不小心弄丟了加密文件用的秘鑰,已知還好小張曾經編寫了一個秘鑰驗證算法,聰明的你能幫小張找到秘鑰嗎? 注意:得到的 flag 請包上 flag{} 提交
解壓就得到一個.class文件,用Eclipse還打不開
搜了一下java反編譯工具,jd-gui要下載,直接用的在線反編譯網站:https://jdec.app/
得到
還是習慣用python敲
strs = [180, 136, 137, 147, 191, 137, 147, 191,148, 136, 133, 191, 134, 140, 129, 135, 191, 65]flag = "" for i in range(0,len(strs)):flag += chr(strs[i] - ord('@') ^ 0x20) print(flag)運行得到
flag{This_is_the_flag_!}
總結
以上是生活随笔為你收集整理的2022-01-06的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: base64加密原理及python、C语
- 下一篇: 2022-01-12