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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

REVERSE-PRACTICE-CthulhuOJ

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

REVERSE-PRACTICE-CthulhuOJ

    • Cthulhu OJ-simple
    • Cthulhu OJ-easy-VM

Cthulhu OJ-simple

exe程序,運行后提示輸入flag,無殼,用ida分析
main函數,輸入和下標異或,結果與已知的res數組比較

寫逆異或運算腳本即可得到flag

res=[122,114,118,118,103,113,96,124,92,97,59,120,83,60,125,80,113,78,39,34,121,101,122,114,71,126,91,118,121,96,30] flag=[] for i in range(0,31):flag.append(i^res[i]) print(''.join(chr(i) for i in flag)) #zstuctf{Th1s_1s_a_51mple_gAme}

Cthulhu OJ-easy-VM

elf文件,運行后輸入,無殼,ida分析
main函數邏輯清晰,讀取輸入,限制輸入的最大長度為32,將輸入傳入vm進行變換,將變換后的輸入與已知字符串進行比較,驗證輸入

進入start_vm函數,感覺由opcode決定的各種運算非常亂,幾個字節來回交換,也有異或運算,不太明白怎么寫逆vm腳本

__int64 __fastcall start_vm(const char *a1, __int64 a2) {__int64 result; // rax__int64 v3; // [rsp+0h] [rbp-20h]unsigned __int8 v4; // [rsp+1Fh] [rbp-1h]v3 = a2;state = a2;while ( 1 ){result = (unsigned __int8)a1[(unsigned __int8)byte_5640DC557028];v4 = a1[(unsigned __int8)byte_5640DC557028];if ( !v4 )break;switch ( (unsigned int)off_5640DC355F50 ){case 1u:li(a1[(unsigned __int8)byte_5640DC557028 + 1], (unsigned __int8)a1[(unsigned __int8)byte_5640DC557028 + 2]);break;case 2u:lb(a1[(unsigned __int8)byte_5640DC557028 + 1], (unsigned __int8)a1[(unsigned __int8)byte_5640DC557028 + 2]);break;case 3u:sb(a1[(unsigned __int8)byte_5640DC557028 + 1], a1[(unsigned __int8)byte_5640DC557028 + 2]);break;case 4u:sub(a1[(unsigned __int8)byte_5640DC557028 + 1],a1[(unsigned __int8)byte_5640DC557028 + 2],a1[(unsigned __int8)byte_5640DC557028 + 3]);break;case 5u:xor(a1[(unsigned __int8)byte_5640DC557028 + 1],a1[(unsigned __int8)byte_5640DC557028 + 2],a1[(unsigned __int8)byte_5640DC557028 + 3]);break;case 6u:jmp(a1[(unsigned __int8)byte_5640DC557028 + 1]);break;case 7u:beq(a1[(unsigned __int8)byte_5640DC557028 + 1],a1[(unsigned __int8)byte_5640DC557028 + 2],a1[(unsigned __int8)byte_5640DC557028 + 3]);break;case 8u:call(a1[(unsigned __int8)byte_5640DC557028 + 1]);break;case 9u:ret();break;default:printf("unrecognized opcode: %#x\n", v4, v3);break;}byte_5640DC557028 += 4;}return result; }

動調,把最后要比較的字符串當作輸入,發現經過vm變換后直接得到了flag
需要注意的是,輸入的長度限制為32,已知的字符串不考慮轉義字符的話,其長度為33,所以調試的時候,輸入要把多出來的一個"\"去掉,經過vm即可得到flag

總結

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

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