4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

隠された文字列を表示する

Last updated at Posted at 2020-02-23

先日開催されたあるワークショップで出題された問題。

あるメモリ領域にある数値をXOR(アセンブリではnot ***)すると隠されていた文字列がでてくる。(画像2のobj.flagにある)
image.png
[画像1]

例えば0x562c76088012の「9e」について、画像2ではraxに「9e」が入っている。
レジスタrax 0x0000009e
image.png
[画像2]

not eaxを実行後はraxの下位8ビットに「61」が入っている。
レジスタrax 0xffffff61
image.png
[画像3]

この後raxの値をrcxにいれて、その後cl(rcxの下位8ビット)をバッファにためて文字列を生成していく。(ここでは画像2のobj.buf)
mov byte [rdx + rax], cl

asciiコードで「61」は"a"
image.png
[画像4]

すべて調べるためにpythonで以下のように計算してみた。

>>> hex(0x9e ^ 0xff)
'0x61'

これを利用して画像1のメモリの数値を変換してみると以下のようになった。
image.png
[画像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
image.png

追記:2021/09/28
asmの処理をpythonで記述しました。

python3
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)
out
flag{Hidden_Message!}
4
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?