
English: 
Remember the boss Magmarok in the Fire and
Ice dungeon?
It’s part of another quest, or flag, that
we still need to get.
Magmarok shoots fireballs and and when he
gets below half of his health, he will heal
himself up.
Here is a clip from the let’s play episode:
Ok, let’s try this again.
Yeah, that’s easy!
Eeeezy!
Easy, look at this skills I have.
This movement.
Oh shit what is he doing now?
He healed.
He healed.
So how can we defeat him?
Like I mentioned previously, the motivation
for me to make this series came from Antonin
Beaujeant asking me originally, to make videos
about Pwn Adventure 3 and he shared his workshop
slides covering Pwn Adventure 3 with me.

Turkish: 
Ateşdeki patron Magmarok'u hatırla ve
Buz zindanı?
Bu başka bir arayışın ya da bayrağın parçası
Hala almaya ihtiyacımız var.
Magmarok ateş toplarını vuruyor ve o ne zaman?
sağlığının yarısı altına düşerse iyileşir
kendini.
İşte oynayalım bölümünden bir klip:
Tamam, tekrar deneyelim.
Evet, bu kolay!
Eeeezy!
Sakin ol bu yeteneklere bak.
Bu hareket.
Kahretsin, şimdi ne yapıyor?
O iyileşti.
O iyileşti.
Peki onu nasıl yenebiliriz?
Daha önce de söylediğim gibi, motivasyon
Benim için bu diziyi yapmak Antonin'den geldi.
Beaujeant benden orjinal video istiyor
Pwn Adventure 3 hakkında ve atölyesini paylaştı
benimle Pwn Adventure 3'ü kapsayan slaytlar.

Turkish: 
Ancak bu CTF her zaman bir şey olmuştur
Kendim yapmak istedim
Bu yüzden büyük bir yardımdı ve elbette ki
beni nihayet yapmam için motive ediyor.
Bu da, hiç spoiler istemediğim anlamına geliyor.
ama beni biraz şımarttı.
Bana ilk mesajında ​​önerdi
“çift hakkında bir video yapabilirim
patronu öldürmek için tamsayı taşması ”.
Dun dun duuun.
Neyse, Magmarok'u öldürmemiz gerektiğini biliyordum.
bir veya iki Tamsayı Taşması ile, ve ben
bunu bilmiyormuş gibi davranmayacağım
ve nasıl anladığımı anlatan bir hikaye hazırladım.
Yine de bence hala ilginç
aslında onu bulmak için.
Bazen bir yazılım duyarsınız.
belirli bir hata var, ancak teknik detay yok
Henüz bilinir, bu yüzden kendin bulmak zorundasın.
Ve ben de bunu yapmaya çalıştım.
Son birkaç video tersine mühendislik hakkındaydı
ağ protokolü, proxy’mizi geliştirmek
ve paketlerin ayrıştırılması.
Ve burada yoğun olarak kullanacağım.
Ayrıştırıcıya tekrar birkaç paket daha ekledim.
kamera kapalı.

English: 
However this CTF has always been something
I wanted to do myself.
So he was a huge help and was of course the
spark to motivate me to finally do it.
And that means I didn’t want any spoilers,
but he did spoil me a little bit.
In his very first message to me, he suggested
that I could make a video about the “double
integer overflow to kill the boss”.
Dun dun duuun.
So anyway, I knew that we had to kill Magmarok
with one or two Integer Overflows, and I’m
not going to pretend I didn’t know that
and make up a story how I figured it out myself.
Nevertheless I think it’s still interesting
to actually find it.
It happens sometimes that you hear, a software
has a certain bug, but no technical details
are known yet, so you have to find it yourself.
And that’s what I tried to do.
The past few videos were about reverse engineering
the network protocol, developing our proxy
and parsing packets.
And I will be using that heavily here.
I added again a few more packets to the parser
off camera.

English: 
one new packet in particular is very important
here, and that is the “update health”
packet.
It’s a simple packet, it is sent from the
server to the client and comes with a health
value and an ID to identify who’s health
it is.
You might discover this packet when you get
damaged and slowly regenerate.
But you also get the health value of the monsters
that you damage.
While implementing this I first defined the
health to be an unsigned integer, indicated
by capital I when unpacking the binary data.
Though when I killed a spider I noticed that
the health suddenly is extremely large, and
that doesn’t make sense.
So this means we interpreted the binary data
wrong.
In fact this tells me this is supposed to
be a signed integer.
Unsigned integers are just positive numbers,
while signed integers means that certain binary
values are interpreted as negative numbers.
And changing the parsing to a lower-case i
shows us now a nice negative value for when
we kill the spider.
So we keep in mind, that the health is a signed
value.

