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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

REVERSE-PRACTICE-CTFSHOW-1

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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部分,簡單的異或運算和比較

寫腳本可得到密鑰

s="DH~mqqvqxB^||zll@Jq~jkwpmvez{" key="" for c in s:key+=chr(ord(c)^0x1f) print(key) #[Warnning]Access_Unauthorized

程序用密鑰對明文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的部分,最后要比較的字符串是明文可知的,每次循環比較兩個字符

最后寫腳本即可得到正確的輸入數字

table=")(*&^%489$!057@#><:2163qwe" ans="/..v4p$$!>Y59-" ans_s="" for c in ans:ans_s+=chr(ord(c)^7) print(ans_s) num=0 for c in ans_s:num *= 26index=table.find(c)num+=index print(num) #())q3w##&9^2>* #2484524302484524302

逆向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的全部內容,希望文章能夠幫你解決所遇到的問題。

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