Pada artikel ini, kami akan menganalisis solusi tugas multi-level menggunakan
pwntools library.
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.
Masukan solusi pekerjaan
Kami mengklik ikon dengan input tanda tangan, 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.
ls -l

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.

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.

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

Kami melewati level pertama. Lihatlah yang kedua.

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.

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

Kami melanjutkan ke keputusan tingkat ketiga.

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

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

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.


Level terakhir tetap ada. Mari kita mulai.

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


Itu saja, dapatkan poin Anda.

Sampai jumpa di artikel berikut!
Kami berada di saluran telegram:
saluran di Telegram .