
Turkish: 
Bir crpyto meydan okumayı bir dizi matematik bilgisi ile çözmeye çalışacağız.
Bence bu lineer cebirin, gerçek hayattaki güvenlik uygulamalarına uygulanmasına güzel bir örnek olacak.
Problemler.
Bu meydan okumanın hikayesi şu; bir firmware güncellemesi var be bu güncelleme sadece
doğrulandırığı zaman uygulanabilmektedir. Çalışma yapısı dosyalar ve klasörlerin sha256 ile özetlenmesi ve bu özetlerin birlikte
XOR'lanması şeklindedir.
Sonuç XOR bir imza ile karşılaştırılmaktadır.
Farklı saldırı senaryolarını nasıl değerlendirdiğimizi öğrenmek istiyorsanız birinci bölümü izleyebilirsiniz.
Fakat bu bölümde sadece matematiksel sonuca odaklanarak
lineer cebirle ilgisini anlamaya çalışacağız.
Terminoloji katliamı yaparsam şimdiden bütün matematikçilerden özür diliyorum
çünkü matematikte acemiyim.

English: 
We are going to solve a crypto challenge with
some cool math.
I think it’s an awesome example of linear
algebra applied to some real world security
problems.
The story about this challenge is that we
have a firmware update that will only be applied
if verified, and works by hashing files and
folders with sha256, and xoring those hashes
together.
The resulting xored result is then checked
against a signature.
If you want to hear more about how we explored
different attack ideas you can checkout part
1, but in this part I just want to focus on
the mathematical solution and try provide
an intuitive understanding for the linear
algebra involved.
And I’m also sorry to all mathematicians
out there if I butcher some terminology, I’m
a math noob.

Turkish: 
Çözümü anlayabilmek için sizlere 2 farklı kavramı tanıştırmak istiyorum.
Birincisi lineer bağımsızlık ve lineer vektörlerin bir vektör uzayında
bir noktayı nasıl işaret edeceği.
ikinci kavram ise Galois alanları ya da sonlu alanlar, özellikle GF(2).
Sadece iki elemana sahip bir alan.
Bu tarz matematiksel bilgileri üniversitede öğrenmediyseniz ya da hala çok
gençseniz, bu terimler kulağa çılgınca gelebilir. Fakat bunlara değinmek istiyorum çünkü
açıkladığım zaman anlaması gerçekten kolay gelecektir.
Öncelikle lineer bağımsız vektörlerden başlayalım
Vektörlere aşina değilseniz terminolojiyi görmezden gelip sadece nasıl kullanıldıklarını
görmeye çalışın.
Vektörler temelde yönlü oklardır.
 
Bir boyutlu bir uzay düşünün
yani bir sayı doğrusu
bir boyutlu bir vektör oluşturalım.

English: 
Okay, so to understand the solution I have
to introduce two concepts.
One is about linear independence, and how
linear independent vectors in some vector
space can match to any point.
And the second concept will be Galois Fields
or finite fields, specifically the GF(2),
the field of only two elements.
If you didn’t learn this kind of math, for
example in university or you are still too
young, then these terms sound crazy, but I
wanted to mention them because while it sounds
crazy, I think it’s really easy to understand
once I explained it.
So let’s start with linear independence
of vectors.
If you are not familiar with vectors, just
ignore the term and just see how we are using
it.
They are basically just arrows.
So...
Imagine a 1 dimensional space.
So just a line of numbers.
And I give you a one dimensional vector.

English: 
Now a vector is like an arrow, so this vector
starts at 0 and points to 2.
With a scalar, or just “regular number”
we can multiply that vector to move that arrow
around.
For example 2x the vector will point to 4.
And 4x the vector will point to eight, and
-3x this vector will point to -6.
Easy.
And as you know, multiplication is just fancy
addition.
For 4x the vector we just add the vector to
itself 4 times.
So you see that with this one vector, if we
multiply it with some value, we can make it
point to EVERY number in that one dimensional
space.
Now let’s look at this in two dimensional
space.
Just a flat surface.
We add another axis.
Now a vector will have two values, x and y.
Now let’s take one vector, for example [1
1].
Now this is an arrow that points to this point
(1/1).

