先日開催されたあるワークショップで出題された問題。
あるメモリ領域にある数値をXOR(アセンブリではnot ***)すると隠されていた文字列がでてくる。(画像2のobj.flagにある)
[画像1]
例えば0x562c76088012の「9e」について、画像2ではraxに「9e」が入っている。
レジスタrax 0x0000009e
[画像2]
not eaxを実行後はraxの下位8ビットに「61」が入っている。
レジスタrax 0xffffff61
[画像3]
この後raxの値をrcxにいれて、その後cl(rcxの下位8ビット)をバッファにためて文字列を生成していく。(ここでは画像2のobj.buf)
mov byte [rdx + rax], cl
すべて調べるためにpythonで以下のように計算してみた。
>>> hex(0x9e ^ 0xff)
'0x61'
これを利用して画像1のメモリの数値を変換してみると以下のようになった。
[画像5]
結果隠されていた文字列は
「flag{Hidden_Message!}」
でした。radare2大好き。
<続き>
ghidraでデコンパイルしてみたらすごかった。アセンブリで追った内容がサクッと数行のコードになって表示されている。
Deep ghidra decompiler integration for radare2
https://github.com/radareorg/r2ghidra-dec
Cutter: Presenting r2ghidra Decompiler | r2con 2019
https://youtu.be/eHtMiezr7l8?t=948
インストールと使い方のデモ
https://youtu.be/eHtMiezr7l8?t=1945
追記:2021/09/28
asmの処理をpythonで記述しました。
import math
sbuf = '99939e9884b7969b9b9a91a0b29a8c8c9e989ade82'
num = math.floor(len(sbuf)/2)
sret = ""
for i in range(num):
sret += chr(~int(sbuf[i*2:(i*2+2)],16)&0xFF)
print(sret)
flag{Hidden_Message!}