Turkish: 
özellikle yeni bir paket çok önemlidir
burada ve bu “güncelleme sağlığı”
paket.
Bu basit bir paket, gönderilir.
sunucuya müşteriye ve sağlık ile birlikte gelir
Kimin sağlığını belirlemek için değer ve bir kimlik
bu.
Aldığınızda bu paketi keşfedebilirsiniz.
hasar görmüş ve yavaş yavaş yenilenecektir.
Ama aynı zamanda canavarların sağlık değerini alıyorsun
Zarar verdiğini.
Bunu uygularken ilk önce
işaretsiz bir tamsayı olmak için sağlık
Büyük harfle ikili verileri açarken.
Bir örümceği öldürdüğümde bunu farkettim
sağlık aniden aşırı derecede büyük ve
bu mantıklı değil.
Bu, ikili verileri yorumladığımız anlamına gelir.
yanlış.
Aslında bu bana olması gerektiğini söylüyor
imzalı bir tamsayı olmak.
İmzasız tamsayılar sadece pozitif sayılardır,
imzalı tamsayılar ise belirli bir ikili
değerler negatif sayılar olarak yorumlanır.
Ve ayrıştırmayı küçük harfle değiştirmek
bize şimdi ne zaman için güzel bir negatif değer gösterir
örümceği öldürürüz.
Bu yüzden, sağlığın bir imzalı olduğunu aklımızda tutuyoruz
değer.

English: 
I don’t want to explain here in detail again
how signed and unsigned numbers work, so I
created a short bonus episode for those of
you who need some additional information.
But with this knowledge we can put together
a plan to find this mysterious integer overflow.
We are looking for where unsigned and signed
numbers are somehow carelessly mixed together.
In assembler this means we are looking for
signed and unsigned operations.
In the bonus video I have shown you, that
addition works perfectly fine with signed
and unsigned values.
So that wouldn’t be a difference in assembler.
The difference is in how we interpret this
data.
And one such interpretation happens with comparisons.
Because with signed values a -1 is smaller
than a 1.
But the equivalent unsigned value a 0xFFFFFFFF,
4.2 billions is much larger than a 1.
And in x86 assembly we have different instructions
for that.

Turkish: 
Burada daha ayrıntılı olarak açıklamak istemiyorum
İmzalı ve imzasız numaralar nasıl çalışır?
olanlar için kısa bir bonus bölümü oluşturdu
ek bilgiye ihtiyaç duyan
Ancak bu bilgiyle bir araya getirebiliriz
Bu gizemli tamsayı taşmasını bulma planı.
İmzasız ve imzalanmış yer arıyoruz
sayılar bir şekilde dikkatsizce birbirine karışır.
Assembler bu demektir ki biz arıyoruz
imzalı ve imzasız işlemler.
Bonus videoda size gösterdim ki
Ekleme imzalanan ile mükemmel çalışıyor
ve işaretsiz değerler.
Böylece montajcı bir fark olmaz.
Aradaki fark, bunu nasıl yorumladığımız
veri.
Ve böyle bir yorum karşılaştırmalarla olur.
Çünkü işaretli değerler ile bir -1 daha küçüktür
1'den daha.
Ancak eşdeğer işaretsiz değeri bir 0xFFFFFFFF,
4,2 milyar, 1'den çok daha büyük.
Ve x86 montajında ​​farklı talimatlarımız var
bunun için.

Turkish: 
Örneğin imzalı bir karşılaştırma için
JLE yapın, daha az veya eşit olduğunda zıplayın,
işaretsiz değerler biz JBE yapardık, aşağıya atla
veya eşit.
Çok daha büyük ve daha az, imzalanmış yorumlar
Verilerin üstünde, üstünde ve altında imzasız
yorumlamayı.
Ve bu bize şimdi planımızda yardımcı oluyor.
İmzalanmış bir değeri nerede buluruz
sağlık gibi, imzasız bir şekilde ele alınır
aşağı veya yukarı gibi talimatlar.
Ya da öbür taraftan, imzasız bir durumdayız
değer ve daha az veya daha büyük ile karşılaştırın
Talimatlar.
Bakmaya iyi bir başlangıç, hasar fonksiyonu
Magmarok için.
Çünkü sonuçta, Magmarok'a zarar vermek
Bir oyuncu olarak nasıl etkileşim kurabileceğimizin tek yolu budur.
onunla.
Veya daha soyut terimlerle, tek
Magmarok “programına” giriş yapabiliriz.
Bu işlev bir Aktör, bir Öğe alır.
hasar miktarı ve hasar tipi parametresi olarak.
Hasar ve hasar tipini kontrol edebiliriz
kullandığımız silah veya büyüye bağlı olarak.

English: 
For example for a signed comparison we would
do JLE, jump if less or equal, while with
unsigned values we would do JBE, Jump if below
or equal.
So greater and less than, are signed interpretations
of data, while above and below is the unsigned
intepretation.
And that helps us now with our plan.
We essentially look for where a signed value
like the health, is handled with an unsigned
instruction like below or above.
Or the other way around, we take an unsigned
value and compare it with less or greater
instructions.
So a good start to look, is the damage function
for Magmarok.
Because in the end, dealing damage to Magmarok
is the only way how we as a player can interact
with him.
Or in more abstract terms, that is the only
input we can give to the Magmarok “program”.
This function takes an Actor, an Item, the
amount of damage and the damage type as parameter.
We can control the damage and type of damage
based on the weapon or spell we use.

