Solusi tugas dengan pwnable.kr 07 - input. Memahami pwntools

gambar

Pada artikel ini, kami akan menganalisis solusi tugas multi-level menggunakan pwntools library.

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.

Masukan solusi pekerjaan


Kami mengklik ikon dengan input tanda tangan, 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.

ls -l 

gambar

Dengan demikian, kita dapat membaca kode sumber program, karena ada hak untuk membaca untuk semua orang, dan menjalankan program input (set bit-sticky) dengan hak-hak pemilik. Mari kita lihat hasil kodenya.

Kode Sumber input.c
 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); printf("Let's see if you know how to give input to program\n"); printf("Just give me correct inputs then you will get the flag :)\n"); // argv if(argc != 100) return 0; if(strcmp(argv['A'],"\x00")) return 0; if(strcmp(argv['B'],"\x20\x0a\x0d")) return 0; printf("Stage 1 clear!\n"); // stdio char buf[4]; read(0, buf, 4); if(memcmp(buf, "\x00\x0a\x00\xff", 4)) return 0; read(2, buf, 4); if(memcmp(buf, "\x00\x0a\x02\xff", 4)) return 0; printf("Stage 2 clear!\n"); // env if(strcmp("\xca\xfe\xba\xbe", getenv("\xde\xad\xbe\xef"))) return 0; printf("Stage 3 clear!\n"); // file FILE* fp = fopen("\x0a", "r"); if(!fp) return 0; if( fread(buf, 4, 1, fp)!=1 ) return 0; if( memcmp(buf, "\x00\x00\x00\x00", 4) ) return 0; fclose(fp); printf("Stage 4 clear!\n"); // network int sd, cd; struct sockaddr_in saddr, caddr; sd = socket(AF_INET, SOCK_STREAM, 0); if(sd == -1){ printf("socket error, tell admin\n"); return 0; } saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = INADDR_ANY; saddr.sin_port = htons( atoi(argv['C']) ); if(bind(sd, (struct sockaddr*)&saddr, sizeof(saddr)) < 0){ printf("bind error, use another port\n"); return 1; } listen(sd, 1); int c = sizeof(struct sockaddr_in); cd = accept(sd, (struct sockaddr *)&caddr, (socklen_t*)&c); if(cd < 0){ printf("accept error, tell admin\n"); return 0; } if( recv(cd, buf, 4, 0) != 4 ) return 0; if(memcmp(buf, "\xde\xad\xbe\xef", 4)) return 0; printf("Stage 5 clear!\n"); // here's your flag system("/bin/cat flag"); return 0; } 


Dari kode itu kita perlu melewati lima level. Kami akan membawanya pada gilirannya.

gambar

Pada tingkat pertama, diperiksa bahwa jumlah argumen program adalah 100. Dalam hal ini, elemen ke-65 harus berupa string "\ x00", dan elemen ke-66 harus "\ x20 \ x0a \ x0d". Buat direktori Anda sendiri di direktori / tmp / dan buat skrip Python di sana.

gambar

Untuk menyelesaikan level pertama, kita akan membuat larik seratus baris 'A'. Dan berikan argumen yang diperlukan untuk nilai yang diinginkan. Kita dapat memulai proses dengan argumen ini sebagai berikut:

 from pwn import * a = ['A']*100 a[0] = '/home/input2/input' a[ord('A')] = '\x00' a[ord('B')] = '\x20\x0a\x0d' ex = process(argv=a) ex.interactive() 

gambar

Kami melewati level pertama. Lihatlah yang kedua.

gambar

Pada level ini, dua baris dibaca, satu dari stdin input standar, dan lainnya dari stderr. Kita perlu membuat dua file yang akan berisi baris-baris ini.

gambar

Buka stream ke file-file ini dan tentukan deskriptor untuk streaming satu file sebagai deskriptor stdin, dan file lain sebagai deskriptor stderr.

 from pwn import * a = ['A']*100 a[0] = '/home/input2/input' a[ord('A')] = '\x00' a[ord('B')] = '\x20\x0a\x0d' fin = open('/tmp/ex/in.txt', 'r') ferr = open('/tmp/ex/err.txt', 'r') ex = process(argv=a, stdin=fin, stderr=ferr) fin.close() ferr.close() ex.interactive() 

gambar

Kami melanjutkan ke keputusan tingkat ketiga.

gambar

Fungsi getenv () mengembalikan nilai variabel lingkungan, yang harus sama dengan nilai referensi. Jadi, Anda perlu membuat variabel lingkungan dengan nilai tertentu.

 from pwn import * a = ['A']*100 a[0] = '/home/input2/input' a[ord('A')] = '\x00' a[ord('B')] = '\x20\x0a\x0d' fin = open('/tmp/ex/in.txt', 'r') ferr = open('/tmp/ex/err.txt', 'r') e={'\xde\xad\xbe\xef':'\xca\xfe\xba\xbe'} ex = process(argv=a, stdin=fin, stderr=ferr, env=e) fin.close() ferr.close() ex.interactive() 

gambar

Kami mengelola variabel lingkungan, sekarang mari kita mulai dari tingkat keempat.

gambar

Menurut kode, kita dapat mengatakan bahwa program membuka file dengan nama "\ x0a" dan membaca 4 karakter dari itu, setelah itu membandingkannya dengan byte "\ x00". Karena karakter itu sendiri dan nama file terdiri dari karakter yang tidak dapat dicetak, kami menggunakan python.

gambar

gambar

Level terakhir tetap ada. Mari kita mulai.

gambar

Program membuka soket pada port yang ditentukan dalam argumen ke-66. Kemudian ia menerima 4 byte melalui jaringan dan membandingkannya dengan string referensi. Kita perlu menambahkan argumen lain ke program - nomor port, membangun koneksi dan mengirim 4 byte yang diperlukan.

 from pwn import * a = ['A']*100 a[0] = '/home/input2/input' a[ord('A')] = '\x00' a[ord('B')] = '\x20\x0a\x0d' a[ord('C')] = '1234' fin = open('/tmp/ex/in.txt', 'r') ferr = open('/tmp/ex/err.txt', 'r') e={'\xde\xad\xbe\xef':'\xca\xfe\xba\xbe'} ex = process(argv=a, stdin=fin, stderr=ferr, env=e) fin.close() ferr.close() ex.interactive() 

gambar

gambar

Itu saja, dapatkan poin Anda.

gambar

Sampai jumpa di artikel berikut!

Kami berada di saluran telegram: saluran di Telegram .

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


All Articles