noorqureshi/security-skills/exploit-pwn-chain
Claude Code and agent skill by noorqureshi/security-skills
- community
Checking that the SKILL.md file is still in the repository.
Engineer a reliable exploit from a known memory-corruption bug — stack, heap, or kernel — taking a local crash to a stable remote exploit: ret2libc/ret2csu/one_gadget, tcache/fastbin/unsorted-bin techniques matched to the glibc version, kernel pwn against SMEP/SMAP/KASLR/KPTI, and remote stabilization (libc fingerprinting, stack alignment, recvuntil anchoring, spray sizing). Load when you have binary + bug + target environment and "local works, remote crashes". Signals: pwn, ROP, ret2libc, one_gadget, tcache, heap spray, kROP, modprobe_path, pwntools, checksec output.
Install
npx vskill@latest install noorqureshi/security-skills/exploit-pwn-chainSKILL.md
Pwn chain: bug to working exploit
When it applies
You already know where it crashes — reverse-eng-binary-triage or exploit-memory-corruption found the overflow/UAF/double-free — and now you must produce a stable exploit against the real remote target, not a script that only works on your laptop. Covers userspace stack pwn, glibc heap exploitation, and Linux kernel/driver pwn (e.g. an ioctl bug for privesc). Pentest-only; note the crash risk in the RoE (tradecraft-scope-roe).
Why it works
A local win and a remote win differ by engineering, not by the bug: the remote libc version, ASLR slide, stack alignment, network buffering, and heap layout all shift. The chain is always the same — model the protections, leak what randomization hides, build the primitive (ROP/poisoned bin/sprayed object), then iterate against the real environment until the success rate is measured, not assumed.
Method
**Stack / heap / kernel technique reference (templates, glibc version table, spray objects,privesc paths):** see `cheatsheet.md` next to this file.
- Classify bug + protections.
checksec ./vuln(NX / canary / PIE / RELRO / FORTIFY) decides
the whole strategy. Bug class: stack overflow / format string / heap (UAF, double-free, overflow) / integer / race / kernel.
- Pick the strategy. NX off + no ASLR → shellcode. NX + libc provided → ret2libc / one_gadget.
NX + no libc → leak, then libc-database lookup. Heap → technique per glibc version (tcache / fastbin / unsorted / large bin). Kernel → commit_creds ROP, modprobe_path, or core_pattern.
- Stage libc + gadgets.
./find puts 0x6f0in libc-database; `ROPgadget --binary ./libc.so.6
--only "pop|ret"; one_gadget ./libc.so.6; base = leaked - libc.sym['puts']. Run the target under the exact remote libc locally: patchelf --set-interpreter ./ld-linux-x86-64.so.2 --set-rpath . ./vuln`.
- Write the pwntools skeleton.
context.binary = ELF('./vuln'); iterate with
process() / gdb.debug('./vuln', 'b *main+xx'); cyclic() / cyclic_find() for the offset; finish at p.interactive().
- Make it work locally — attach, watch registers, tune offsets with pwndbg/GEF
(vmmap, heap, bins, telescope), then switch to remote().
- Stabilize remotely. Never guess libc offsets — leak and reverse-lookup. Fix
movapsstack
alignment with an extra ret gadget. Anchor reads with recvuntil(b'exact marker'), never sleep; prefer sendlineafter over sendline. For heap sprays, oversize the spray and leave padding chunks against consolidation. Then loop the exploit (while True) until it succeeds ≥ 95% over 20+ remote runs.
Gotchas
- "Local works, remote segfaults in `system`" — almost always 16-byte stack misalignment
(movaps xmm0, [rsp]); add one ret gadget. Second cause: wrong libc version — leak first.
- Heap techniques are glibc-version-locked — tcache appeared in 2.27, safe-linking in 2.32,
hooks removed in 2.34. Same binary + different libc = completely different exploit path. Check with ./libc.so.6 | head -1.
- Kernel pwn: confirm CPU flags first —
+smep +smap +pkuin the qemu line (or the real
kernel's config) dictates the ROP chain; KPTI forces the swapgs_restore_regs_and_return_to_usermode trampoline for the return to userland.
- One KASLR leak is enough — compute everything as offsets from it; repeated leaking just adds
failure surface.
- canary on forking servers — child processes share the canary; brute-force it byte by byte
(1/256 per byte).
- Static binaries have no GOT — use SROP or raw syscalls instead of ret2libc.
Verify success
The exploit runs end-to-end against the real remote target ≥ 95% of the time across 20+ consecutive runs, from the same pwntools script, with the libc identified by leak — not assumed. A shell (or root shell, for kernel pwn) that survives reconnection is the proof.
References
pwntools docs; GEF (bata24 fork for kernel structs) / pwndbg; ROPgadget / ropper; one_gadget; libc-database. Find the bug with reverse-eng-binary-triage; userspace basics in exploit-memory-corruption; post-exploitation via exploit-chaining and payloads-reverse-shells.
_Portions adapted from reverse-skill by zhaoxuya520, MIT License._
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/exploit-dev/exploit-pwn-chain/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/noorqureshi/security-skills/exploit-pwn-chain)