Turkish: 
Bizim zamanımızdan beri oyunu gdb ile hata ayıklamak,
veya IDA'nın tanıdığı numaralardan bildiğimizi biliyoruz
PhysicalDamage, FireDamage, ColdDamage var
ve ShockDamage.
Biraz karşılaştırırsak nasıl IDA ve İkili
Ninja, Hasar fonksiyonunu parçalarına ayırdık.
IDA'nın biraz daha fazla bilgi gösterdiğini görebilirsiniz.
Aslında belli değişkenleri isimlendirmiştir.
gömülü hata ayıklama bilgileri almak mümkün
İkili olarak
Ama bunun bir kısmını Binary'de elle yapabiliriz.
Ninja da.
Parametre tiplerini gösterdiğini görüyorsunuz
burada, ancak türünü veya adını ayarlamadı
parametreler.
Yani arg1 'in bu işaretçi olduğunu biliyoruz.
Magmarok nesnesinin kendisine, bu bir
oyuncu, muhtemelen oyuncumuz, bir eşya ve hasar
ve hasar tipi.
Ve biz de burada çağrılara dayanarak görebiliriz.
hangi parametrelerin karşılık geldiği
Hangi sicili ve böylece ne tür olduğunu biliyoruz
Burada yerel değişkenlerin parametreleri burada ayarlanır.
Ama şimdi bunu IDA ile karşılaştırırsak, farkına varırız.
bu bir şey doğru değil.

English: 
From our time debugging the game with gdb,
or from the enums IDA recognized we know that
there is PhysicalDamage, FireDamage, ColdDamage
and ShockDamage.
If we compare a little bit how IDA and Binary
Ninja disassemble the Damage function, we
can see that IDA displays a bit more information.
In fact it names certain variables it was
able to get from the debug information embedded
in the binary.
But we can do some of this by hand in Binary
Ninja as well.
You see that it shows the types of the parameters
here, but didn’t set the type or name of
the parameters.
So we know arg1 is the this pointer, pointing
to the Magmarok object itself, this is an
actor, probably our player, an item, and damage
and damage type.
And we can also see here based on the calling
convention which parameters corresponds to
which register and thus we know what kind
of local variables are set here from the parameters.
But if we compare that now to IDA, we realize
that something is not right.

English: 
IDA said that the type would come from rsi,
while we thought r8 is the source.
So what is true now?
Well if you would blindly rely on IDA now,
you would have a hard time understanding what’s
going on.
But this is only true for the IDA 64 free
version.
I don’t know if it was a bug, or if this
analysis is only a feature from more advanced
plugins in the Pro version, but when I ask
my friend to open it in a recent version,
then IDA Pro does it correct.
So the point of this story is, I rarely rely
on one tool, I don’t understand IDA, or
any other tool, well enough, to be able to
figure out issues like this.
I’m sure a professional reverse engineer
has no issues with that.
But I like to compare the output from Binary
ninja, IDA, Hopper, radare and whatever.
It helps me to understand the stuff better.
Anyway.
Let’s have a closer look.
First we compare the damage type to 1.
If it was not equal to 1, we go over here.
So if it’s not fire damage, because that
is type 1.

Turkish: 
IDA, türün RSI’den geleceğini söyledi.
r8'in kaynak olduğunu düşünürken.
Peki şimdi doğru olan ne?
Peki, şimdi IDA'ya körü körüne güvenirsin,
ne olduğunu anlamakta zorlanacaktın
devam ediyor.
Ancak bu sadece IDA 64 ücretsiz için geçerlidir
sürümü.
Böcek olup olmadığını bilmiyorum ya da bu
analiz sadece daha gelişmiş bir özelliktir
eklentileri Pro sürümünde, ancak sorduğumda
arkadaşım son sürümde açmak için
daha sonra IDA Pro doğru yapar.
Yani bu hikayenin amacı, nadiren güveniyorum
bir araçta IDA'yı anlamıyorum veya
Başka bir alet, yeterince iyi, yapabilmek için
Böyle sorunları çöz.
Eminim profesyonel bir ters mühendisi
Bununla hiçbir sorunu yok.
Fakat çıktıyı Binary ile karşılaştırmayı seviyorum.
ninja, IDA, Hopper, radare ve her neyse.
Olayları daha iyi anlamama yardımcı oluyor.
Neyse.
Daha yakından bir göz atalım.
İlk önce hasar türünü 1 ile karşılaştırıyoruz.
1'e eşit değilse, buraya gideriz.
Yani eğer yangın hasarı değilse, çünkü
1 türüdür.

Turkish: 
Sonra soğuk hasar olup olmadığını kontrol ederiz.
2.
Eşit olsaydı, buraya giderdik, ama
eşit değilse, başka türlü
hasar, biz eax içine bir 2 yük, içine taşımak
Buradaki adres, hasar miktarını yükleyin.
ecx içine 2 tekrar aşağıya yükleyin ve ardından
bölünme gerçekleştirmek.
Yani hasarı ikiye bölüyoruz.
Ancak, hasar yangın hasarı olsaydı.
Bu çılgın bloğa giriyoruz.
Ve xmm kayıtları genellikle olduğu anlamına gelir
bazı kayan nokta hesaplamaları.
Ve bir pow float işlevi var, bu yüzden alır
gücünün bir değeri var mı?
Bu ileriyi okumak her zaman biraz çirkindir,
ama aynı zamanda geri adım atabiliriz.
Tüm bunlardan sonra, hasar
eax.
Ve eax bu değişkenden geliyor, fakat çıkarılıyor
0'dan.
Yani bu onu negatif yapıyor.
Bu hesaplanan hasar değeri anlamına gelir.
aslında daha çok iyileştirici bir değer gibi.
Olumsuz hasar iyileşiyor.
Öyleyse şifa olarak değiştirelim.

