Card Theft

TCPサーバの接続情報とELFファイル card-theft が与えられ、クレジットカードの番号を要求された。

このELFファイルをGhidraで逆コンパイルすると、以下のことがわかった。

copy_data関数の仕様より、実際に与えるデータより長さの情報を長く設定すると、以前に配列panにコピーされたデータがそのまま出力される。
以下のように、長さの情報を適宜設定していくことで後ろの6バイトの情報は得られたが、長さの情報を4バイト未満に設定すると拒否されるので、最初の2バイトは得られなかった。

Information to connect to a TCP server, and an ELF file card-theft were given, and the credit card number was asked.

Decompiling this ELF file using Ghidra, I found these things:

Due to the behavior of the function copy_data, when the length information is set to longer than data actually given, data previously copied to the array pan is printed.
I obtained the 6 bytes from the tail by setting the length information properly in this way, but the first 2 bytes weren't available because it refuses to process length information less than 4 bytes.

log.txt

ここで、ファイル card-theft に埋め込まれているデータを見ると、PANの最初の2バイトはIINと同じに設定されていることに気がついた。
そこで、とりあえず残りの2バイトにIINの値を入れてみると、正解になり、flagが得られた。

Seeing the data embed in the file card-theft, I found that the first 2 bytes of PAN is set to the same as the IIN.
I tried setting the 2 bytes left to the IIN. As a result, it was accepted and I obtained the flag.

flag{4147403950091074}

SquareCTF 2021