iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
Security

picoCTF 刷題分享系列 第 28

picoCTF 刷題分享---Day 28(組語理論補足)

  • 分享至 

  • xImage
  •  

今天去參加了鐵人賽,才知道原來考試的題目是類似於給你個程式碼,問你這會造成什麼樣的攻擊,我是覺得蠻酷的啦。我還是想再解一題我試試看,不行再回來寫理論吧!


題目:Classic Crackme 0x100

  • 首先會看到strcpy(output, "mpknnphjngbhgzydttvkahppevhkmpwgdzxsykkokriepfnrdm");
  • 可以想像成 OUTPUT = mpknnphjngbhgzydttvkahppevhkmpwgdzxsykkokriepfnrdm;
  • 再來會要你輸入isoc99_scanf("%50s", input);
  • 這代表要你輸入50個字元,與output的長度一樣(
    char input[51]; // [rsp+0h] [rbp-A0h] BYREF
    char output[51]; // [rsp+40h] [rbp-60h] BYREF
    這裡有寫
  • 再來會看到secret1、secret2、secret3跟fix(fix:是修正值表'a',但我原本也看不出來
  • 進入while loop,會發現i從0~2跑三次(代表會進行三次的加密:
  • 再來會進入for loop對每一個字元進行加密,可從for ( i_0 = 0; i_0 < len; ++i_0 )看出來
    每個字都會輪一遍
  • 開始計算random1:
    • (secret1 & (i_0 % 255)) + (secret1 & ((i_0 % 255) >> 1));
    • 簡單來說會得到一個int
    • ((i_0 % 255) >> 1)那他會一直除2所以要反過來((i_0 % 255) << 1)
  • 一樣的道理會得到random2:(random1 & secret2) + (secret2 & (random1 << 2))
  • 再來才是重點部分
input[i_0] = ((random2 & secret3) + input[i_0] - fix + (secret3 & (random2 >> 4))) % 26 + fix;
  • 這句我們可以先重新整理整理變成
input[i_0] = (input[i_0]-fix+ (random2 & secret3)+(secret3 & (random2 >> 4)))%26+fix

逆向時要反著看,以e_intput[i_0]代表加密後的input,原始的input就叫input:
input = e_intput[i_0] - fix(因為最後面再加密時加上了fix)
input = e_intput[i_0] - fix(原本的mod26不需要去限制(不然y會出不來)

  • 他在()mod26裡面把input加上了(secret3 & (random2 >> 4)跟(random2 & secret3)減掉了fix
  • 所以做逆向(要注意在最後加上fix值以前要記得%26:
    input = (e_intput[i_0] - fix -(secret3 & (random2 >> 4)-(random2 & secret3))%26+fix
    把它寫成程式碼,記得要先把文字轉數字喔!
    用python寫一遍:
def decrypto(e_input):
        secret1 = 85
        secret2 = 51
        secret3 = 15
        fix = 97
        for i in range(3):
            for i_0 in range(len(e_input)):
                random1 = (secret1 & (i_0 % 255)) + (secret1  & (i_0 % 255) >> 1)
                random2 = (random1 & secret2) + (secret2 & (random1 >> 2))
                e_input[i_0] = chr(((ord(e_input[i_0]) - fix - (random2 & secret3) - (secret3 & (random2 >> 4))) % 26) + fix)

e_input = list("mpknnphjngbhgzydttvkahppevhkmpwgdzxsykkokriepfnrdm")
decrypto(e_input)
print("".join(e_input))


後記:
又多活了一天/images/emoticon/emoticon02.gif,這題是真的好難啊...快掛了


上一篇
picoCTF 刷題分享---Day 27(組語理論補足)
下一篇
picoCTF 刷題分享---Day 29(python dis module理論補足)
系列文
picoCTF 刷題分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言