日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BUUCTF-Reverse:SimpleRev(算法分析题)

發布時間:2025/3/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BUUCTF-Reverse:SimpleRev(算法分析题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目地址:https://buuoj.cn/challenges#SimpleRev

查殼:

得知消息:ELF 64
直接拖進ida64分析

int __cdecl __noreturn main(int argc, const char **argv, const char **envp) {int v3; // eaxchar v4; // [rsp+Fh] [rbp-1h]while ( 1 ){while ( 1 ){printf("Welcome to CTF game!\nPlease input d/D to start or input q/Q to quit this program: ", argv, envp);v4 = getchar();if ( v4 != 100 && v4 != 68 ) //100的ASCII碼是d 68的ASCII碼是Dbreak;Decry();}if ( v4 == 113 || v4 == 81 )//113的ASCII碼是q 81的ASCII碼是QExit();puts("Input fault format!");v3 = getchar();putchar(v3);} }

分析代碼可知:只有輸入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(算法分析题)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。