Turkish: 
Bu vektör 0'dan başlayıp 2 de sonlanıyor
Bir skalar ya da bir sayı ile beraber bu vektörü çarparak bu oku hareket
ettirebiliriz.
örneğin 2 kere vektör 4'ü işaret edecektir.
4 kere vektör 8, -3 kere vektör ise -6'yı işaret eder.
Basit.
Bildiğiniz gibi çarpma aslında bir çeşit toplama işlemidir.
4 kere vektör için 4 adet vektörü birbiri ile toplarız.
Böylece bu vektörü herhangi bir sayı ile çarparak bir boyutlu uzayda
istediğimiz noktaya ulaşabiliriz.
Şimdi buna 2 boyutlu uzayda bakalım.
Yani bir düzlemde.
Yeni bir koordinat ekliyoruz.
Şimdi bir vektör 2 değere sahip olacaktır. x ve y
Şimdi bir vektör alalım, örneğin [1 1].
Bu ok şimdi bu uzayda (1,1) noktasını işaret edecektir.

English: 
Again we can multiply a scalar or just add/subtract
this vector many times, we can move around
where it points to.
With 2x this vector we point to (2/2).
With 5x we point to (5/5).
And with -3x this vector we point to (-3/-3).
But you see that we can’t add or subtract
and reach every value on our plane.
We only ever can reach any point on this line.
Let’s introduce a second vector.
[3 3].
Now this one points to (3/3) and again we
can add or subtract it, we can even combine
our two vectors, but we are still limited
to this line.
You might also have noticed, that we could
basically create this vector by taking our
first vector 3 times.
These two vectors are linearly dependent.
But if we get a vector that is linear independent,
that is not laying on the same line, for example
[1 0], now we can’t reach this point with
only the first vector.

Turkish: 
Yine aynı şekilde bir skalar ile çarparak ya da istediğimiz kadar ekleme çıkarma yaparak
bu uzayda gezebiliriz.
2 kere vektör (2,2)
5 kere vektör (5,5)
ve -3 kere vektör (-3,-3) noktasını işaret edecektir.
Fakat görüldüğü gibi sadece bu vektörü kullanarak bu düzlemde istediğimiz noktaya erişemiyoruz.
Sadece bu çizgi üzerindeki noktalara erişebiliriz.
İkinci bir vektör daha ekleyelim.
[3 3].
Bu vektör (3,3) noktasını işaret edecektir. Ve yine ekleme çıkarma yapabilir hatta
iki vektörü birleştirebiliriz. Fakat yine bu çizgi ile sınırlı kalıyoruz.
Farkettiyseniz eğer bu yeni vektörü, ilk vektörü birbirine
3 kere ekleyerek elde edebiliriz.
Bu iki vektör lineer olarak bağımlıdırlar.
Fakat aynı çizgi üzerinde olmayan lineer bağımsız bir vektör alırsak, örneğin
[1 0], bu noktaya sadece ilk vektörle elde edemeyiz.

English: 
And vice versa, the new vector can’t reach
a point of the second vector.
Except of course 0.
But we can now use them together to get to
any point on this 2 dimensional field.
For example to reach the point (3/5) we can
take the first vector 5 times, now we are
at (5/5).
And then we take the second vector and subtract
it two times, and now we reached (3/5).
And so with TWO independent vectors we can
get to any point of the TWO dimensional field.
And this also works with three dimensions.
If you have three linear independent vectors
in this three dimensional space, you can get
to ANY point you want by adding or subtracting
them.
That makes sense, right?
Just think about it for a second and imagine
in your head how you can combine three different
arrows in a three dimensional space and reach
any point in there.
And of course this also works in 4-, 5- or
higher dimensional space.

Turkish: 
Ya da tam tersi, ikinci vektör 1. vektörün erişebildiği bir noktaya erişemez.
Tabi ki 0 hariç.
Fakat bu iki vektörü beraber kullanırsak 2 boyutlu düzlemde istediğimiz herhangi bir noktaya ulaşabiliriz.
Örneğin (3,5) noktasına erişmek için ilk vektörü 5 ile çarparız, şimdi
(5,5) noktasındayız.
ardından ikinci vektörü alıp 2 kere çıkardığımızda (3,5) noktasına ulaşırız.
Böylece "2" bağımsız vektör yardımı ile "2" boyutlu uzayda istediğimiz noktaya erişebiliriz.
Bu aynı zamanda 3 boyut için de geçerlidir.
3 boyutlu bir uzayda 3 lineer bağımsız vektörünüz varsa bu vektörleri birbiri ile
ekleyip çıkararak istediğimiz noktaya erişebiliriz.
Mantıklı değil mi?
Sadece bir kaç saniyeliğine düşünün ve 3 farklı oku 3 boyutlu uzayda birleştirerek
herhangi bir noktaya nasıl erişebileceğinizi hayal edin.
Ve tabi ki bu 4,5 veya daha fazla boyutlu uzaylar için de çalışmaktadır.

