Pada artikel ini, kami akan mempertimbangkan solusi 3 tugas dari situs
pwnable.kr .
Informasi OrganisasiTerutama bagi mereka yang ingin mempelajari sesuatu yang baru dan berkembang di bidang informasi dan keamanan komputer, saya akan menulis dan berbicara tentang kategori berikut:
- PWN;
- kriptografi (Crypto);
- teknologi jaringan (Jaringan);
- membalikkan (Reverse Engineering);
- steganografi (Stegano);
- pencarian dan eksploitasi kerentanan WEB.
Selain itu, saya akan membagikan pengalaman saya dalam forensik komputer, analisis malware dan firmware, serangan pada jaringan nirkabel dan jaringan area lokal, melakukan pentest dan menulis eksploitasi.
Agar Anda dapat mengetahui tentang artikel baru, perangkat lunak, dan informasi lainnya, saya membuat
saluran di Telegram dan
grup untuk membahas masalah apa pun di bidang ICD. Juga, saya pribadi akan mempertimbangkan permintaan pribadi Anda, pertanyaan, saran dan rekomendasi
secara pribadi dan akan menjawab semua orang .
Semua informasi disediakan hanya untuk tujuan pendidikan. Penulis dokumen ini tidak bertanggung jawab atas kerusakan yang disebabkan seseorang sebagai akibat dari menggunakan pengetahuan dan metode yang diperoleh sebagai hasil dari mempelajari dokumen ini.
Pemecahan masalah koin1
Kami mengklik ikon dengan coin1 tanda tangan, dan kami diberi alamat dan port untuk koneksi.

Setelah terhubung, kami ditawari untuk bermain game dan memberikan aturan permainan. Dan mereka juga memberi kita waktu 60 detik untuk selesai, jadi kita harus mengotomatiskan semuanya.

Menurut aturan permainan, mereka memberi kami N koin, masing-masing seberat 10, kecuali untuk satu - beratnya adalah 9. Kami diberi jumlah peluang (putaran) C untuk satu pertandingan. Di setiap putaran, kami mengirim indeks koin, dan kami juga diberi bobot total. Dengan demikian, menggunakan
pencarian biner , kita akan menemukan koin yang diinginkan.
Mari kita menulis kode. Untuk memulai, buat koneksi ke server, terima dan parsing angka N dan 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)

Bagus Sekarang kita akan menulis bagian untuk melewati satu level. Untuk melakukan ini, kita membutuhkan array nilai dari 1 hingga N + 1 dan siklus langkah C, pada setiap iterasi yang setengah dari array akan dikirim. Jika bobot yang dikembalikan dalam jawaban dibagi 10 tanpa sisa, maka koin kita ada di bagian lain dari susunan. Jadi, kita akan membagi lagi setengah lainnya dan melakukan hal yang sama dengannya, dll. sampai koin ditemukan.
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())

Sekarang tambahkan solusi ini ke loop untuk menyelesaikan semua level.
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())

Kami menyerahkan bendera dan mendapatkan poin.
Solusi pekerjaan blackjack
Kami klik pada ikon pertama dengan koin tanda tangan1, dan kami diberi alamat dan port untuk koneksi. Mereka juga mengatakan bahwa Anda perlu memenangkan satu juta.

Setelah terhubung, kami ditawari untuk bermain game dan bertanya tentang kesiapan.

Setelah jawaban kami, buka menu, mulai game, cari tahu aturannya atau keluar dari game.

Memulai game baru.

Tugas-tugas semacam itu sering ditemukan dalam KKP dan berguna untuk mengetahuinya. Kemungkinan besar tidak ada penangan angka negatif. Jadi, jika Anda memasukkan -999500 dan kehilangan, maka angka negatif dikurangi dari bank kami, yaitu, angka positif ditambahkan (500 - (-500) = 500 + 500 = 1000). Kami perkenalkan -1000000.


Kami menyerahkan bendera dan mendapatkan satu poin lagi.
Solusi untuk pencarian Lotto
Kami mengklik ikon pertama dengan tanda tangan lotre, dan kami diberitahu bahwa kami perlu terhubung melalui SSH dengan tamu kata sandi.

Saat terhubung, kami melihat spanduk yang sesuai.

Mari cari tahu file apa yang ada di server, serta hak apa yang kita miliki.

Mari kita lihat hasil kodenya. #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; }
Tidak ada yang menarik di fungsi main (). Fungsi play () menarik, setelah menganalisis yang mana kita akan memahami logika program. Pertama kita memasukkan 6 nilai, kemudian program pseudo-acak menghasilkan 6 lainnya dalam kisaran (1-45), setelah itu kedua urutan ini dibandingkan. Kami mendapatkan bendera dengan 6 pertandingan. Tetapi pemeriksaan dilakukan dengan tidak benar. Jadi, dalam suatu siklus, setiap karakter dari urutan yang dimasukkan dibandingkan dengan setiap karakter yang dihasilkan.

Dengan demikian, kita akan memasukkan 6 karakter identik setiap kali sampai kita mendapatkan benderanya. Saya masuk !!!!!!, dan mendapat bendera 7 kali.

Kami menyerahkan bendera dan mendapatkan dua poin. Sampai jumpa di artikel berikut!
Kami berada di saluran telegram:
saluran di Telegram .