In diesem Artikel werden wir die Lösungen von 3 Aufgaben von der Site
pwnable.kr betrachten .
OrganisationsinformationenSpeziell für diejenigen, die etwas Neues lernen und sich in einem der Bereiche Informations- und Computersicherheit entwickeln möchten, werde ich über die folgenden Kategorien schreiben und sprechen:
- PWN;
- Kryptographie (Krypto);
- Netzwerktechnologien (Netzwerk);
- Reverse (Reverse Engineering);
- Steganographie (Stegano);
- Suche und Ausnutzung von WEB-Schwachstellen.
Darüber hinaus werde ich meine Erfahrungen in den Bereichen Computerforensik, Analyse von Malware und Firmware, Angriffe auf drahtlose Netzwerke und lokale Netzwerke, Durchführung von Pentests und Schreiben von Exploits teilen.
Damit Sie sich über neue Artikel, Software und andere Informationen informieren können, habe ich
in Telegram einen
Kanal und eine
Gruppe eingerichtet, um alle Probleme im Bereich ICD
zu diskutieren . Außerdem werde ich Ihre persönlichen Anfragen, Fragen, Vorschläge und Empfehlungen
persönlich prüfen
und alle beantworten .
Alle Informationen werden nur zu Bildungszwecken bereitgestellt. Der Autor dieses Dokuments übernimmt keine Verantwortung für Schäden, die jemandem durch die Verwendung von Kenntnissen und Methoden entstehen, die durch das Studium dieses Dokuments erworben wurden.
Problemlösung coin1
Wir klicken auf das Symbol mit der Signatur coin1 und erhalten die Adresse und den Port für die Verbindung.

Nach dem Verbinden wird uns angeboten, das Spiel zu spielen und die Spielregeln festzulegen. Außerdem haben wir 60 Sekunden Zeit, sodass wir alles automatisieren müssen.

Nach den Spielregeln geben sie uns N Münzen mit einem Gewicht von jeweils 10, bis auf eine - ihr Gewicht beträgt 9. Wir erhalten die Anzahl der Chancen (Runden) C für ein Spiel. Bei jeder Runde senden wir Münzindizes und erhalten auch das Gesamtgewicht. Mit der
binären Suche finden wir also die gewünschte Münze.
Schreiben wir einen Code. Stellen Sie zunächst eine Verbindung zum Server her, akzeptieren und analysieren Sie die Nummern N und C.
from pwn import * r = remote('pwnable.kr', 9007) r.recv() s = r.recv() print(s) n = int(s.split(' ')[0][2:]) c = int(s.split('=')[2].split('\n')[0]) print(n, c)

Großartig. Jetzt werden wir einen Teil schreiben, um eine Ebene zu bestehen. Dazu benötigen wir ein Array von Werten von 1 bis N + 1 und einen Zyklus von C Schritten, bei denen bei jeder Iteration die Hälfte des Arrays gesendet wird. Wenn das in der Antwort zurückgegebene Gewicht ohne Rest durch 10 geteilt wird, befindet sich unsere Münze in einem anderen Teil des Arrays. Also werden wir die andere Hälfte wieder teilen und dasselbe damit machen usw. bis die Münze entdeckt wird.
mas = range(1,n+1) for i in range(c): s = "" if len(mas)==1: mas.append(mas[0]) for j in mas[:len(mas)/2]: s += (str(j)+" ") print(s) r.send(s+"\n") nr = r.recv() print(nr) if int(nr) % 10: mas = mas[:len(mas)/2] else: mas = mas[len(mas)/2:] r.send(str(mas[0])+"\n") print(r.recv())

Fügen Sie nun diese Lösung zur Schleife hinzu, um alle Ebenen abzuschließen.
from pwn import * r = remote('pwnable.kr', 9007) r.recv() for level in range(1, 101): s = r.recvline() n = int(s.split(' ')[0][2:]) c = int(s.split('=')[2].split('\n')[0]) mas = range(1,n+1) for i in range(c): s = "" if len(mas)==1: mas.append(mas[0]) for j in mas[:len(mas)/2]: s += (str(j)+" ") r.send(s+"\n") nr = r.recv() if int(nr) % 10: mas = mas[:len(mas)/2] else: mas = mas[len(mas)/2:] r.send(str(mas[0])+"\n") r.recvline() if level%5==0: print("Check "+str(level)+"/100") print(r.recv())