English: 
In 4 dimensions we need 4 linear independent
vectors and in 5 dimensional space we need
5 linear independent vectors, and so on.
Of course you can’t really visualise that
anymore, but you can just write them down
as a vectors and play around with adding and
subtracting them from another to reach any
point you want.
Amazing right?
But if you have very large vectors, it’s
a bit cumbersome by hand to select the vectors
you want to add or subtract to reach certain
points.
That’s where you get into linear algebra.
You just put all those vectors as columns
into a matrix, here is the point you want
to reach, and then you can solve this.
But we don’t have to do that by hand, we
can let computers do that for us.
Ok so, what the heck does this have to do
with this challenge?
We get there.
Patience.
So now let’s introduce the second concept.
Finite field is already a fancy sounding name.
But there is a much nicer name for it.
That’s synonymous.
Galois fields.

Turkish: 
4 boyutta 4 bağımsız vektör ve 5 boyutta
5 bağımsız vektör vb.
Tabi ki gerçekten bunları görselleştirmeniz mümkün değil fakat vektör olarak
yazmanız ve birbilerine ekleme çıkarma yaparak herhangi bir noktaya
ulaşmanız mümkün.
Harika değil mi ?
Fakat çok büyük vektörleriniz varsa, el ile işlem yaparak belirli bir noktaya
erişmek için gerekli vektörleri seçmeye çalışmak çalışmak zor.
İşte burası lineer cebire giriş noktanız.
Bu vektörleri bir matrisin sütunları olacak şekilde yerleştirdikten sonra erişmek istediğiniz
nokta işte burası, ve daha sonra bunu çözebiliriniz.
Fakat bunu el ile yapmak zorunda değiliz. Bir bilgisayar bunu yaptırabiliriz.
Fakat bunun çözümle ne alakası var ?
Oraya geleceğiz.
Sabır.
Şimdi ikinci kavramı taktim edelim.
Sonlu alan hali hazırda çok havalı bir isim
Fakat daha havalı bir adı daha var.
 
Galois alanları.

English: 
That’s a nice french name, right?
Ok.
So when you wanna, tell your girlfriend or
boyfriend or your mother, whoever you want
to impress what you did today, at university,
say I learned about Galois fields.
Ok?
Specifically we want to have a look at GF,
Galois Field (2).
Ahh it sounds sooo cooool.
But it’s really dumb.
But clever.
Basically, throw away any numbers you know
and just keep two.
0 and 1.
And you live now in a world where only 0 and
1 exists.
The binary world.
No 2, no 3.
Only 0 and 1.
Now let’s think about how addition could
look like in this world.
0 + 0 could be 0, that makes sense
0 + 1 could be 1, that makes sense too
So does 1 + 0, that’s also 1.
But 1+1 is a bit weird, because in our world,
there is nothing larger than 1.

Turkish: 
Havalı bir fransız ismi, değil mi ?
Tamam.
Şimdi kız arkadaşınıza, erkek arkadaşınıza ya da annenize, kime isterseniz
onları etkilemek için bugün üniversitede Galois alanlarını öğrendiğinizi söyleyebilirsiniz.
 
Özellikle biz GF(2) ile ilgileniyoruz.
Ahh gerçekten kulağa çok havalı geliyor.
Aslında gerçekten aptalca.
Ama akıllıca.
Temel olarak bütün sayıları at, sadece 2 tanesi kalsın.
0 ve 1.
Şimdi sadece 1 ve 0'ın yaşayabildiği bir dünyadayız.
İkili dünya.
2 yok, 3 yok
Sadece 0 ve 1
Şimdi bu dünyada toplama nasıl olur onu düşünelim.
0 + 0 = 0, mantıklı. 0 + 1 = 1 bu da mantıklı
1 + 0 da yine 1 .
Fakat 1+1 biraz garip. Çünkü bu dünyada hiç bir şey birden büyük olamaz.

English: 
And so we are imprisoned in this weird world
and if we try leave here to find a larger
number, we just wrap around in our world and
arrive at the start again.
Like the game snake.
And as a computer scientist, do you notice
something?
What is this?
This is XOR.
Addition in the finite field of two elements,
GF(2) is equivalent to the logical XOR operation.
Ding ding ding dinggg.
Does it ring a bell?
So when we XOR for example two bytes, each
byte has 8 bits.
Eight 1s or 0s.
For example 0x55, in ascii the capital letter
‘U’, would be 0101 0101.
And if we XOR that with 0xD9, in binary 1101
1001, we get 1000 1100 , or 0x8C.
So these bytes could also be understood as
a vector, it’s an 8 dimensional vector with

