int_generator

ファイル chall.py および output.txt が与えられ、flag1、flag2、flag3 を要求された。

chall.py には整数を受け取って別の整数を返す関数が書かれており、output.txt にはこの関数に flag1、flag2、flag3 をそれぞれ渡した結果の整数が書かれているようだった。

解の候補は35ビットと十分少なく、処理内容を見てオーバーフローする可能性は低いと判断したので、処理をC言語に移植して解を全探索することにした。
そして、以下のプログラムを書いた。
与えられた出力値に加え、確認のために既知の入力に対する出力も探索対象に加えた。

Files chall.py and output.txt were given, and values for flag1, flag2, and flag3 were asked.

The file chall.py had a function that takes an integer and returns another integer. output.txt looked having what the function returned when each of flag1, flag2, and flag3 are passed.

The candidates of the answer is 35-bit long and the space should be small enough, and I thought risk of overflow is low enough reading the program, so I decided to rewrite the process in C and brute-force for the answer.
Then, I wrote this program.
In addition to the given output values, I added an output for a known input to the search targets for checking.

solve.c

このプログラムを、AWS EC2 の c6i.16xlarge インスタンス (AMI: Ubuntu Server 22.04 LTS (HVM), SSD Volume Type ami-0fcf52bcf5db7b003) で実行することにした。
solve.c をインスタンスにアップロードし、以下のコマンドで実行した。

I decided to run this program on an AWS EC2 c6i.16xlarge instance (AMI: Ubuntu Server 22.04 LTS (HVM), SSD Volume Type ami-0fcf52bcf5db7b003).
I uploaded solve.c to the instance and ran with these commands:

sudo apt-get update sudo apt-get upgrade sudo apt-get install gcc gcc -O3 -march=native -fopenmp -o solve solve.c time ./solve 35

すると、以下の結果が得られた。

This is the result:

int_generator(0) = 1008844668800884 int_generator(26476544) = 2264663430088446 int_generator(818143497) = 3438959214151555 int_generator(34359738368) = 6772814078400884 real 14m6.468s user 902m52.700s sys 0m0.052s

この結果に基づき、flagが得られた。

I obtained the flag based on this result.

FLAG{0_26476544_34359738368}

WaniCTF 2023