English: 
Then we check if it’s cold damage, type
2.
If it’s equal, we would go down here, but
if it’s not equal, so any other kind of
damage, we load a 2 into eax, move it into
this address here, load the damage amount
into ecx, load the 2 again down here and then
perform a division.
So we divide the damage by two.
However, if the damage was fire damage.
We go into this crazy block.
And xmm registers usually means there are
some floating point calculations.
And there is a pow float function, so it takes
some value to the power of, something?
Reading this forward is always a bit ugly,
but we can also backtrace.
So after all of this, the damage is set from
eax.
And eax comes from this variable, but is subtracted
from 0.
So this makes it negative.
This means the damage value that was calculated
is actually more like a healing value.
Negative damage is healing.
So let’s rename it to healing.

English: 
And healing could be set in this block to
whatever is in this unknown variable.
But healing is only set here, if the condition
before is false.
And it compares here the healing to that unknown
value.
So if this unknown value is smaller than the
healing, then healing is set to that value.
Which means there is a cap on the amount of
healing that is calculated.
So doing healing larger than that value is
not allowed.
And don’t forget, we are hunting for an
integer overflow, so we need to pay attention
to these comparisons and here, we have JBE,
which is an unsigned comparison.
And this unkown value is the result of a subtraction
from a fixed value, 0x2710, which is 10.000
in decimal.
And it’s subtracting a value stored at the
offset 0x38 from rax.
And rax is this.
This is a pointer to the current Magmarok
object, so taking an offset from that address

Turkish: 
Ve bu blokta iyileşme
Bu bilinmeyen değişkende ne varsa.
Ancak iyileşme ancak burada belirtilmişse
daha önce yanlış.
Ve burada, bu bilinmeyenle şifayı karşılaştırır.
değer.
Öyleyse bu bilinmeyen değer
iyileşme, daha sonra iyileşme bu değere ayarlanır.
Bu, miktarın üzerinde bir sınır olduğu anlamına gelir
bu şifa hesaplanır.
Yani bu değerden daha büyük iyileşme yapıyor
izin verilmedi.
Ve unutma, biz av için bir
tamsayı taşması, bu yüzden dikkat etmemiz gerekiyor
bu karşılaştırmalara ve burada, JBE’ye sahibiz,
Bu imzasız bir karşılaştırma.
Ve bu bilinmeyen değer bir çıkarma sonucudur
10.000 olan sabit bir değerden 0x2710
ondalık olarak.
Ve depolanan bir değeri çıkarmak
ofset 0x38 rax'ten.
Ve bu da Rax.
Bu mevcut Magmarok'un bir göstergesidir
nesne, bu adresden ofset alma

English: 
means we are referring to an attribute of
Magmarok.
Let’s investigate this with gdb.
First we need to set a breakpoint somewhere
in this function.
As this is an external library, we can’t
simply copy the address here, but gdb knows
the symbols and addresses so we can just disassemble
the Magmarok Damage function and also set
a breakpoint there.
Now we just have to walk up to Magmarok and
shoot with something at him, to trigger the
damage function, and we hit the breakpoint.
Let’s walk a few steps forward so the function
prologue is done.
And then print this.
So you can see that this is a pointer to a
Magmarok object.
And by dereferencing the pointer when printing,
we can also print the whole object.
Including the attributes coming from inherited
classes such as actor.
So for example Magmarok has 10.000 health!
Or he has an attribute if healing is active.
And we know he can heal himself.
With gdb we can also now learn more about
the offsets.

Turkish: 
bir niteliğe atıfta bulunduğumuz anlamına gelir
Magmarok.
Bunu gdb ile araştıralım.
İlk önce bir yere bir sınır noktası koymamız gerek.
Bu fonksiyon
Bu harici bir kütüphane olduğundan, yapamayız.
sadece adresi buraya kopyalayın, ancak gdb biliyor
Semboller ve adresler, böylece sökmeye başlayabiliriz.
Magmarok Hasar fonksiyonu ve ayrıca ayarlanmış
orada bir kırılma noktası.
Şimdi Magmarok'a gitmeliyiz ve
tetiklemek için, onunla bir şey çekmek
hasar fonksiyonu ve kesme noktasına geldik.
Birkaç adım ileri gidelim, işlev
prolog yapıldı.
Ve sonra bunu yazdırın.
Böylece bunun bir işaretçi olduğunu görebilirsiniz.
Magmarok nesnesi.
Ve yazdırırken işaretçiyi deforme ederek,
tüm nesneyi de basabiliriz.
Miras alınan özellikler dahil olmak üzere
aktör gibi sınıflar.
Mesela Magmarok'un 10.000 sağlığı var!
Ya da iyileşme aktifse bir özelliği vardır.
Ve kendini iyileştirebileceğini biliyoruz.
Gdb ile artık daha fazla bilgi edinebiliriz
ofsetler.