Turkish: 
Bu yüzden bu dünyada hapsolduğumuz için daha büyük bir sayı bulmaya çalıştığımızda,
başa sarıp başladığımız yere geri dönüyoruz.
Yılan oyunu gibi.
Ve bir bilgisayar bilimcisi olarak bir şey farkettiniz mi ?
Nedir bu ?
Bu XOR.
2 elemana sahip sonlu alan GF(2)'de toplama işlemi XOR işlemi ile denktir.
Ding Ding Ding Dingg.
Jeton düştü mü?
Örneğin her biri 8 bitlik 2 byte'ı XOR 'larsak
8 adete 1 veya 0.
Örneğin 0x55, ASCII tabloda büyük U, 0101 0101 olacaktır.
Ve bunu 0xD9 ikili tabanda 1101 1001 ile XOR'larsak, 1000 1100 ya da 0x8c elde ederiz.
Bu byte değerlerini birer vektör olarak kabul edebiliriz. 8 elemanının her biri 0 veya 1

English: 
8 elements either 0 or 1.
They are vectors in an 8 dimensional GF(2)
vector space.
Each vector has 8 bits, and a bit exists only
in a world of 0 or 1.
A bit can never be 2.
It’s always either 0 or 1.
And we just learned, that an XOR in GF(2)
is like addition.
So no we just added two vectors together and
got another point in that vector space.
And this means a sha256 hash, has 256 bits,
and can be understood as a 256 dimensional
vector in a Galois Field (2) vector space.
And the first concept we learned about was,
that if we have enough linear independent
vectors, we can add or subtract them to reach
any point in the space.
And so if we had 256 linear independent vectors,
256 linear independant sha256 hashes, we could

Turkish: 
olabilen 8 boyutlu bir vektör.
GF(2) vektör uzayında 8 boyutlu  vektörler.
Her vektör 8 bit ve her bit sadece 0 veya 1 dünyasında  varolabilir.
Bir bit hiçbir zaman 2 olamaz.
Her zaman 1 veya 0'dır.
Böylece GF(2)'de XOR işleminin aslında toplama olduğunu öğrenmiş olduk.
Şimdi bu uzayda iki vektörü birbirine ekleyerek herhangi bir noktaya erişebiliriz.
Bu şu demek: bir sha256 özeti 256-bit yani GF(2)'de  256 boyutlu
bir vektör olarak kabul edilebilir.
Ve ilk kavramdan öğrendiğimiz üzere eğer yeteri sayıda lineer bağımsız vektöre sahip olursak,
bunları ekleyip çıkararak bu alanda istediğimiz noktaya erişebiliriz.
Yani eğer 256 lineer bağımsız  vektör, 256 lineer bağımsız sha256 özetine sahip olursak,

Turkish: 
256 boyutlu özet uzayında istediğimiz herhangi bir noktaya erişebiliriz.
Ve ulaşmak istediğimiz nokta, 256 bitlik bir vektör, ya da daha iyi bir ifade ile  özetlerin(hashes) son XOR sonucu
ki bu zaten doğrulanmış ve imzalanmış olan değer.
Eğer bu 256 lineer bağımsız vektörü oluşturabilirsek, bunları birleştirerek
-XOR işleminden öğrendiğimiz üzere- istediğimiz herhangi bir XOR sonucunu üretebiliriz.
Matematiksel anlamda, 256 bağımsız vektörden oluşan matrisi, istediğimiz bir vektörle çarparak
arzu ettiğimiz herhangi bir XOR sonucunu elde edebiliriz.
Ve aslında bu gayet basit.
Özetler temelde rastgele verilerdir.
Rastgele bitler.
Ya da rastgele vektörler.
Ve böyle bir rastgele vektör çok çok nadir bir şekilde lineer bağımlıdır.
Yine de çok basit bir şekilde bunu test edebiliriz.
256 bitlik lineer bağımsız vektörleri oluşturarak başlayalım.
Ya da GF(2)'de çalışan vektörleri.

