Skip to content
This repository was archived by the owner on Apr 6, 2025. It is now read-only.

Commit 79698a1

Browse files
committed
Adaugă materialele celui de-al doilea laborator
Adaugă materialele specifice celui de-al doilea laborator. În plus, modifică detalii din README.md și SETUP.md și rezolvă din problemele găsite în directorul primului laborator. Signed-off-by: iosifache <[email protected]>
1 parent 0bc5c9d commit 79698a1

File tree

28 files changed

+711
-49
lines changed

28 files changed

+711
-49
lines changed

.gitignore

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,2 @@
1-
# Omite fișierele de rezolvare
2-
Rezolvări
3-
4-
# Omite fișierele sursă
5-
*.c
6-
*.o
7-
Makefile
8-
91
# Omite fișierele specifice .vscode
102
.vscode

1 - Introducere/Chestionar.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Chestionar
2+
3+
## Întrebări
4+
5+
## Din Laboratorul Curent
6+
7+
1. Ce informații sunt salvate în stiva unui proces?
8+
2. Ce este un executabil?
9+
3. Ce presupune exploatarea executabilelor?
10+
11+
## Altele
12+
13+
1. Care este numele dumneavoastră?
14+
2. Din ce grupă faceți parte?
15+
16+
## Link Folosit
17+
18+
[tinyurl.com/binexp1](https://tinyurl.com/binexp1)

1 - Introducere/Exerciții/README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,38 @@
11
# 1 - Număr de Șiruri de Caractere Printabile 🏁
22

3-
Câte șiruri de caractere cu lungime mai mare de 10 există în executabilul `lyrics`? Folosiți librăria `pwntool` pentru rezolvare.
3+
Câte șiruri de caractere cu lungime mai mare de 10 există în executabilul [`lyrics.elf`](lyrics/lyrics.elf)? Folosiți librăria `pwntool` pentru rezolvare.
44

55
*Flag*-ul este în format `[0-9]*`.
66

77
# 2 - Tipuri de Șiruri de Caractere Printabile 💁
88

9-
De unde provin șirurile de caractere găsite în executabilul `lyrics`?
9+
De unde provin șirurile de caractere găsite în executabilul [`lyrics.elf`](lyrics/lyrics.elf)?
1010

1111
# 3 - Număr de Simboluri 🏁
1212

13-
Identificați numărul de simboluri din segmentul de cod al executabilului `lyrics`. Folosiți librăria `pwntool` pentru rezolvare.
13+
Identificați numărul de simboluri din segmentul de cod al executabilului [`lyrics.elf`](lyrics/lyrics.elf). Folosiți librăria `pwntool` pentru rezolvare.
1414

1515
*Flag*-ul este în format `[0-9]*`.
1616

1717
# 4 - Proveniența Simbolurilor 💁
1818

19-
Judecând după tipurile pe care comanda `nm` le produce asupra executabilului `lyrics`, presupuneți de unde vin simbolurile `lyrics`, `puts` și `main`.
19+
Judecând după tipurile pe care comanda `nm` le produce asupra executabilului [`lyrics.elf`](lyrics/lyrics.elf), presupuneți de unde vin simbolurile `lyrics`, `puts` și `main`.
2020

2121
# 5 - Automatizarea Analizei Dinamice cu `pwntools` 🏁
2222

23-
Rulați programul `flag-checker`. Cum operațiunile ce trebuiesc efectuate sunt prea multe, automatizați tot procesul de identificare a *flag*-ului cu ajutorul librăriei `pwntools`.
23+
Rulați programul [`flag-checker.elf`](flag-checker/flag-checker.elf). Cum operațiunile ce trebuiesc efectuate sunt prea multe, automatizați tot procesul de identificare a *flag*-ului cu ajutorul librăriei `pwntools`.
2424

2525
*Flag*-ul este în format `SI{[A-Z_]*}`.
2626

2727
# 6 - Librării Dinamice 💁
2828

29-
Identificați modalitatea prin care executabilul `flag-checker` apelează funcția de verificare a *flag*-ului. Puteți folosi utilitarele `ldd` și `objdump`.
29+
Identificați modalitatea prin care executabilul [`flag-checker.elf`](flag-checker/flag-checker.elf) apelează funcția de verificare a *flag*-ului. Puteți folosi utilitarele `ldd` și `objdump`.
3030

3131
# 7 - Dezasamblarea Programelor 💁
3232

3333
Puteți identifica *flag*-ul de la sarcina de mai sus prin rularea comenzii `strings` asupra programului?
3434

35-
Dacă nu, vă puteți da seama de ce din dezasamblarea funcției `check_flag` din librăria `libcheckflag.so`? Încercați aceeași tip de dezasamblare în Ghidra, eventual folosind funcția de decompilare.
35+
Dacă nu, vă puteți da seama de ce din dezasamblarea funcției `check_flag` din librăria [`libcheckflag.so`](flag-checker/libcheckflag.so)? Încercați aceeași tip de dezasamblare în Ghidra, eventual folosind funcția de decompilare.
3636

3737
# 8 - Apeluri de Sistem 💁
3838

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
all: clean build
2+
3+
build: libcheckflag.so flag-checker.elf
4+
5+
libcheckflag.so:
6+
gcc -m32 -c -fPIC library.c -o library.o
7+
gcc -m32 -shared library.o -o libcheckflag.so
8+
9+
flag-checker.elf:
10+
gcc -m32 -Wl,--no-as-needed source.c -zlazy -o flag-checker.elf -L. -lcheckflag -ldl
11+
12+
clean:
13+
rm -f flag-checker.elf library.o libcheckflag.so
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include "stdio.h"
2+
3+
int check_flag(char *provided_flag) {
4+
char flag[] = {
5+
0x32, 0x28, 0x1a, 0x22, 0x29, 0x24, 0x22, 0x2a, 0x28,
6+
0x2f, 0x26, 0x3e, 0x35, 0x29, 0x24, 0x3e, 0x27, 0x2d,
7+
0x20, 0x26, 0x3e, 0x23, 0x38, 0x35, 0x24, 0x3e, 0x23,
8+
0x38, 0x3e, 0x23, 0x38, 0x35, 0x24, 0x1c
9+
};
10+
char key = 'a', current_letter, provided_letter;
11+
int i;
12+
13+
for (i = 0; i < sizeof(flag); i++) {
14+
current_letter = flag[i] ^ key;
15+
provided_letter = provided_flag[i];
16+
17+
if (current_letter == provided_letter)
18+
// TODO: Debug only, will remove later
19+
printf("%c", current_letter);
20+
else
21+
return 0;
22+
}
23+
24+
return 1;
25+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include "dlfcn.h"
2+
#include "stdio.h"
3+
#include "string.h"
4+
5+
#define LIBRARY_NAME "libcheckflag.so"
6+
#define FUNCTION_NAME "check_flag"
7+
8+
int main(int argc, char *argv[]) {
9+
10+
void *handle;
11+
int (*check_flag)(char *);
12+
char *provided_flag;
13+
int success;
14+
15+
if (argc != 2) {
16+
printf("A flag needs to be provied as an argument!\n");
17+
18+
return 1;
19+
}
20+
provided_flag = argv[1];
21+
22+
handle = dlopen(LIBRARY_NAME, RTLD_LOCAL | RTLD_LAZY);
23+
if (handle == NULL) {
24+
printf("Cannot find the library needed to verify the flag, " LIBRARY_NAME "!\n");
25+
26+
return 1;
27+
}
28+
*(void **)(&check_flag) = dlsym(handle, FUNCTION_NAME);
29+
30+
success = (*check_flag)(provided_flag);
31+
if (success) {
32+
printf("\nCongrats, you get the flag!\n");
33+
34+
return 0;
35+
} else {
36+
return 1;
37+
}
38+
39+
return 0;
40+
41+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
all: clean build
2+
3+
build:
4+
gcc -m32 source.c -o lyrics.elf
5+
6+
clean:
7+
rm -f lyrics.elf
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#include <stdio.h>
2+
#include <unistd.h>
3+
4+
const char *lyrics[] = {
5+
"Un paso me voy para siempre",
6+
"Un paso fuerte",
7+
"Un paso hacia adelante",
8+
"Dos pasos, me voy sin mirarte",
9+
"Tan lejos pisé",
10+
"Dos pasos y ya te olvidé",
11+
"Tres pasos ya soy hacia al este",
12+
"El sur, el oeste",
13+
"Tres pasos creo mucho, me parece",
14+
"¿Y cuándo volverás?",
15+
"Je ne reviendrai pas",
16+
"¿Cuándo volverás?",
17+
"Je suis si loin déjà",
18+
"¿Y cuándo volverás?",
19+
"Un dia o jamás",
20+
"¿Y cuándo volverás?",
21+
"J'ai fait le premier pas",
22+
"¿Cuando volverás?",
23+
"Surtout ne m'attends pas",
24+
"¿Cuándo volverás?",
25+
"Un día o jamás",
26+
"Quatro pasos quiero acordarme",
27+
"Quatro pasos ya sé",
28+
"Tu me quisiste, yo te quise",
29+
"Cinco pasos ya sin perderme",
30+
"Tanto me alejé",
31+
"Cinco pasos y te perdoné",
32+
"Seis pasos ya, son casi siete",
33+
"Contar más no sé",
34+
"Mil pasos y más, me quedo de pie...",
35+
"¿Y cuándo volverás?",
36+
"Je ne reviendrai pas",
37+
"¿Cuándo volverás?",
38+
"Je suis si loin déjà",
39+
"¿Y cuándo volverás?",
40+
"Un dia o jamás",
41+
"¿Y cuándo volverás?",
42+
"Surtout ne m'attends pas",
43+
"¿Cuando volverás?",
44+
"J'ai fait le premier pas",
45+
"¿Cuando volverás?",
46+
"Un día o jamás",
47+
"Un paso, dos pasos, tres pasos, cuatro pasos, cinco pasos...",
48+
"Mil pasos...",
49+
"¿Y cuándo volverás?",
50+
"Je ne reviendrai pas",
51+
"¿Cuándo volverás?",
52+
"Je suis si loin déjà",
53+
"¿Y cuándo volverás?",
54+
"Un dia o jamás",
55+
"¿Y cuándo volverás?",
56+
"Surtout ne m'attends pas",
57+
"¿Cuando volverás?",
58+
"J'ai fait les mille pas",
59+
"¿Cuando volverás?",
60+
"Un día o jamás",
61+
"¿Y cuándo volverás?",
62+
"Surtout ne m'attends pas",
63+
"¿Cuando volverás?",
64+
"J'ai fait mes mille pas",
65+
"¿Cuando volverás?",
66+
"Un día o jamás",
67+
NULL
68+
};
69+
70+
int main() {
71+
72+
int i = 0;
73+
74+
while (lyrics[i]) {
75+
printf("%s\n", lyrics[i]);
76+
sleep(i);
77+
78+
i++;
79+
}
80+
81+
return 0;
82+
83+
}

1 - Introducere/Rezolvări/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
## Rezolvare
88

9-
Vezi fișierul `strings.py`. Odată rulat cu comanda, va afișa *flag*-ul. Comportamentul lui este asemănător utilitarului `strings`, ce putea fi utilizat aici astfel: `strings executable -n 15 | wc -l`.
9+
Vezi fișierul [`strings.py`](strings.py). Odată rulat cu comanda, va afișa *flag*-ul. Comportamentul lui este asemănător utilitarului `strings`, ce putea fi utilizat aici astfel: `strings lyrics.elf -n 15 | wc -l`.
1010

1111
# 2 - Tipuri de Șiruri de Caractere Printabile 💁
1212

@@ -26,7 +26,7 @@ Vezi fișierul `strings.py`. Odată rulat cu comanda, va afișa *flag*-ul. Compo
2626

2727
## Rezolvare
2828

29-
Vezi fișierul `symbols.py`. Odată rulat cu comanda, va afișa *flag*-ul.
29+
Vezi fișierul [`symbols.py`](symbols.py). Odată rulat cu comanda, va afișa *flag*-ul.
3030

3131
# 4 - Proveniența Simbolurilor 💁
3232

@@ -50,13 +50,13 @@ Se observă faptul că executabilul afișează numai acea porțiune din șirul d
5050

5151
Se începe cu primul caracter, testându-se toate posibilitățile. La încercarea la care programul afișează un caracter, atunci îl putem seta ca primul caracter din *flag*-ul construit progresiv și putem trece la următorul până când caracterul `}` (terminatorul de *flag*) apare.
5252

53-
O implementare este oferită în fișierul `flag-checker.py`.
53+
O implementare este oferită în fișierul [`flag-checker.py`](flag-checker.py).
5454

5555
# 6 - Librării Dinamice 💁
5656

57-
Rulând comanda `ldd flag-checker` observăm faptul că executabilul folosește o librărie dinamică numită `libcheckflag.so`.
57+
Rulând comanda `ldd flag-checker.elf` observăm faptul că executabilul folosește o librărie dinamică numită `libcheckflag.so`.
5858

59-
Pentru a identifica modul în care se apelează funcții din ea, rulăm comanda `objdump --disassemble=main -M intel flag-checker`, ce dezasamblează codul funcției `main` (argumentul `--disassemble`) în sintaxa specifică Intel (argumentul `-M`). Astfel, se ajunge la concluzia că libraria este încărcată în memorie prin apelul funcției `dlopen` și funcția din ea, `check_flag`, este referențiată printr-un apel `dlsym`.
59+
Pentru a identifica modul în care se apelează funcții din ea, rulăm comanda `objdump --disassemble=main -M intel flag-checker.elf`, ce dezasamblează codul funcției `main` (argumentul `--disassemble`) în sintaxa specifică Intel (argumentul `-M`). Astfel, se ajunge la concluzia că libraria este încărcată în memorie prin apelul funcției `dlopen` și funcția din ea, `check_flag`, este referențiată printr-un apel `dlsym`.
6060

6161
# 7 - Dezasamblarea Programelor 💁
6262

1 - Introducere/Rezolvări/flag-checker.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1-
#/usr/bin/env python3
1+
#!/usr/bin/env python3
22

33
import string
44

55
from pwnlib.tubes.process import process
6+
from pwn import log, context
67

7-
FILENAME = "../Executabile/flag-checker/flag-checker"
8-
ENVIRONMENT = {'LD_LIBRARY_PATH': '../Executabile/flag-checker'}
8+
FILENAME = "../Exerciții/flag-checker/flag-checker.elf"
9+
ENVIRONMENT = {'LD_LIBRARY_PATH': '../Exerciții/flag-checker'}
910
CHARSET = string.ascii_uppercase + '_{}'
1011
MAX_FLAG_LENGTH = 50
1112
FLAG_END_CHAR = "}"
1213

1314

14-
def main():
15+
def main() -> None:
16+
# Dezactiveaza mesajele de jurnalizare ale pwntools
17+
context.log_level = "error"
18+
1519
current_flag = ""
1620
for iteration in range(MAX_FLAG_LENGTH):
1721
for char in CHARSET:
@@ -26,10 +30,13 @@ def main():
2630
break
2731

2832
if (FLAG_END_CHAR in current_flag):
33+
# Reactiveaza mesajele de jurnalizare ale pwntools
34+
context.log_level = "info"
35+
2936
# Cum programul printeaza si alte caractere care nu sunt de interes,
3037
# printam numai prima linie
3138
current_flag = current_flag.split("\n")[0]
32-
print("[+] Flag-ul este: {}".format(current_flag))
39+
log.success("Flag-ul este {}.".format(current_flag))
3340

3441
break
3542

0 commit comments

Comments
 (0)