Rating: 5.0

# Angstrom Revex Write Up

## Details:
Points: 75

Jeopardy style CTF

Category: Reverse Engineering

Comments:

As an active reddit user, clam frequently browses r/ProgrammerHumor. However, the reposts about how hard regex is makes him go >:((((. So, clam decided to show them who's boss.

```re
^(?=.*re)(?=.{21}[^_]{4}\}$)(?=.{14}b[^_]{2})(?=.{8}[C-L])(?=.{8}[B-F])(?=.{8}[^B-DF])(?=.{7}G(?<pepega>..).{7}t\k<pepega>)(?=.*u[^z].$)(?=.{11}(?<pepeega>[13])s.{2}(?!\k<pepeega>)[13]s)(?=.*_.{2}_)(?=actf\{)(?=.{21}[p-t])(?=.*1.*3)(?=.{20}(?=.*u)(?=.*y)(?=.*z)(?=.*q)(?=.*_))(?=.*Ex)
```

## Write up:

I opened up the website: https://regex101.com/ which is fantastic since it allows for regex since it allows you to debug.

I decided to split the regex into all of its portions so that I could figure out what each part did:

- `(?=.*re)`
- at some point in the string 're' will be present
- `(?=.{21}[^_]{4}\}$)`
- after 21 characters there will be 4 characters that are not '_'
- `(?=.{14}b[^_]{2})`
- after 14 characters there will be the character 'b'
- after b there will be two characters that are not '_'
- `(?=.{8}[C-L])`
- after 8 characters the character will be between C-L
- `(?=.{8}[B-F])`
- after 8 characters the character will be between B-F
- `(?=.{8}[^B-DF])`
- after 8 characters the character will not be B-D or F
- this means the character will be 'E'
- `(?=.{7}G(?<pepega>..).{7}t\k<pepega>)`
- after 7 characters we will have 'G'
- then reads 2 characters and makes a copy in the group
- then after 7 characters we will have 't'
- then we will have the two characters we copied earlier
- `(?=.*u[^z].$)`
- at some point we will have the character 'u'
- the character after u is not z
- `(?=.{11}(?<pepeega>[13])s.{2}(?!\k<pepeega>)[13]s)`
- after 11 characters we will either have 1 or 3
- this will be followed by 's'
- then 2 characters
- then either 1 or 3
- then 's'
- `(?=.*_.{2}_)`
- at some point there will be '_'
- followed by two characters
- then another '_'
- `(?=actf\{)`
- the start is 'actf{'
- `(?=.{21}[p-t])`
- after 21 characters we have a character in range p-t
- `(?=.*1.*3)`
- at some point we have '1'
- then at another point after we have '3'
- `(?=.{20}(?=.*u)(?=.*y)(?=.*z)(?=.*q)(?=.*_))(?=.*Ex)`
- after 20 characters we have, in no particular order:
- 'u'
- 'y'
- 'z'
- 'q'
- '_'
- 'Ex'

Using all of these I got:

```
actf{reGEx_1s_b3stEx_qzuy}
```

Original writeup (https://github.com/Kasimir123/CTFWriteUps/tree/main/2021-04-Angstrom/Revex).