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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

REVERSE-PRACTICE-BUUCTF-14

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 REVERSE-PRACTICE-BUUCTF-14 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

REVERSE-PRACTICE-BUUCTF-14

    • [FlareOn3]Challenge1
    • [GUET-CTF2019]number_game
    • [GWCTF 2019]re3
    • [網鼎杯 2020 青龍組]singal

[FlareOn3]Challenge1

exe程序,運行后提示輸入密碼,輸入錯誤退出程序,無殼,ida分析
main函數邏輯清晰,讀取輸入,對輸入進行變表base64編碼,驗證編碼結果

之前遇到過變表base64的題目,見REVERSE-PRACTICE-BUUCTF-7或REVERSE-PRACTICE-BUUCTF-10或base64原理及其編解碼的python實現
這道題用一個工具,加密解密小玩具,來解,非常方便

[GUET-CTF2019]number_game

elf文件,無殼,ida分析
main函數,獲取輸入,檢驗輸入長度是否為10且均為0~4的數字,先后經過先序遍歷和中序遍歷改變輸入中各個字符的位置,再順序地放入數獨“#”位置,最后檢驗數獨

sub_400758函數和sub_400807函數先后經過先序遍歷和中序遍歷改變輸入中各個字符的位置,本人一直想不通,于是動調,當輸入為0123456789時,sub_400807函數調用結束后的v7為7381940526,于是可以知道輸入中字符位置變換的規律
變換前的下標:0 1 2 3 4 5 6 7 8 9
變換后的下標:7 3 8 1 9 4 0 5 2 6
再解數獨,在sub_400917函數中可知為5x5的數獨

寫代碼換成正確的位置即可得到flag

由于輸入長度只有10位,且均為0~4的數字,也可以寫腳本爆破得到flag

[GWCTF 2019]re3

elf文件,無殼,ida分析
main函數,讀取輸入,檢驗輸入長度是否為32,有一段SMC,自修改代碼

ida靜態分析,先寫idapython腳本完成smc
smc執行前,地址0x402219處是一大段數據

smc的idapython腳本

from idaapi import * from idautils import * start_addr = 0x402219 key = 0x99 for i in range(start_addr,start_addr+224):PatchByte(i,Byte(i)^key)

smc執行完成后,按c轉換成代碼

在地址0x402219處右鍵->Edit function,將函數結束地址修改為retn指令所在地址,完成后F5反匯編
用插件Findcrypt發現sub_402219是對輸入的AES加密,密鑰為unk_603170,密文為res

遠程調試elf,得到密鑰unk_603170

寫AES解密腳本即可得到flag

[網鼎杯 2020 青龍組]singal

exe程序,運行后提示輸入string,無殼,ida分析
main函數,分析可知是vm的題目,dword_403040中的數據作為opcode傳入vm_operad函數中

進入vm_operad函數,分析可知
opcode為10時,讀取輸入,長度為15
opcode為1時,v4被賦值
opcode為7時,v4和下一個opcode比較,于是7后面的opcode為密文
其余的opcode為input的相關運算

int __cdecl vm_operad(int *opcode, int a2) {int result; // eaxchar input[100]; // [esp+13h] [ebp-E5h]char v4[100]; // [esp+77h] [ebp-81h]char v5; // [esp+DBh] [ebp-1Dh]int v6; // [esp+DCh] [ebp-1Ch]int v7; // [esp+E0h] [ebp-18h]int v8; // [esp+E4h] [ebp-14h]int v9; // [esp+E8h] [ebp-10h]int opcode_index; // [esp+ECh] [ebp-Ch]opcode_index = 0;v9 = 0;v8 = 0;v7 = 0;v6 = 0;while ( 1 ){result = opcode_index;if ( opcode_index >= a2 )return result;switch ( opcode[opcode_index] ){case 1: // 每當opcode為1時,v4被賦值v4[v7] = v5;++opcode_index;++v7;++v9;break;case 2: // 每當opcode為2時,v5被賦值為下一個opcode與input的和v5 = opcode[opcode_index + 1] + input[v9];// 由于運算使用了下一個opcode,所以opcode_index加2opcode_index += 2;break;case 3:v5 = input[v9] - LOBYTE(opcode[opcode_index + 1]);// 每當opcode為3時,v5被賦值為input與下一個opcode的差opcode_index += 2; // 由于運算使用了下一個opcode,所以opcode_index加2break;case 4:v5 = opcode[opcode_index + 1] ^ input[v9];// 每當opcode為4時,v5被賦值為input與下一個opcode異或的值opcode_index += 2; // 由于運算使用了下一個opcode,所以opcode_index加2break;case 5:v5 = opcode[opcode_index + 1] * input[v9];// 每當opcode為5時,v5被賦值為input與下一個opcode乘積的值opcode_index += 2; // 由于運算使用了下一個opcode,所以opcode_index加2break;case 6: // 每當opcode為6時,跳到下一個opcode++opcode_index;break;case 7: // 每當opcode為7時,驗證v4和下一個opcode是否相等,意味著opcode等于7的下一個opcode為密文if ( v4[v8] != opcode[opcode_index + 1] ){printf("what a shame...");exit(0);}++v8;opcode_index += 2; // 由于驗證使用了下一個opcode,所以opcode_index加2break;case 8: // 每當opcode為8時,input的值修改input[v6] = v5;++opcode_index;++v6;break;case 10: // opcode的第一個值為10,所以先讀取輸入,長度為15read(input);++opcode_index;break;case 11: // 每當opcode為11時,v5被賦值為input與數字1的差v5 = input[v9] - 1;++opcode_index;break;case 12: // 每當opcode為12時,v5被賦值為input與數字1的和v5 = input[v9] + 1;++opcode_index;break;default:continue;}} }

提取出114個opcode,手動進行分類,并按照操作碼得到input[0~14]的變換過程

寫逆運算腳本即可得到flag

此題目也可以用angr一把梭

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的REVERSE-PRACTICE-BUUCTF-14的全部內容,希望文章能夠幫你解決所遇到的問題。

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