Komutumun sonunda bu '&' komut dosyasını nasıl hızlı hale getirdi?


18

Bazı CTF zorluklarını çevrimiçi olarak çözerken, bir sunucuyu kaba kuvvetlendirmem gereken bir durumla karşılaştım. Bu yazdığım kod:

#!/bin/bash

for i in {0..9}{0..9}{0..9}{0..9} 
    do
    echo "Now trying code.."
    echo $i
    echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt
    done

Bu inanılmaz derecede acı vericiydi . 1000'den 9999'a kadar kombinasyonları denemem gerekiyordu ve bu her 10 deneme için yaklaşık 5 saniye sürdü. Sonra, bir tavsiyenin ardından, bu satırın sonuna bir '&' koydum:

   echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt &

Ve saniyeler içinde 100'lü kombinasyon denedi. Çok şaşırmıştım. Birisi bana mantığı açıklayabilir mi? '&' Ne yaptı?


3
Kabuk kılavuzunuzu okumanızı tavsiye ederim. &komutun arka planda çalışmasını sağlar, hepsi bu. Daha hızlı ya da hiçbir şey yapmadı. Kullandığınız kabukları okuyun (sanırım bash) kılavuzu.
polemon

Arka planda çalışmasını sağladı, aslında bitmiş olduğuna bakmalısınız.
DisplayName

7
1000'in altında test etmek istemiyor musunuz? Lütfen kullanınfor i in {1000..9999}
Walter A

2
Bağlantı noktaları artık paralel olarak zaman aşımına uğradığından komut dosyasının daha hızlı çalışmasını sağladı. waitYine de sonuna bir a eklemelisiniz .
Bratchley

Baktın mı nc -z localhost 1000-2000?
Walter A

Yanıtlar:


30

Ekleme &bir arka plan işlemi doğurur.

Eğer yazarsanız a; b, komutu çalıştırır a, bitmesini bekler, sonra komutu bsırayla çalıştırır .

Eğer yazarsanız a & b, abir arka plan işlemi olarak ortaya çıkacaktır . Bitmesini beklemeyecek ve bhemen çalışmaya başlayacaktır . Her ikisini birden çalıştırır.

Kabukta deney yaparak ne yaptığını görebilirsiniz. Eğer varsa Xyüklü, xtermne olacağını görmek için iyi bir yoldur: yazarak

$ xterm

başka bir terminal penceresinin açılmasına neden olur ve ilk pencere siz kapatana kadar bekler. Sadece kapattığınızda kabuğunuzu geri alacaksınız. Yazarsanız

$ xterm &

daha sonra arka planda çalışacak ve xtermpencere de açık kalacakken kabuğunuzu hemen geri alacaksınız .

Yani eğer yazarsan

echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt

bağlantıyı yapar, dizeyi gönderir, dosyada çıkanları depolar ve ancak daha sonra bir sonrakine geçer.

Eklemek &onu bekletmez. Sonuçta on bini birden aşağı yukarı aynı anda çalıştırır.

Senaryonuz daha çabuk bitiyor gibi görünüyor, çünkü muhtemelen o zaman bitmemişti. Sadece on bin arkaplan işi yaptı ve ön plandaki işi bitirdi.

Bu aynı zamanda, sizin durumunuzda, bir kerede on bin bağlantı açmaya çalışacağı anlamına gelir . Diğer ucun ne işleyebileceğine bağlı olarak, bazıları iyi başarısız olabilir. Sadece bu değil, aynı zamanda sırayla çalışacaklarına dair bir garanti yoktur, aslında neredeyse kesinlikle olmayacaklardır, bu yüzden sonuçta /tmp/me/dump.txtkimsenin tahmin etmesi gerekir .

Çıktının doğru olup olmadığını kontrol ettiniz mi?


2
Evet, meydan okumayı çözdüm. Sunucu, ona doğru kod sağlandıysa parola ile yanıt verecektir. Bu komutu 'dump.txt' kontrol etmek için yaptım: $ cat dump.txt | sort | uniq -u ..ve doğru şifreyi içeren satır bana açıklandı.
learnerX

16
@intellikid: Kaba olmak istemiyorum, ama çok şanslıydı. Sadece siparişin önemi yoktu, sunucunun cevapları ncyazma tamponundan daha küçüktü . Durum böyle olmasaydı, sunucunun yanıtları büyük olasılıkla serpiştirilmiş olurdu. Yani, 1 baytlık bir yazma tamponuna sahip olsaydınız 1111ve yanıtlar 2222olsaydı ve muhtemelen 11221212düzgün bir şekilde ayrılmış bir şey yerine böyle bir şey görürdünüz 1111 2222.
marinus

Evet, farkettim. Bu yüzden bu savaş oyunlarını oynuyorum. Her seviyede öğreniyorum. Bu öğrenmeye yardımcı olduğunuz için teşekkür ederiz.
learnerX

2

Nc (netcat) komutu pahalı, zaman açısından. Uzak sunucuya bağlanması, veri göndermesi, bir yanıt beklemesi ve geri göndermesi gerekir.

& Komutunu kullanarak temelde bu komutu bir arka plan işleminde çatallıyorsunuz (buna "iş" denir). Kendi başına daha hızlı çalışmasını sağlamaz. Ancak bu, döngünüzün artık engellenmediği ve bir sonraki yinelemeyi (sonraki nc ile) zaten yapabileceği anlamına gelir.

Temel olarak, hızlandırmanız, tüm bu uzak bağlantıların paralel olarak yapılmasından kaynaklanır, aksi takdirde bir öncekinin tamamlanmasını beklemesi gerekir.

Btw, terminalinize bağlı olarak, eko komutları da döngünüzü yavaşlatabilir (bazen yazma arabelleğinde boşluk olana kadar beklemeleri gerekir).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.