English: 
For example we can get the address of where
m_health is stored, and calculate the offset
from where Magmarok starts.
Which turns out to be 0x38.
And the healing_active attribute at offset
0x148.
I have chosen those two because they will
be important, but of course you could map
out all of them like that.
And that is super useful for reversing with
a disassembler.
We now head to the structures in Binary Ninja
and create new one, that we call Magmarok.
And let’s give it some size, like 0x150,
so we can fit both attributes we know in there.
Now we don’t know the other fields, but
we know that at offset 0x38 we have an integer
health and at 0x148 we have a bool for healing
active.
Then we can go back to our damage function
and change the type from the default integer
that was set for this to a Magmarok pointer.
And now, look!
The pointer was automatically resolved and
Binary Ninja can tell us now that this is
an offset to the health!
Cool, right?

Turkish: 
Mesela nerenin adresini bulabiliriz
m_health saklanır ve ofseti hesaplar
Magmarok'un başladığı yerden.
Hangi 0x38 olduğu ortaya çıkıyor.
Ve ofsetteki healing_active özelliği
0x148.
O ikisini seçtim çünkü onlar
önemli, ama tabii ki harita yapabilirsin
hepsini böyle dışarı.
Ve bu tersine çevirmek için süper yararlı
bir sökme cihazı.
Şimdi İkili Ninja'daki yapılara yöneliyoruz.
ve Magmarok dediğimiz yeni bir tane yaratın.
Ve 0x150 gibi bir boyut verelim.
böylece orada bildiğimiz her iki özelliğe de uyabiliriz.
Şimdi diğer alanları tanımıyoruz, ama
0x38 ofsetinde bir tamsayıya sahip olduğumuzu biliyoruz
sağlık ve 0x148 de şifa için bir bool var
aktif.
O zaman hasar fonksiyonumuza geri dönebiliriz.
ve türü varsayılan tamsayıdan değiştirin.
bunun için Magmarok işaretçisine ayarlandı.
Ve şimdi bak!
İşaretçi otomatik olarak çözüldü ve
İkili Ninja bize bunun şimdi olduğunu söyleyebilir
sağlığa bir denge!
Harika değil mi?

Turkish: 
Yani daha fazlasını öğrendikten sonra yapıları tanımlamak
Ne anlama geldiği hakkında, tersine çevirmenin bir parçası,
işlevleri ve değişkenleri yeniden adlandırma gibi
öyleyse.
Tüm resmi yavaşça oluşturuyorsun.
Şimdi biliyoruz, Magmarok'un şu anki sağlığı
10.000'den çıkarıldı.
Böylece bilinmeyen değerimize, health_difference denilebilir.
Tam sağlık arasındaki fark bu
ve şu anda Magmarok'un bulunduğu yer.
Yani health_difference daha küçükse
yapmak istediğimiz şifa, sonra şifa
farkı kapatıldı.
Bir örnek yapalım, eğer Magmarok 9800 ise
sağlık, sonra fark 200.
Ve 500 sağlık puanı için iyileşmeye çalıştığımızda,
o zaman bu 200 den daha büyük olurdu ve
iyileşme, bu değere ayarlanmış olarak kapatılır.
O yüzden 10000'den fazla iyileştiremeyiz.
Şimdi hatırla, burada imzasız bir karşılaştırmamız var.
10.000 eksi sabit kodlanmış bir sonucu
Magmarok'un mevcut sağlığı.
Ve çıkarma her zaman çok zor.
Sağlığın daha büyük olup olmadığı kontrol edilemez
10.000’den

English: 
So defining structures once you learn more
about what stuff means, is part of reversing,
like renaming functions and variables and
so forth.
You slowly build up the whole picture.
Now we know, the current health of Magmarok
is subtracted from 10.000.
So our unknown value could be called, health_difference.
It’s the difference between the full health
and where Magmarok currently is at.
So if the health_difference is smaller than
the healing we wanted to do, then the healing
is capped at the difference.
Let’s do an example, if Magmarok has 9800
health, then the difference is 200.
And when we try to heal for 500 health points,
then that would be larger than 200 and the
healing would be capped, set to that value.
So we can’t heal more than up to 10000.
Now remember, here we have an unsigned comparison
on the result of a hardcoded 10.000 minus
the current health of Magmarok.
And subtraction is always very tricky.
There is no check if the health is larger
than 10.000.

Turkish: 
Yani bu imzasız karşılaştırma gerçekten başarabilir
Magmarok'un sağlığı daha büyük olsaydı
10000’den
Örneğin, sağlık 15.000 ise,
10.000'den 15.000 çıkartma sonucu ortaya çıkar
imzalı bir değer olarak yorumlanırsa -5000’de,
ancak -5000, yorumlanırsa çok büyük bir değerdir
imzasız olarak.
Ve böylece bu imzasız çek, jbe yorumlayacaktır.
Sonuç 0xFFFFEC78 veya 2,5 milyar.
Yani şimdi 500 HP için iyileşmeye çalışırsak,
Sonra kontrol derdi ki, 2.5 milyar dolar
İyileştirmeye çalıştığımızdan daha küçük değil.
Öyleyse sınır atmıyoruz ve iyileşmesine izin vermiyoruz.
Bu imzalı bir çek olsaydı,
JLE, daha az veya eşit olursa zıpla, sonra evet, olur
-5000 olarak yorumlanabilir, ki bu daha küçük olacaktır
iyileştirmeye çalıştığımız 500'den daha fazla.
Yani… buradaki bu şey güvensiz olabilir, eğer
bir şekilde Magmarok'un sağlığını alabiliriz

