Rating:

# Teaser Dragon CTF 2018 : AES-128-TSB

**category** : crypto

**points** : 219

**solves** : 46

## write-up

![](https://i.imgur.com/Zy3HJ0S.png)

The problem implement a new kind of AES mode

It check the last decrypt block equal to IV

There are two things we can use in `server.py`

1. `unpad`: `msg[:-ord(msg[-1])]`
2. `a == b`: It compares string for us after decryption

First, how to bypass the check for mac

Observe that `P2 = IV + j1 + j2`

We just need to make `j1 == j2`, which is the same as `i1 == i2`

Second, we can alter the last bit of `P1` using IV last bit, and compare the string with empty string

If `1 <= P1[-1] <= 15` then the unpad P1 will not be an empty string, otherwise it will be an empty string.

Using above method, we can recover last bit of `j1`

Since we know last bit of `j1`, we can unpad any bytes we want through manipulating last bit of IV.

Brute force `0-255` to compare with each byte in `j1` ( just make first 15 bytes of IV `\x00` )

After get a `i1` and `j1` pair, we can make `gimme_flag` string

Then recover the encrypted flag using the same method

Because there are many requests, and the network is slow, it takes about an hour to get the flag...

`DrgnS{Thank_god_no_one_deployed_this_on_production}`

# other write-ups and resources

Original writeup (https://github.com/OAlienO/CTF/tree/master/2018/Teaser-Dragon-CTF/AES-128-TSB).