TCPサーバの接続情報と、以下のファイルが与えられた。
aldrya
README.md
sample.aldrya
sample.elf
server.py
aldrya
を
また、server.py
は、URLを入力するとそこからファイルをダウンロードし、
ELFファイルをダウンロードしたファイル、ALDRYAファイルをsample.aldrya
としてaldrya
を実行するものだった。
そこで、まずはaldrya
が行う値の計算を再現する以下のプログラムを用意した。
Information to connect to a TCP server and following files were given:
aldrya
README.md
sample.aldrya
sample.elf
server.py
Decompiling aldrya
via
Also, server.py
accepts an input of URL, download a file from there,
and execute aldrya
using the downloaded file as the ELF file and samply.aldrya
as the ALDRYA file.
Based on these, firstly I created this program to simulate the calculation of the value in aldrya
.
このプログラムを用い、sample.elf
のいくつかのブロックについて計算した値がsample.aldrya
に記録されているものと一致することを確認し、
他のブロックについても一致すると予想した。
そこで、sample.elf
のエントリポイントに書かれているコードをシェルを起動するプログラムに差し替え、
差し替えたコードを含むブロックから計算した値がもともとのブロックから計算した値と一致するように実行しない部分を書き換えることにした。
エントリポイントは、readelf -h
コマンドの実行結果より0x1060である。
「シェルを起動するプログラム」は、以下のコードを
I confirmed that values for some blocks in sample.elf
matches with the values stored in sample.aldrya
,
and guessed that values for the other blocks should also match.
I decided to replace the code in the entry point of sample.elf
with a program to launch the shell,
and modify the data not to execute to match the value calculated from the modified block to the value from the original block.
The entry point is 0x1060, according to the result of the command readelf -h
.
I created "a program to launch the shell" by assembling following code via
書き換え後、以下のプログラムを用い、
After modifying, I used this program to find data to match the value via
最終的に、差し替えたコードを含む0x1000バイト目(0-origin)からのブロックは以下のようになった。
This is the final block from the 0x1000-th byte (the first byte is 0th) that contains modified code.
書き換えたELFファイルをインターネットからHTTPアクセスできる場所に置き、
README.md
より、flagはルートディレクトリにあるようなので、
コマンド cd /
を実行し、ls
を実行した。
その結果、ファイル flag-4c147adf5f7a18258f6709ed9402d902.txt
があることがわかり、コマンド cat *.txt
によりflagが得られた。
I succeeded to launch the shell by placing the modified ELF file to where HTTP access from the internet is available,
connecting to the TCP server via
The flag should be in the root directory according to README.md
,
so I executed cd /
command and then ls
command.
As a result, I found a file flag-4c147adf5f7a18258f6709ed9402d902.txt
.
I obtained the flag by executing a command cat *.txt
.