Skip to content

Commit

Permalink
remind them about the padding
Browse files Browse the repository at this point in the history
  • Loading branch information
zardus committed Sep 29, 2024
1 parent b3356cb commit f15895c
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 0 deletions.
4 changes: 4 additions & 0 deletions cryptography/aes-cbc-corrupt-resize/.init
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/bash

dd if=/dev/urandom of=/challenge/.key bs=16 count=1
chmod 600 /challenge/.key
8 changes: 8 additions & 0 deletions cryptography/aes-cbc-corrupt-resize/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
So now you can modify AES-CBC encrypted data without knowing the key!
But you got lucky: `sleep` and `flag!` were the same length.
What if you want to achieve a different length?

----
**HINT:**
Don't forget about the padding!
How does the padding work?
14 changes: 14 additions & 0 deletions cryptography/aes-cbc-corrupt-resize/dispatcher
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/opt/pwn.college/python

import os

from base64 import b64encode
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Random import get_random_bytes

key = open("/challenge/.key", "rb").read()
cipher = AES.new(key=key, mode=AES.MODE_CBC)
ciphertext = cipher.iv + cipher.encrypt(pad(b"sleep", cipher.block_size))

print(f"TASK: {b64encode(ciphertext).decode()}")
30 changes: 30 additions & 0 deletions cryptography/aes-cbc-corrupt-resize/worker
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/opt/pwn.college/python

from base64 import b64decode
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from Crypto.Random import get_random_bytes

import time
import sys

key = open("/challenge/.key", "rb").read()

while line := sys.stdin.readline():
if not line.startswith("TASK: "):
continue
data = b64decode(line.split()[1])
iv, ciphertext = data[:16], data[16:]

cipher = AES.new(key=key, mode=AES.MODE_CBC, iv=iv)
plaintext = unpad(cipher.decrypt(ciphertext), cipher.block_size).decode('latin1')

print(f"Received command: {plaintext}")
if plaintext == "sleep":
print("Sleeping!")
time.sleep(1)
elif plaintext == "flag":
print("Victory! Your flag:")
print(open("/flag").read())
else:
print("Unknown command!")
2 changes: 2 additions & 0 deletions cryptography/module.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ challenges:
name: AES-CBC
- id: aes-cbc-corrupt
name: AES-CBC Tampering
- id: aes-cbc-corrupt-resize
name: AES-CBC Resizing
- id: level-6
name: DHKE
- id: level-7
Expand Down

0 comments on commit f15895c

Please sign in to comment.