Wir übergeben die Flagge und bekommen Punkte.
Blackjack Job Lösung
Wir klicken auf das erste Symbol mit der Signatur coin1 und erhalten die Adresse und den Port für die Verbindung. Sie sagen auch, dass Sie eine Million gewinnen müssen.

Nach dem Verbinden wird uns angeboten, ein Spiel zu spielen und nach der Bereitschaft zu fragen.

Gehen Sie nach unserer Antwort zum Menü, starten Sie das Spiel, finden Sie die Regeln heraus oder beenden Sie das Spiel.

Ein neues Spiel starten.

Solche Aufgaben finden sich häufig in CTF und es ist nützlich, sie zu kennen. Höchstwahrscheinlich gibt es keinen Handler für negative Zahlen. Wenn Sie also -999500 eingeben und verlieren, wird eine negative Zahl von unserer Bank abgezogen, dh eine positive Zahl wird addiert (500 - (-500) = 500 + 500 = 1000). Wir führen -1000000 ein.


Wir übergeben die Flagge und bekommen noch einen Punkt.
Lösung für Lottos Suche
Wir klicken auf das erste Symbol mit dem Signaturlotto und es wird uns mitgeteilt, dass wir uns über SSH mit dem Passwort Gast verbinden müssen.

Wenn verbunden, sehen wir das entsprechende Banner.

Lassen Sie uns herausfinden, welche Dateien sich auf dem Server befinden und welche Rechte wir haben.

Lassen Sie uns das Ergebnis des Codes sehen. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> unsigned char submit[6]; void play(){ int i; printf("Submit your 6 lotto bytes : "); fflush(stdout); int r; r = read(0, submit, 6); printf("Lotto Start!\n"); //sleep(1); // generate lotto numbers int fd = open("/dev/urandom", O_RDONLY); if(fd==-1){ printf("error. tell admin\n"); exit(-1); } unsigned char lotto[6]; if(read(fd, lotto, 6) != 6){ printf("error2. tell admin\n"); exit(-1); } for(i=0; i<6; i++){ lotto[i] = (lotto[i] % 45) + 1; // 1 ~ 45 } close(fd); // calculate lotto score int match = 0, j = 0; for(i=0; i<6; i++){ for(j=0; j<6; j++){ if(lotto[i] == submit[j]){ match++; } } } // win! if(match == 6){ system("/bin/cat flag"); } else{ printf("bad luck...\n"); } } void help(){ printf("- nLotto Rule -\n"); printf("nlotto is consisted with 6 random natural numbers less than 46\n"); printf("your goal is to match lotto numbers as many as you can\n"); printf("if you win lottery for *1st place*, you will get reward\n"); printf("for more details, follow the link below\n"); printf("http://www.nlotto.co.kr/counsel.do?method=playerGuide#buying_guide01\n\n"); printf("mathematical chance to win this game is known to be 1/8145060.\n"); } int main(int argc, char* argv[]){ // menu unsigned int menu; while(1){ printf("- Select Menu -\n"); printf("1. Play Lotto\n"); printf("2. Help\n"); printf("3. Exit\n"); scanf("%d", &menu); switch(menu){ case 1: play(); break; case 2: help(); break; case 3: printf("bye\n"); return 0; default: printf("invalid menu\n"); break; } } return 0; }
Die Funktion main () ist nicht interessant. Die play () - Funktion ist von Interesse, nachdem analysiert wurde, welche Logik wir des Programms verstehen werden. Zuerst geben wir 6 Werte ein, dann generiert das Programm pseudozufällig weitere 6 im Bereich (1-45), wonach diese beiden Sequenzen verglichen werden. Wir bekommen eine Flagge mit 6 Streichhölzern. Die Prüfung erfolgt jedoch falsch. Somit wird in einem Zyklus jedes Zeichen der eingegebenen Sequenz mit jedem erzeugten Zeichen verglichen.

Daher geben wir jedes Mal 6 identische Zeichen ein, bis wir die Flagge erhalten. Ich trat ein !!!!!! und bekam 7 Mal die Flagge.

Wir übergeben die Flagge und bekommen zwei Punkte. Wir sehen uns in den folgenden Artikeln!
Wir befinden uns in einem Telegrammkanal: einem
Kanal im Telegramm .