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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[羊城杯 2020]Bytecode [UTCTF2020]babymips

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [羊城杯 2020]Bytecode [UTCTF2020]babymips 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • [羊城杯 2020]Bytecode
    • 查看題目
    • python代碼
      • 注意點:
      • BINARY_SUBTRACT 這個是減法
      • BINARY_SUBSCR 這個是索引
    • Z3約束腳本
      • 注意點:
      • 注意最后五個順序
    • 總結:
  • [UTCTF2020]babymips
    • jeb:
    • ida:
    • 總結:
      • jeb中注意`4199924`形式的數據可能是地址
      • (v2 ^ 78) > 0

[羊城杯 2020]Bytecode

查看題目


python字節碼,需要把它轉為python代碼,如下:

python代碼

import disdef main():en=[3,37,72,9,6,132]output=[101,96,23,68,112,42,107,62,96,53,176,179,98,53,67,29,41,120,60,106,51,101,178,189,101,48]print("welcome to GWHT2020")flag=raw_input("please input your flag:")str=flaga=len(str)if a>=38:print('lenth wrong!')exit(0)if((((ord(str[0])*2020+ord(str[1]))*2020+ord(str[2]))*2020+ord(str[3]))*2020+ord(str[4]))*2020==1182843538814603:print('good!continue\xe2\x80\xa6\xe2\x80\xa6')x=[]k=5for i in range(13):b=ord(str[k])c=ord(str[k+1])a11=c^(en[i%6])a22=b^(en[i%6])x.append(a11)x.append(a22)k+=2if x==output:print("good!continue\xe2\x80\xa6\xe2\x80\xa6")l=len(str)a1=ord(str[l-7])a2=ord(str[l-6])a3=ord(str[l-5])a4=ord(str[l-4])a5=ord(str[l-3])a6=ord(str[l-2])if a1*3+a2*2+a3*5==1003:if a1*4+a2*7+a3*9==2013:if a1+a2*8+a3*2==1109:if a4*3+a5*2+a6*5==671:if a4*4+a5*7+a6*9==1252:if a4+a5*8+a6*2==644:print('congraduation!you get the right flag!')

字節碼解釋文章:
https://forgo7ten.github.io/2020/01/28/2020012801/#%E8%B7%B3%E8%BD%AC
https://docs.python.org/zh-cn/3/library/dis.html#python-bytecode-instructions

看了python代碼后,緊接著需要用z3約束來進行解答,更加簡便

注意點:

BINARY_SUBTRACT 這個是減法

BINARY_SUBSCR 這個是索引

Z3約束腳本

from z3 import * def main():s=Solver()flag=[]for i in range(5):flag.append(Int("flag%i"%i))s.add(((((flag[0] * 2020 + flag[1]) * 2020 + flag[2]) * 2020 + flag[3]) * 2020 +flag[4]) == 1182843538814603)for i in range(5):s.add(flag[i]>30)s.add(flag[i]<128)if s.check()==sat:print(s.model())en=[3,37,72,9,6,132]output=[101,96,23,68,112,42,107,62,96,53,176,179,98,53,67,29,41,120,60,106,51,101,178,189,101,48]ss=Solver()flag2=[]j=0for i in range(13):flag2.append(output[j+1]^en[i%6])flag2.append(output[j]^en[i%6])j+=2print(flag2)sss=Solver()flag3=[]for i in range(6):flag3.append(Int("flag3%i"%i))sss.add((flag3[0]*3+flag3[1]*2+flag3[2]*5)==1003)sss.add((flag3[0]*4+flag3[1]*7+flag3[2]*9)==2013)sss.add((flag3[0]*1+flag3[1]*8+flag3[2]*2)==1109)sss.add((flag3[3]*3+flag3[4]*2+flag3[5]*5)==671)sss.add((flag3[3]*4+flag3[4]*7+flag3[5]*9)==1252)sss.add((flag3[3]*1+flag3[4]*8+flag3[5]*2)==644)for i in range(5):sss.add(flag3[i]>30)sss.add(flag3[i]<128)if sss.check()==sat:print(sss.model())if __name__=="__main__":main()