English: 
So this unsigned comparison could really screw
up, if the health of Magmarok were larger
than 10000.
For example if the health were 15.000, then
subtracting 15.000 from 10.000 would result
in -5000 if interpreted as a signed value,
but -5000 is a huuuge value if interpreted
as unsigned.
And so this unsigned check, jbe would interpret
the result as 0xFFFFEC78, or 2.5 billion.
So if we now would try to heal for 500 HP,
then the check would say, no 2.5billion is
not smaller than what we try to heal.
So we don’t cap and allow to heal.
If this would have been a signed check, so
JLE, jump if less or equal, then yeah,it would
be interpreted as -5000, which would be smaller
than the 500 we try to heal.
So… this thing here could be unsafe, if
we somehow can get the health of Magmarok

English: 
higher than 10.000.
If its not higher than 10.000, then the subtraction
would not overflow the integer and apply a
cap to the healing.
So while we can heal Magmarok with fireballs,
this check will always prevent us to heal
higher than 10.000.
So it’s kind of like a chicken and egg problem,
right?
If the health would be higher than 10k, we
could heal him even higher, but if the health
is below or equal to 10.000, we can only heal
him up to 10k.
But theoretically.
We know that the health is a signed integer.
We know that from killing spiders that had
a negative health.
So if we can keep healing magmarok so high,
that the value doesn’t fit in the 32bit
signed integer anymore, it overflows and wraps
around to a negative value.
Then Magmarok would be instantly dead!
Hmmhmh…
But the problem is, by itself, this function
here is safe.
We can’t heal over 10k.
But we know, that Magmarok can also heal himself.
So there is a second logic somewhere that
manipulates Magamarok’s health.

Turkish: 
10.000'den yüksek.
Eğer 10.000'den yüksek değilse, çıkarma
tamsayı taşması ve
iyileşmek için kapak.
Böylece Magmarok'u güvenlik duvarları ile iyileştirebiliriz.
bu çek her zaman iyileşmemizi önler
10.000'den yüksek.
Yani bir çeşit tavuk ve yumurta problemi gibi
sağ?
Sağlık 10 bin dolardan fazla olsaydı, biz
onu daha da iyileştirebilirdi, ama sağlık ise
10.000’in altında veya ona eşittir, yalnızca iyileşebiliriz.
10k'a kadar onu.
Fakat teorik olarak.
Sağlığın işaretli bir tamsayı olduğunu biliyoruz.
Bunu olan örümcekleri öldürmekten biliyoruz.
olumsuz bir sağlık.
Yani Magmarok'u iyileştirmeye devam edebilirsek,
değerin 32bit’e uymadığını
Artık işaretli tamsayı, taşması ve tamamladı
negatif bir değere.
O zaman Magmarok anında ölmüş olacaktı!
Hmmhmh ...
Ancak sorun, kendi başına bu fonksiyondur.
burası güvenli.
10 binden fazla iyileşemeyiz.
Fakat biliyoruz ki, Magmarok da kendini iyileştirebilir.
Yani bir yerde ikinci bir mantık var
Magamarok'un sağlığını değiştirir.

Turkish: 
Yani, bir şekilde bunu aşmak için kötüye kullanabilirsek
10.000 sağlık, sonra açık bir yolumuz var
Magmarok'u öldürmek için dışarı çıktı.
Şimdi onu bulmalıyız.
Başlamak için iyi bir yol sadece bakmaktır
diğer Magmarok fonksiyonları.
Ve tick () sürekli olan bir fonksiyondur
aradı.
Saat gibi bir kene.
Bu işlev birçok nesne için var
böylece davranışlarını güncelleyebilirler
oyun zamanı.
Yani Magmarok bir şeyler yaparsa, en çok
muhtemelen buradan kaynaklanır.
Herhangi bir nesne işlevinde olduğu gibi, ilk parametre,
bu işaretçi.
Bu parametre geçerli Magmarok'a işaret eder
Nesne ve rdi ile iletilir.
Ve böylece burada görüyoruz ki
Birkaç kez..
Böylece tüm türlerini bir Magmarok olarak değiştirebiliriz.
Işaretçi.
Ve zaten görebiliyoruz ki, burada kontrol ediyor
eğer iyileşme aktifse ve sağlık
de birden çok kez referans aldı.
Şimdi, iyileşme 1 ise, çok doğru, aktif
sağlığın daha düşük veya eşit olup olmadığını kontrol ederiz
0.

English: 
So if we somehow can abuse that to get over
10.000 health, then we have a clear path laid
out to kill Magmarok.
So now we have to find that.
A good way to start is just by looking at
the other Magmarok functions.
And the tick() is a function that is constantly
called.
It’s a tick, like on a clock.
This function exists for a lot of objects
so they can update their behaviour according
to the game time.
So if Magmarok would do something, it most
likely would originate from in here.
Like with any object function, the first parameter,
is the this pointer.
This parameter points to the current Magmarok
Object and it is passed in via rdi.
And so here we can see that rdi is used a
few times..
So we can change all their types to a Magmarok
pointer.
And we can already see, that here it checks
if the healing is active, and the health is
referenced multiple times as well.
Now if the healing is 1, so true, active,
we check if the health is less or equal to
0.

