BUUCTF-Reverse:SimpleRev(算法分析题)
生活随笔
收集整理的這篇文章主要介紹了
BUUCTF-Reverse:SimpleRev(算法分析题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目地址:https://buuoj.cn/challenges#SimpleRev
查殼:
得知消息:ELF 64
直接拖進ida64分析
分析代碼可知:只有輸入d或D才能進入Decry()函數,否則退出,現在進入函數
int v2; // [rsp+10h] [rbp-50h]int v3; // [rsp+14h] [rbp-4Ch]int i; // [rsp+18h] [rbp-48h]int v5; // [rsp+1Ch] [rbp-44h]char src[8]; // [rsp+20h] [rbp-40h]__int64 v7; // [rsp+28h] [rbp-38h]int v8; // [rsp+30h] [rbp-30h]__int64 v9; // [rsp+40h] [rbp-20h]__int64 v10; // [rsp+48h] [rbp-18h]int v11; // [rsp+50h] [rbp-10h]unsigned __int64 v12; // [rsp+58h] [rbp-8h]v12 = __readfsqword(0x28u);*(_QWORD *)src = 357761762382LL;// SLCDNv7 = 0LL;v8 = 0;v9 = 512969957736LL; //wodahv10 = 0LL;v11 = 0;text = (char *)join(key3, &v9);//key3=kills v9=hadow 將V9拼接到key3上,雙擊key3 發現是killsstrcpy(key, key1); // key1=ADSFKstrcat(key, src); // src=NDCLS 把src拼接到key上面v2 = 0;v3 = 0;getchar();v5 = strlen(key);for ( i = 0; i < v5; ++i ) //v5=10{if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 )key[i] = key[v3 % v5] + 32;//把大寫變成小寫++v3;}//V3=10printf("Please input your flag:", src);while ( 1 ){v1 = getchar();if ( v1 == 10 )break;if ( v1 == 32 ){++v2;}else{if ( v1 <= 96 || v1 > 122 ){if ( v1 > 64 && v1 <= 90 ) // 大寫字母str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;}else //小寫字母{str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;}if ( !(v3 % v5) )putchar(32);++v2;}}//經過一系列變化后等于text就可以了if ( !strcmp(text, str2) ) // text=killshadowputs("Congratulation!\n");elseputs("Try again!\n");return __readfsqword(0x28u) ^ v12; }strcat是用來拼接字符串的,它會將參數 src 字符串復制到參數 dest 所指的字符串尾部。
函數strcpy(字符數組1,字符串2)作用就是 將字符串2復制到字符數組1 中去
getchar()函數的作用是從計算機終端(一般為鍵盤)獲取一個無符號字符。getchar()函數只能接收一個字符,其函數值就是從輸入設備獲取到的字符。
putchar的功能:是在屏幕上顯示一個字符。 比如:putchar(‘a’);就是在屏幕上顯示字符a
strlen() 函數從字符串的開頭位置依次向后計數,直到遇見\0,然后返回計時器的值。最終統計的字符串長度不包括\0。
C語言腳本:
#include<stdio.h> int main() {char key[] = "adsfkndcls";char text[] = "killshadow";int i;int v3=10;//長度 for (int i = 0; i < 10; i++){for (int j = 0; j < 128; j++){if (j < 'A' || j > 'z' || j > 'Z' && j < 'a'){continue;}if ((j - 39 - key[v3 % 10] + 97) % 26 + 97 == text[i]){printf("%c",j);v3++;break;}}} }得到flag
KLDQCUDFZO
總結
以上是生活随笔為你收集整理的BUUCTF-Reverse:SimpleRev(算法分析题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 逆向基础之C语言 第一篇
- 下一篇: python输出自己的名字_【Pytho