English: 
reach ANY point in the 256 dimensional space.
And the point we want to reach, is the 256
bit vector, or better to say the final xor
result of the hashes that is already valid
and signed!
So if we can create these 256 linear independent
vectors, we should be able to combine them
by addition, or as you know now, XOR, to craft
any XOR result that we want.
In mathematical terms, we then just have to
solve this matrix equation of the 256 independent
vectors with the vector that we want, any
XOR result that we want.
And actually, that is very simple.
Hashes are basically random data.
Random bits.
They are a random vector.
And it’s very very unlikely that such a
random vector is linear dependent.
But you can also very easily test that.
So let’s start by creating 256 linear independent
bit vectors.
Or vectors operating in GF(2).

English: 
To do this I’m using sage, which is basically
a tool to perform mathematical calculations.
Sage scripts are basically python.
The code gets transformed into a python script
and that is then executed.
Also as I explained in part 1, I did not come
up with this.
The solution and the code I show was written
by bennofs from our CTF team.
Just so that you don’t get the wrong impression
that I’m some kind of wizard.
He is.
So we can start with a loop to find these
independent vectors.
We know how the hashes are generated by the
firmware installer, check out part 1 if you
forgot, so we basically we do the same now
here, we generate a filename from just counting
numbers, and append the null-byte.
Then pass it to something that will return
the 256bit vector for it.
The make_vector function takes the filename,
generates the sha256 hash and then goes over
each byte of that hash.
For each byte it extracts the single bits.

Turkish: 
Bunu yapmak için matematiksel hesaplamaları yapan bir araç, Sage'i kullanıyorum.
Sage betikleri Pyhton dilinde.
Kod phyton betiklerine çevrilip koşulmakta.
Birinci bölümde açıkladığım üzere buna bir daha değinmeyeceğim.
Çözüm ve kod CTF takımımızdan Bennof tarafından yazıldı.
Sihirbaz falan olduğum izlenimine kapılmayın hemen.
 
Bağımsız vektörleri bulmak için bir döngü başlatarak başlıyoruz.
Özetlerin firmware yükleyicisi tarafından oluşturulduğunu biliyoruz. Unuttuysanız bkz: bölüm.1
burada da aynısını yapıyoruz, sayarak ve null byte ekleyerek
yeni bir dosya ismi oluşturuyoruz
Daha sonra bunu 256 bitlik vektörünü oluşturacak kısıma aktarıyoruz.
make_vektor fonksiyonu dosya adını alıyor sha256 özetini oluşturuyor ve
her byte için bunu tekrarlıyor.
Her byte için tekil bitleri ayrıştırıyor.

English: 
It does that via a lookup table of bits that
was generated at the start of the program.
Long story short, that function will just
return the vector with all 256 bits of the
hash.
Now that we have the vector that represents
the hash for this file, we can create a matrix
of all the possible vectors.
Defined over the Galois Field GF(2).
And then we can check the rank of the matrix.
In linear algebra, the rank of a matrix is
the dimension of the vector space generated
by its columns.
This corresponds to the maximal number of
linearly independent columns of the matrix.
So if the new vector increases the rank of
the matrix, so increases the number of linear
independent columns of the matrix, then we
can keep that one.
And so we just remember all those vectors
and filenames that are good.
And we can also print if a vector wouldn’t
be linear independent.
If we run that now, it takes a moment for
sage to get going, and then we print out all

Turkish: 
Bunu programın başında oluşturulmuş bir arama tablosunun bitlerini kullanarak gerçekleştiriyor.
Uzun lafın kısası, bu fonksiyon özet işlemi sonucunda oluşturulan 256 bitlik
bir vektör döndürecektir.
Bu dosyanın özetini temsil eden  bir vektör elde etmiş olduk. Şimdi GF(2)'de tanımlı
bütün olası vektörlerden
oluşan bir matris oluşturabiliriz.
Ve daha sonra bu matrisin rankını test edebiliriz.
Lineer cebirde bir matrisin rankı o matrisin sütunları tarafından oluşturulmuş
vektör uzayının boyutudur.
Yani matris sutünlarına yerleştirilmiş lineer bağımsız vektörlerin sayısı.
Dolayısı ile eğer yeni oluşturulan vektör matrisin rankını yani lineer bağımsız sütun sayısını artırıyor ise
bu vektörü saklıyoruz.
Ve lineer bağımsız olan(iyi olan) bütün  vektörleri kaydediyoruz.
Eğer bir vektör lineer bağımsız değil ise bunu da ekranda bastırabiliriz.
Bunu koştuğuuzda , sagenin çalışmaya başlaması biraz zaman alıyor ve sonrasında lineer bağımsız bir vektör üreten

