## Solution`speech.dat` is a binary file without any obvious structure. Given the clue of the challenge name, and the name of the file, we can guess that `speech.dat` may be the text of Martin Luther King Jr's "I Have a Dream" speech. We can also guess that the encryption method may be XOR. If we XOR the beginning of the "I Have a Dream" speech with the given ciphertext, we recover a key that makes sense:```python>>> from pwn import *>>> plaintext = b"I am happy to join with you today in what will go down in history">>> ciphertext = open("speech.dat", "rb").read()>>> xor(plaintext, ciphertext[:len(plaintext)])b'BlackLivesMatterBlackLivesMatterBlackLivesMatterBlackLivesMatterB'```
The XOR key is `BlackLivesMatter`. We can XOR this with the entire ciphertext to get the plaintext:```python>>> from pwn import *>>> speech = xor(ciphertext, b"BlackLivesMatter").decode("windows-1252").replace("\n", "")```We choose `windows-1252` as the decoding because the plaintext from XORing resulted in characters that are point codes in [Windows-1252](https://en.wikipedia.org/wiki/Windows-1252). We also replaced the newlines on a hunch because the last step of the flag recovery doesn't work if you don't.
Finally, the challenge gave us a list of integers. These are offsets into the resulting plaintext. This allows us to reconstruct the flag:```python>>> indexes = [8337,669,8972,3621,8898,5581,8720,1900,5208]>>> flag = "">>> for i in indexes:...     flag += speech[i]...>>> print(flag)ROsAParkS```
## Flag**flag{ROsAParkS}**