Turkish: 
Magmarok'un hala hayatta olup olmadığını kontrol etmek.
Ve bildiğiniz gibi, bu imzalı bir karşılaştırma.
Bu yüzden olumsuz bir sağlık yorumlanabilir
Burada düzgün.
Sonra Magmarok'un sağlığının daha iyi olup olmadığını kontrol ederiz.
5000'den büyük veya eşit.
Bildiğimiz, iyileşmenin tetikleyicisi.
% 50 sağlık sağladığımızda
şifa sekansı.
Yani, iyileşme aktif değilse, ölmedi
ve sağlık 5000'in altında, o geçecek
şifa modu.
En azından sanırım öyle.
Bu devletlerin nasıl yapıldığını gerçekten tersine çevirmedim
Bu oyunda çalışmak, sadece bir şey görmek
Burada başvurulan ve mantıklı olur.
Ama sağlığın nerede olduğunu arıyoruz
değiştirilmiş, bu yüzden bir şey arayalım
sağlığı ayarlar veya değiştirir.
Keşke çapraz referanslar arayabilseydik.
sağlık niteliğine.
Neyse, işte bir örnek.
Sağlık ecx'e taşınır, sonra
0x136f, bu ondalık sayıdaki 4975’dir ve
ekleme işleminin sonucu
sağlık.
Yani…

English: 
Basically checking if Magmarok is still alive.
And as you know, this is a signed comparison.
So a negative health would be interpreted
here properly.
Then we check if Magmarok’s health is greater
than or equal to 5000.
Which we know is the trigger for the healing.
When we got him to 50% health he initiating
his healing sequence.
So if healing is not active, he is not dead
and health is under 5000, he will switch into
healing mode.
At least that’s what I guess.
I haven’t really reversed how these states
work in this game, I just see something is
referenced here and it would make sense.
But we are looking for where the health is
modified, so let’s look for something that
sets or modifies the health.
I really wish we could look for cross-references
to the health attribute.
Anyway, here is one example.
The health is moved into ecx, then we add
0x136f to it, that’s 4975 in decimal, and
the result of the addition is moved into the
health.
So…

Turkish: 
Magmarok arasında bir gecikme olduğunu biliyoruz.
Bu animasyonu yaptığı yerde iyileşmeye gidiyor,
ve sonra aslında iyileşmek…
Sorunu görüyor musun?
Burada bir yarış durumu var.
Kullanım zamanının kontrol zamanı.
Magmarok'un iyileşip iyileşmeyeceği kararı
5.000 HP'nin altına düştüğünde karar verilir, ancak
o zaman gerçek iyileşme daha sonra olur.
Ve iyileşme sadece sağlığı ayarlamakla kalmaz
geri 10k, aslında 4975 ekliyor
sağlık.
Bu, Magmarok’u 10.000’in üzerine çıkarabiliriz.
sağlık.
Sadece onu iyileştirme moduna sokmalıyız.
Ona zarar vererek.
5.000 doların altına düşer düşmez,
iyileşeceğine karar verdi, ama önce
büyü yapmak ve animasyon,
hızlı bir şekilde onu iyileştirmek için güvenlik duvarlarına geçiyoruz
5025'ten fazla sağlık yedekleyin.
Çünkü o zaman birkaç saniye sonra iyileşmesi
büyü başarılı ve 4975 HP için onu iyileştirir,
bu da onu 10 bin atar.

English: 
We know that there is a delay between Magmarok
going into healing, where he does this animation,
and then actually healing up…
Do you see the issue?
There is a race condition here.
A time of check time of use kind of thing.
The decision if Magmarok is going to heal
is decided when he falls under 5.000 HP, but
then the actual healing, happens later.
And the healing is not just setting the health
back to 10k, it’s actually adding 4975 to
the health.
This means, we can push Magmarok over 10.000
health.
We just have to kick him into healing mode
by damaging him.
And as soon as he falls under 5.000, and he
decided he is going to heal, but first has
to cast his spell and the animation starts,
we quickly switch to fireballs to heal him
back up over 5025 health.
Because then a few seconds later his healing
spell succeeds and heals him for 4975 HP,
which then pushes him over 10k.

Turkish: 
Ve onu 10 bin aştırarak biliyoruz.
bu iyileşme sınırını atla ve onu iyileştirmeye devam et
ateş topları ile.
Ve bu belki onu öldürebilir, çünkü şifa
çok fazla bir tamsayı taşmasına neden olabilir
sağlığı, sağlığını aniden olumsuz kılıyor
ve böylece anında onu öldürüyor.
Bunu çıkarmak için ağ vekilini değiştiririm
biraz.
TheGreatBallsOfFire ve ZeroCool'u düz çektim
aşağı.
Ve bu paketleri topla.
Bu paketlerin her ikisi de büyüyü bozar
doğruca vurulmak.
Ayrıca Magmarok'un konumunu da biliyoruz.
aktörler listesi.
Yani yapabileceğimiz şey, bir pozisyon oluşturabiliriz.
paketi güncelleyin ve sunucuya bizim
Magmarok'un üzerinde durup, daha yükseğe koyarak
Ondan Z değeri ve sonra çekimi göndeririz.
paket.
Ve çünkü biz aslında oraya asla taşınmadık.
müşteri gerçek pozisyonu göndermeye devam edecek
güncellemeler.
Bu, sunucunun her zaman olduğumuzu düşündüğü anlamına gelir.
Magmarok'un üstünde ışınlanıp büyü yapmak,
ve güvenli göğsün arkasına ışınlan.
Bunun için nasıl tetikleneceğini düşünüyordum.
oyun ve yaratmaya karar verdim

