cbc-encrypt.c contains code for CBC encryption (with padding) using the
AES block cipher, as discussed in the lectures. The file is provided
for your convenience, though you don't need to use it as long as you
trust that it was implemented correctly. (If desired, you can compile it
using the provided Makefile. The aes* files implement the block cipher
AES, but you can treat AES as a black box for this exercise and should
not need to look at those files at all.)

cbc-encrypt.c was used to encrypt an unknown message using an unknown key k,
with the resulting ciphertext written to challenge-ciphertext.txt.

server.c contains wrapper code for a server that receives a ciphertext
from a client, decrypts it using the (same) unknown key k, and returns
a result indicating whether decryption succeeds or fails (i.e., whether
the padding was correct). It calls the cbcdec function provided in
cbc-decrypt.c. These files are provided for your convenience, but
again you do not actually need to look at them as long as you trust that
they are implemented correctly. (If anything, you should only need to look
at cbc-decrypt.c to see how verification of the padding is done.)

hex2ascii.c simply converts hex to ASCII. This is a useful utility, but
you don't need to use it if you don't want to.

The sample.* files contain code (in C, java, and Python) demonstrating how
to send a ciphertext to the server and receive back a result. This code
relies on oracle.* files to handle networking. Note that you do not need to
modify the oracle.* files or even understand how they work; instead, you
should adapt the appropriate sample.* file (in the language of your choice)
to construct an attack.

The goal is to recover the plaintext that was encrypted to give the
challenge ciphertext. The plaintext is normal English ASCII text, and you
should easily be able to tell when you have gotten the right result.
