Pemecahan masalah dengan pwnable.kr 11-coin1, 12-blackjack, 13-lotto. Kesalahan dalam logika aplikasi

gambar

Pada artikel ini, kami akan mempertimbangkan solusi 3 tugas dari situs pwnable.kr .

Informasi Organisasi
Terutama 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.

gambar

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.

gambar

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) 

gambar

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()) 

gambar

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()) 

gambar

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.

gambar

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

gambar

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

gambar

Memulai game baru.

gambar

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.

gambar

gambar

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.

gambar

Saat terhubung, kami melihat spanduk yang sesuai.

gambar

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

gambar

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.

gambar

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

gambar

Kami menyerahkan bendera dan mendapatkan dua poin. Sampai jumpa di artikel berikut!

Kami berada di saluran telegram: saluran di Telegram .

Source: https://habr.com/ru/post/id461641/


All Articles