For this challenge we were given a corrupted git repository. We started by
checking out the git repository (using git clone) and checking the consistency
of the repository (using git fsck):
Checking object directories: 100% (256/256), done.
error: sha1 mismatch 354ebf392533dce06174f9c8c093036c138935f3
error: 354ebf392533dce06174f9c8c093036c138935f3: object corrupt or missing
error: sha1 mismatch d961f81a588fcfd5e57bbea7e17ddae8a5e61333
error: d961f81a588fcfd5e57bbea7e17ddae8a5e61333: object corrupt or missing
error: sha1 mismatch f8d0839dd728cb9a723e32058dcc386070d5e3b5
error: f8d0839dd728cb9a723e32058dcc386070d5e3b5: object corrupt or missing
missing blob 354ebf392533dce06174f9c8c093036c138935f3
missing blob f8d0839dd728cb9a723e32058dcc386070d5e3b5
missing blob d961f81a588fcfd5e57bbea7e17ddae8a5e61333
The description of the challenge gives a hint and tells us that there is some
corruption on the SATA side. The git object protocol stores the file and uses a
sha1sum to generate a hash of the file.
In total there were three 1 byte changes (simple bit flips), one change for
every wrong byte. Each commit need to be fixed and we wrote a small script that
brute forces all bytes, replacing a byte with all possible alternatives.
The first error that needs to be replaced is: 51337 with 31337 (3 is flipped to
5, 2 bits change). The second error is the number that you have to factor for
the challenge. There 270031727027 is used instead of 272031727027 (2 is flipped
to 0, 1 bit changes). The last change is &lag is used instead of flag (changing
f to &, 1 bit changes).
For each corruption we have to checkout (git checkout) the corrupt version and
fix the sharp.cpp file. After fixing all prior errors we run our search
program to find each of the changes mentioned above. The file can then be
rehashed using git hash-object -w sharp.cpp and the object cache will be
updated. Moving to the next corruption we can checkout corrupt version until we
have iterated through all the errors.
When we are done we have to compile the challenge and pass the correct answers
(flag, 31337, money, 31357, 8675311) and we get the flag. Hooray, 400 points for
b01lers!