fix(q-solved): add table of contents and typo fixes
Signed-off-by: Julien CLEMENT <julien.clement@epita.fr>
This commit is contained in:
parent
355dede8e1
commit
d4b4d1df2e
@ -3,22 +3,27 @@ title: "Reversing quantum algorithms ~~for ctf points~~ | q-solved - zer0pts 202
|
|||||||
date: "2022-03-25 18:00:00"
|
date: "2022-03-25 18:00:00"
|
||||||
author: "Juju"
|
author: "Juju"
|
||||||
tags: ["Reverse", "Quantum", "Writeup", "zer0pts"]
|
tags: ["Reverse", "Quantum", "Writeup", "zer0pts"]
|
||||||
|
toc: true
|
||||||
---
|
---
|
||||||
|
|
||||||
# Challenge description
|
# Intro
|
||||||
|
|
||||||
|
## Challenge description
|
||||||
`quantum` `reverse` | `304 pts` `8 solves`
|
`quantum` `reverse` | `304 pts` `8 solves`
|
||||||
```
|
```
|
||||||
I copied the solver of a reversing task from the future. But it doesn't
|
I copied the solver of a reversing task from the future. But it doesn't
|
||||||
show the flag forever :thinking:
|
show the flag forever :thinking:
|
||||||
```
|
```
|
||||||
|
|
||||||
# Given files
|
## Given files
|
||||||
|
|
||||||
{{< code file="/static/q-solved/solve.py" language="py" >}}
|
{{< code file="/static/q-solved/solve.py" language="py" >}}
|
||||||
|
|
||||||
[circuit.json](/q-solved/circuit.json)
|
[circuit.json](/q-solved/circuit.json)
|
||||||
|
|
||||||
# TL;DR
|
# Writeup
|
||||||
|
|
||||||
|
## TL;DR
|
||||||
|
|
||||||
The scripts builds a quantum circuit describing an unstructured search
|
The scripts builds a quantum circuit describing an unstructured search
|
||||||
algorithm inspired by the grover's algorithm. Its goal is to find among all
|
algorithm inspired by the grover's algorithm. Its goal is to find among all
|
||||||
@ -38,17 +43,17 @@ described by the oracle.
|
|||||||
|
|
||||||
All that remains to do for us is to understand what that criteria is.
|
All that remains to do for us is to understand what that criteria is.
|
||||||
|
|
||||||
# Reversing the Oracle
|
## Reversing the Oracle
|
||||||
|
|
||||||
We can see that the oracle is built using the `circuit.json`.
|
We can see that the oracle is built using the `circuit.json`.
|
||||||
|
|
||||||
The oracle is composed of 1408 multi-controlled X (MCX) gates, each controlled by 1
|
The oracle is composed of 1408 multi-controlled X (MCX) gates, each controlled by 1
|
||||||
or 3 input qubits with with a control state given in the json. Each MCX gate
|
or 3 input qubits with a control state given in the json. Each MCX gate
|
||||||
acts on a dedicated ancilla qubit.
|
acts on a dedicated ancilla qubit.
|
||||||
|
|
||||||
After all 1408 MCX, the circuit adds an other MCX on the target qubit with all
|
After all 1408 MCX, the circuit adds an other MCX on the target qubit
|
||||||
control states set to 0. The target qubit is therefore introduced a phase shift
|
controlled by all ancillas with all control states set to 0. The target qubit
|
||||||
when all ancillas are in `|0>`.
|
is therefore introduced a phase shift when all ancillas are in `|0>`.
|
||||||
|
|
||||||
So we want all ancillas to be `|0>` but it is also their original state. We
|
So we want all ancillas to be `|0>` but it is also their original state. We
|
||||||
therfore have to influence the control qubits of each MCX so that none actually
|
therfore have to influence the control qubits of each MCX so that none actually
|
||||||
@ -66,7 +71,7 @@ the gate. Similarly, a qubit marked `True` must take value `|1>`.
|
|||||||
So we said earlier that the MCX have either 3 or 1 control bits and that at
|
So we said earlier that the MCX have either 3 or 1 control bits and that at
|
||||||
least 1 of the control qubits must mismatch from their control state.
|
least 1 of the control qubits must mismatch from their control state.
|
||||||
|
|
||||||
# POC with trivial qubits
|
## POC with trivial qubits
|
||||||
|
|
||||||
Obviously this results in an equation system but let's see what we get with
|
Obviously this results in an equation system but let's see what we get with
|
||||||
only the obvious qubits: the ones controlling an ancilla by themselves.
|
only the obvious qubits: the ones controlling an ancilla by themselves.
|
||||||
@ -82,23 +87,23 @@ So let's try to set all obvious qubits:
|
|||||||
|
|
||||||
Well, most of them are 0, except, the first byte: `z`
|
Well, most of them are 0, except, the first byte: `z`
|
||||||
|
|
||||||
Which is a really good sign that we are indead decoding a flag of the form
|
Which is a good sign that we are indeed decoding a flag of the form
|
||||||
`zer0pts{...}`
|
`zer0pts{...}`
|
||||||
|
|
||||||
# Equation system
|
## Equation system
|
||||||
|
|
||||||
For MCX with 3 control bits, we simply need to put them in an equation system,
|
For MCX with 3 control qubits, we simply need to put them in an equation
|
||||||
with the trivial qubits.
|
system alongside the trivial qubits.
|
||||||
|
|
||||||
We will have a total of 1408 equations, 1 for each MCX, each equation basically
|
We will have a total of 1408 equations, 1 for each MCX, each equation basically
|
||||||
saying that at least 1 Qubit must be different from its control state, and
|
saying that at least 1 qubit must be different from its control state, and
|
||||||
therefore equal to its assigned boolean in the json.
|
therefore equal to its assigned boolean in the json.
|
||||||
|
|
||||||
Once the system is solved, we will know the state of all qubits that match the
|
Once the system is solved, we will know the state of all qubits that match the
|
||||||
oracle, which is the one outputed by the quantum circuit. We will then be able
|
oracle, which is the one outputed by the quantum circuit. We will then be able
|
||||||
to decode it to get the flag.
|
to decode it to get the flag.
|
||||||
|
|
||||||
# Solve
|
## Solve
|
||||||
|
|
||||||
I used z3 to build and solve the equation system:
|
I used z3 to build and solve the equation system:
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user