English: 
And by pushing him over 10k, we know we can
bypass this healing cap and keep healing him
with fireballs.
And that could maybe kill him, because healing
too much can cause an integer overflow of
his health, making his health suddenly negative
and thus instantly killing him.
To pull that off I modify the network proxy
a bit.
I shoot TheGreatBallsOfFire and ZeroCool straight
down.
And collect those packets.
Both of these packets cause the magic spell
being shot straight down.
We also know the position of Magmarok from
the actors list.
So what we can do is, we can craft a position
update packet, and tell the server we are
standing above Magmarok, by setting a higher
Z value than him, and then we send the shoot
packet.
And because we never actually moved there,
the client will keep sending the real position
updates.
This means the server thinks we are always
teleporting above Magmarok, shoot a spell,
and teleport back behind the safe chest.
I was thinking about how to trigger this for
the game, and I decided to place the creation

Turkish: 
ve bu paketlerin gizlice içine enjekte edilmesi
ayrıştırıcı, bu yüzden sinsi düğmeye bastığımızda,
bu paket sunucuya gönderilir, biz ayrıştırılır
burada ve belki bu iki enjekte karar
paketleri trafiğe ekleyin.
Bu da ateş toplarını veya buz toplarını yağmura sebep olur
Magmarok'a.
Havalı değil mi!
Temel olarak yeni bir büyü icat ettik.
Bir meteor yağmuru.
Şimdi tek yapmamız gereken dikkatlice zarar vermek.
Soğuk büyüler veya diğer saldırılarla onu ve
sağlığını gözlemle.
5000'e yaklaştığımızda dikkatli olmalıyız.
Tamam.
Şimdi bir miktar hasar eksik.
Şimdi yavaşladım.
Zero Cool büyüsünü GreatBallsOfFire ile değiştiriyorum
harf harf kodlamak.
Yani gizlice sokmak şimdi bir ateş topu atacak
Onda da onu iyileştirecek.
Sonra düşük hasarlı bir tabancaya geçiyorum.
onunla vur ve bu onu altına iter
5000 HP ve şifa sırasını başlat.
şimdi iyileşmek için birkaç saniyemiz var
Bazı ateş topları ile eşiğin üstünde
gizlice basarak.
İyileşme geliyor!

English: 
and injection of these packets into the sneaking
parser, so when we press down the sneak button,
this packet is sent to the server, we parse
it here and maybe decide to inject these two
packets into the traffic.
And this makes fire balls or ice balls rain
onto Magmarok.
Cool huh!
We basically invented a new spell.
A meteor shower.
So all we have to do now is carefully damage
him with cold spells or other attacks and
observe his health.
Once we get close to 5000 we have to be careful.
Okay.
Now a bit of damage is missing.
Now I take it slow.
I exchange the Zero Cool spell with the GreatBallsOfFire
spell.
So presing sneak now will cast a fireball
on him that will also heal him.
Then I switch to a pistol with low damage,
shoot him with it, and this pushes him under
5000 HP and initiate his healing sequence.
now we have a couple of seconds time to heal
him above the threshold with some fireballs
by pressing sneak.
Healing is coming!

English: 
Okay, we were successful.
His healing spell is over, he healed up and
his health is above 10k.
Now we just have to keep healing him, and
that should eventually kill him.
See how he sometimes shoots up?
That’s because even though we stand here,
we tell the server we are actually above him
to shoot a fireball.
So for a split second Magmarok thinks we are
there.
But when we keep doing this, and you can see
here the signed and unsigned raw byte values
as a comparison, at some point his health
will overflow and kill him!
Quest: Complete, Fire and Ice.
Let’s loot the chest.
Acquired flag of the Lava.
Some bosses just roll over and die.

Turkish: 
Tamam, başarılı olduk.
İyileşme büyüsü bitti, iyileşti ve
sağlığı 10 bin üstü.
Şimdi onu iyileştirmeye devam etmeliyiz ve
Bu sonunda onu öldürmeli.
Bazen nasıl ateş ettiğini görüyor musun?
Çünkü burada durmamıza rağmen
sunucuya biz onun üstünde olduğumuzu söyleriz
ateş topu vurmak için.
Yani bir saniye için Magmarok bizim olduğumuzu düşünüyor
Orada.
Ama bunu yapmaya devam ettiğimiz zaman ve görebiliyorsun ki
burada imzalı ve imzasız işlenmemiş bayt değerleri
bir karşılaştırma olarak, bir noktada onun sağlığı
taşacak ve onu öldürecek!
Görev: Komple, Ateş ve Buz.
Göğsü yağdıralım.
Lav bayrağı alındı.
Bazı patronlar devrilip ölür.