注意點:

for i in range(13):flag2.append(output[j+1]^en[i%6])flag2.append(output[j]^en[i%6])

這里不能當成range(26)來算,因為en下標同一組是一樣的

a=[71,87,72,84,123,99,102,97,50,98,56,55,98,51,102,55,52,54,97,56,102,48,97,99,53,99,53,57,54,51,102,97,101,102,102,55,51]

注意最后五個順序

GWHT{cfa2b87b3f746a8f0ac5c5963faeff73

加上最后一半}

GWHT{cfa2b87b3f746a8f0ac5c5963faeff73}

總結:

此次題目不難,flag分成三部分來看待即可,最主要就是了解python字節碼,懂得如何把Python字節碼轉換成python偽代碼,緊接著再來進行下一步的分析

[UTCTF2020]babymips

jeb:


4199924這玩意是個地址,是我萬萬沒想到的。。。

按下鍵盤d后,就轉換回地址了,然后即可進行分析

jeb跟ida比起來是真的一言難盡。。。


內部函數,簡直一團亂麻。

ida:


ida這玩意分析得多棒,清秀簡潔

unsigned char ida_chars[] = {0x62, 0x6C, 0x7F, 0x76, 0x7A, 0x7B, 0x66, 0x73, 0x76, 0x50, 0x52, 0x7D, 0x40, 0x54, 0x55, 0x79, 0x40, 0x49, 0x47, 0x4D, 0x74, 0x19, 0x7B, 0x6A, 0x42, 0x0A, 0x4F, 0x52, 0x7D, 0x69, 0x4F, 0x53, 0x0C, 0x64, 0x10, 0x0F, 0x1E, 0x4A, 0x67, 0x03, 0x7C, 0x67, 0x02, 0x6A, 0x31, 0x67, 0x61, 0x37, 0x7A, 0x62, 0x2C, 0x2C, 0x0F, 0x6E, 0x17, 0x00, 0x16, 0x0F, 0x16, 0x0A, 0x6D, 0x62, 0x73, 0x25, 0x39, 0x76, 0x2E, 0x1C, 0x63, 0x78, 0x2B, 0x74, 0x32, 0x16, 0x20, 0x22, 0x44, 0x19 }; a=[0x62, 0x6C, 0x7F, 0x76, 0x7A, 0x7B, 0x66, 0x73, 0x76, 0x50, 0x52, 0x7D, 0x40, 0x54, 0x55, 0x79, 0x40, 0x49, 0x47, 0x4D, 0x74, 0x19, 0x7B, 0x6A, 0x42, 0x0A, 0x4F, 0x52, 0x7D, 0x69, 0x4F, 0x53, 0x0C, 0x64, 0x10, 0x0F, 0x1E, 0x4A, 0x67, 0x03, 0x7C, 0x67, 0x02, 0x6A, 0x31, 0x67, 0x61, 0x37, 0x7A, 0x62, 0x2C, 0x2C, 0x0F, 0x6E, 0x17, 0x00, 0x16, 0x0F, 0x16, 0x0A, 0x6D, 0x62, 0x73, 0x25, 0x39, 0x76, 0x2E, 0x1C, 0x63, 0x78, 0x2B, 0x74, 0x32, 0x16, 0x20, 0x22, 0x44, 0x19 ] flag="" for i in range(len(a)):flag+=chr(a[i]^(i+23)) print(flag)

utflag{mips_cpp_gang_5VDm:~`N]ze;\)5%vZ=C'C(r#$q=*efD"ZNY_GX>6&sn.wF8$v*mvA@'}

總結:

jeb中注意4199924形式的數據可能是地址

(v2 ^ 78) > 0

這個v2是長度,長度異或78,結果大于0就報錯,說明它的長度就等于78(因為相同異或為0,不同異或為1)。。
這點jeb挺好玩的

總結

以上是生活随笔為你收集整理的[羊城杯 2020]Bytecode [UTCTF2020]babymips的全部內容,希望文章能夠幫你解決所遇到的問題。

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