diff --git a/jujure/content/writeups/fcsc_2023/brachiosaure.md b/jujure/content/writeups/fcsc_2023/brachiosaure.md index 4353083..c140e76 100644 --- a/jujure/content/writeups/fcsc_2023/brachiosaure.md +++ b/jujure/content/writeups/fcsc_2023/brachiosaure.md @@ -10,7 +10,7 @@ toc: true Brachiosaure is a math/puzzle challenge from `\J` for the 2023 edition of the FCSC. It's difficulty is not in the reversing process, which is fairly trivial -here, but in solving of underlying problem. +here, but in solving the underlying problem. {{< image src="/brachiosaure/meme.jpg" style="border-radius: 8px;" >}} @@ -170,9 +170,9 @@ Cutting drama right now, it is simply a matrix dot product: Alright so to recap what actually happens: -- In check serial, we perform the dot product of the user digest, interpreted a -linearized 8 * 8 matrix, with itself, effectively squaring it, which gives us -our serial (also in a linearized 8 * 8 matrix). +- In check serial, we perform the dot product of the user digest, interpreted + as a linearized 8 * 8 matrix, with itself, effectively squaring it, which + gives us our serial (also in a linearized 8 * 8 matrix). - In main, we perform the dot product of the user and serial IMAGES, and we can see from the code that the return value indicates wether or not the resulting @@ -242,11 +242,11 @@ over this bigger matrix, infinetely recursing. OK, so after this misadventure, the next step is to understand that a single element of coordinates (i, j) from the dot product is impacted by all elements -of the ith line of the first matrix and all elements of the jth line. (You -actually already needed to understand this to implement my dumb idea but now we -will make it interesting). +of the ith line of the first matrix and all elements of the jth column of the +second. (You actually already needed to understand this to implement my dumb +idea but now we will make it interesting). -Let's say that I take my first QR code and I double it's size and width like +Let's say that I take my first QR code and I double it's height and width like this where the purple ones are all 0 matrices and the green one is the identity: {{< image src="/brachiosaure/resizing.png" style="border-radius: 8px;" >}} @@ -301,9 +301,10 @@ And there is a really interesting property indeed: {{< image src="/brachiosaure/invertible.png" style="border-radius: 8px;" >}} -By adding empty matrices and an identity matrix in the bottom right corner, the -resulting matrix is always invertible, and the inverse can be trivially computed -since it is simply moving matrices arround and negating the original image modulo 256 `notice the "-(QRuser)" in the inverted matrix`. +By adding identity matrices and an empty matrix in the bottom right corner, the +resulting matrix is always invertible, and the inverse can be trivially +computed since it is simply moving matrices arround and negating the original +image modulo 256 `notice the "-(QRuser)" in the inverted matrix`. ## Putting everything together @@ -332,7 +333,7 @@ from the remote service and the upload of the images to recover the flag. But before leaving this writeup there is still something I want to show you at the end. -{{< code file="/static/brachiosaure/solve_writeup.py" language="c" >}} +{{< code file="/static/brachiosaure/solve_writeup.py" language="python" >}} ```console @@ -373,4 +374,4 @@ inverse matrix: - We add identity matrices: they only have the diagonal set to 1 so only a little bit grayer than the black, no noise visible by naked eyes -- We add the opposite of the matrix, and this is the clean part: our original matrices only hold black and white pixels so respectively `0x0` and `0xff`, so the opposite of `0` is still `0` and the opposite of `0xff` if `1` modulo 256, so like the identity matrix, they are nearly invisible. If you look closely though :eyes: you will see that all white pixels of the QR code were indeed reflected as very faint taint of gray in its inverse matrix on the other image. \ No newline at end of file +- We add the opposite of the matrix, and this is the clean part: our original matrices only hold black and white pixels so respectively `0x0` and `0xff`, so the opposite of `0` is still `0` and the opposite of `0xff` if `1` modulo 256, so like the identity matrix, they are nearly invisible. If you look closely though :eyes: you will see that all white pixels of the QR code were indeed reflected as very faint taint of gray in its inverse matrix on the other image. diff --git a/jujure/static/brachiosaure/solve_writeup.py b/jujure/static/brachiosaure/solve_writeup.py index e2259a5..8d21b05 100755 --- a/jujure/static/brachiosaure/solve_writeup.py +++ b/jujure/static/brachiosaure/solve_writeup.py @@ -88,7 +88,7 @@ matrix_img_serial = img_to_matrix(img_serial) def invert(usr, serial): - # Add empty and identity matrices to maka it invetible + # Add empty and identity matrices to make it invetible usr = make_invertible(usr) serial = make_invertible(serial)