English: 
the filenames that produces linear independent
vectors.
And you can see, after the first 256 we didn’t
even get ONE that was linear dependent.
Next we have to define the point in our 256
dimensional vector space, that we want to
reach by combining our vectors.
To do that we have to read the current valid
xor result, the one that is signed, then we
do our modification of the pre_copy python
script to spawn a shell, and then we get the
new invalid xor result.
If we xor those two, we get our target goal.
If we can somehow craft this XOR result with
our files, basically find which vectors we
have to combine to reach that point in space,
then they would be xored with the now invalid
xor result to produce the valid signed result.
So we take that result now and define a GOAL
vector, and then we take the matrix of all
our vectors, and say that we want to solve
this system of equations for the goal vector

Turkish: 
bütün dosya isimlerinin ekrana bastırıyor.
Gördüğünüz gibi ilk 256 denemenin bir tanesi bile lineer bağımlı bir vektör üretmedi.
Ardından bu vektörleri kullanarak erişmek istediğimiz
256 boyutlu uzaydaki noktayı belirtiyoruz.
Bunu yapmak için programda bize verilen ve daha önceden imzalanmış geçerli XOR sonucunu okumamız gerekli.
Ardından pre_copy betiğinin yeni bir shell başlatması için gerekli değişiklikleri yapıyoruz, ve yeni bir
geçersiz XOR sonucu elde ediyoruz.
Bu ikisini XOR'ladığımızda ise nihai XOR sonucu hedefimize ulaşmış oluyoruz.
Eğer dosya isimlerimiz ile bir şekilde bu XOR sonucunu elde edebilirsek -temel olarak uzayda bu noktaya ulaşmak için hangi
vektörleri seçeceğimize karar verirsek- 
 geçersiz olan XOR (B) sonucu ile XOR'ladığımızda
geçerli bir imzalanmış XOR sonucu elde edebiliriz.
Sonucu alalım ve bir hedef vektör tanımlayalım. Daha sonra lineer bağımsız vektör matrisimizi alarak
sonuca ulaşmamızı sağlayan hedef vektörü hesaplamak için denklem sistemini çözmemiz yeterli.

Turkish: 
Hedef vektör, lineer bağımsız vektörlerimizden oluşan matristen  hangi vektörlerin
seçileceğini gösterecektir.
1 varsa seç 0 varsa seçme.
Ya da daha matematiksel anlamda ilk vektörü 1 ile çarp topla, ikinci vektörü
1 ile çarp topla ve üçüncü vektörü
0 ile çarp topla.
Bu şekilde devam ediyor.
Hedef vektörü bir döngüye aldığımızda 1 gördüğümüz zaman ilgili dosyayı oluşturmak için dosya adını yazdıracağız.
Böylece istenilen XOR sonucunu üretmek için dizinde gerekli tüm dosyalar oluşturulmuş olacak.
Ve bütün bu işlemlerden sonra
belirlenmiş dosya adlarından oluşan değiştirilmiş pre_copy betiğine sahip
geçerli bir imzaysı olan yeni bir .zip güncelleme dosyası oluşturabiliriz.
Yeniden servise bağlanıp değiştirilmiş update.zip dosyasını gönderdiğimizde
dosya açılır, imza kontrol edilir ve pre_copy betiği çalıştırılır.

English: 
to the right, basically just solve this matrix
equation and the resulting vector will tell
us which vector we take and not take.
Where we have a 1 we take it, where we have
0 we don’t take it.
Or to be more mathematical, we multiply the
first vector with 1 and add it, we multiply
the second vector with 1 and add it, and we
take the third vector and multiply it with
0 and add it.
And so forth.
So we can now loop over this resulting vector,
and wherever we have a 1 we print the name
of the file we have to create in order to
craft the corresponding XOR result.
And if we do all of that.
We can create the new .zip update file with
all of these chosen files, and that should
have a valid signature, but a modified pre_copy
script.
And so we can connect again to the service
and send our modified update.zip.
It gets unpacked, the signature checked, and
the precopy script is executed.

Turkish: 
Bu sayede bayrağı görüntülememizi sağlayan
sunucuda yeni bir shell başlatılmış olur.
Boom.
Çözüldü.
Harika değil mi ?
Çeviri: Y.Ö

English: 
And this should have now spawned a shell on
the server that we can use to look around,
and in the end, read out the flag.
Boom.
Solved.
Isn’t that amazing.
t
