"Mr. Robot" - eXit
You're Elliot, playing the **eXit** adventure game that Whiterose left you on an old computer to put an end to his project *(S4E11)*.pull/391/head
|
@ -0,0 +1,51 @@
|
|||
# "Mr. Robot" - eXit
|
||||
|
||||
- Title: "Mr. Robot" - eXit
|
||||
- Author: TW-D
|
||||
- Version: 1.0
|
||||
- Category: Prank
|
||||
|
||||
## Description
|
||||
|
||||
![banner](./readme_files/banner.jpg)
|
||||
|
||||
You're Elliot, playing the **eXit** adventure game that Whiterose left you
|
||||
on an old computer to put an end to his project *(S4E11)*.
|
||||
|
||||
## Configuration
|
||||
|
||||
In the "payload.txt" file, replace the values of the following constants :
|
||||
|
||||
```
|
||||
|
||||
REM ---
|
||||
REM USB Rubber Ducky label.
|
||||
REM ---
|
||||
DEFINE #RD_LABEL DUCKY
|
||||
|
||||
REM ---
|
||||
REM Enable/Disable hints.
|
||||
REM - TRUE if you don't know the exact answers given by Elliot in both parts.
|
||||
REM - FALSE only if you know the exact answers given by Elliot in both parts.
|
||||
REM ---
|
||||
DEFINE #HINT TRUE
|
||||
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
At the root of the USB Rubber Ducky, copy the "prank_files/" folder.
|
||||
|
||||
## Screenshots
|
||||
|
||||
>
|
||||
> Without hints.
|
||||
>
|
||||
|
||||
![hint-false](./readme_files/hint-false.png)
|
||||
|
||||
>
|
||||
> With hints.
|
||||
>
|
||||
|
||||
![hint-true](./readme_files/hint-true.png)
|
|
@ -0,0 +1,41 @@
|
|||
REM TITLE : "Mr. Robot" - eXit
|
||||
REM AUTHOR : TW-D
|
||||
REM TARGET : Microsoft Edge
|
||||
REM VERSION : 1.0
|
||||
REM CATEGORY : Prank
|
||||
REM REQUIREMENT : DuckyScript 3.0
|
||||
|
||||
ATTACKMODE HID STORAGE
|
||||
DELAY 15000
|
||||
|
||||
REM ---
|
||||
REM USB Rubber Ducky label.
|
||||
REM ---
|
||||
DEFINE #RD_LABEL DUCKY
|
||||
|
||||
REM ---
|
||||
REM Enable/Disable hints.
|
||||
REM - TRUE if you don't know the exact answers given by Elliot in both parts.
|
||||
REM - FALSE only if you know the exact answers given by Elliot in both parts.
|
||||
REM ---
|
||||
DEFINE #HINT TRUE
|
||||
|
||||
SAVE_HOST_KEYBOARD_LOCK_STATE
|
||||
|
||||
IF ( $_CAPSLOCK_ON ) THEN
|
||||
CAPSLOCK
|
||||
DELAY 500
|
||||
END_IF
|
||||
|
||||
IF ( $_NUMLOCK_ON == FALSE ) THEN
|
||||
NUMLOCK
|
||||
DELAY 500
|
||||
END_IF
|
||||
|
||||
GUI r
|
||||
DELAY 1500
|
||||
STRINGLN CMD /K "MODE CON:COLS=18 LINES=1 && FOR /F %d IN ('WMIC Volume GET DriveLetter^, Label^|FINDSTR "#RD_LABEL"') DO @SET RD_LABEL=%d"
|
||||
DELAY 2000
|
||||
STRINGLN START MSEDGE --app="file:///%RD_LABEL%/prank_files/index.html?hint=#HINT" --kiosk --kiosk-idle-timeout-minutes=0 --edge-kiosk-type=fullscreen --disable-features=Translate --no-first-run
|
||||
|
||||
RESTORE_HOST_KEYBOARD_LOCK_STATE
|
|
@ -0,0 +1,10 @@
|
|||
#banner {
|
||||
background-position-x: center;
|
||||
background-position-y: center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
min-width: 100vw;
|
||||
max-width: 100vw;
|
||||
min-height: 50vh;
|
||||
max-height: 50vh;
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
html,
|
||||
body {
|
||||
background-color: black;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
main {
|
||||
font-family: monospace;
|
||||
font-size: xx-large;
|
||||
margin-top: 10vh;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.issue,
|
||||
.prompt {
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
@keyframes alert {
|
||||
50% {
|
||||
border-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
#issue {
|
||||
animation-iteration-count: infinite;
|
||||
animation-duration: 2s;
|
||||
animation-name: alert;
|
||||
border-width: 0.5vw;
|
||||
border-color: red;
|
||||
border-style: ridge;
|
||||
padding: 2vh;
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
#off {
|
||||
background-color: white;
|
||||
margin-top: 50vh;
|
||||
display: none;
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#prompt {
|
||||
background-color: black;
|
||||
caret-color: white;
|
||||
font-size: large;
|
||||
color: white;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#prompt:focus {
|
||||
outline: none;
|
||||
}
|
After Width: | Height: | Size: 645 KiB |
After Width: | Height: | Size: 512 KiB |
After Width: | Height: | Size: 398 KiB |
After Width: | Height: | Size: 427 KiB |
After Width: | Height: | Size: 337 KiB |
After Width: | Height: | Size: 484 KiB |
After Width: | Height: | Size: 787 KiB |
After Width: | Height: | Size: 725 KiB |
|
@ -0,0 +1,73 @@
|
|||
const SCREEN = document.querySelector('#screen');
|
||||
|
||||
const BANNER = document.querySelector('#banner');
|
||||
|
||||
const ISSUE = document.querySelector('#issue');
|
||||
|
||||
const HINT = (new URLSearchParams(document.location.search).get('hint'));
|
||||
|
||||
const PROMPT = document.querySelector('#prompt');
|
||||
|
||||
const LEVELS = [
|
||||
[
|
||||
{
|
||||
"banner": "./assets/images/barrel.png",
|
||||
"issue": "You're trapped in a dungeon with your friend. <br /> You see a barrel. What do you do ?",
|
||||
"response": "Move the barrel"
|
||||
},
|
||||
{
|
||||
"banner": "./assets/images/tunnel.png",
|
||||
"issue": "The barrel rolls aside and you find a secret tunnel. <br /> What do you do ?",
|
||||
"response": "Enter tunnel"
|
||||
},
|
||||
{
|
||||
"banner": "./assets/images/friend.png",
|
||||
"issue": "You start to escape but your friend is too weak to <br /> go with you. They hand you a note. What do you do ?",
|
||||
"response": "Read note"
|
||||
},
|
||||
{
|
||||
"banner": "./assets/images/note.png",
|
||||
"issue": "It is too dark to read the note. <br /> What do you do ?",
|
||||
"response": "Leave"
|
||||
},
|
||||
{
|
||||
"banner": "./assets/images/crawl.png",
|
||||
"issue": "You crawl through the tunnel and the tunnel leads <br /> you to a beach. What do you do ?",
|
||||
"response": "Look"
|
||||
},
|
||||
{
|
||||
"banner": "./assets/images/boat.png",
|
||||
"issue": "In the water you see a boat. <br /> What do you do ?",
|
||||
"response": "Get on the boat"
|
||||
},
|
||||
{
|
||||
"banner": "./assets/images/world.png",
|
||||
"issue": "Congratulations, you're heading to a new world ! <br /> Do you want to play again ?",
|
||||
"response": "Yes"
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"banner": "./assets/images/barrel.png",
|
||||
"issue": "You're trapped in a dungeon with your friend. <br /> You see a barrel. What do you do ?",
|
||||
"response": "Sit down next to my friend"
|
||||
},
|
||||
{
|
||||
"banner": "./assets/images/note.png",
|
||||
"issue": "Your friend hands you a note. <br /> What do you do ?",
|
||||
"response": "Light a match"
|
||||
},
|
||||
{
|
||||
"banner": "./assets/images/message.png",
|
||||
"issue": "The note says, \"Don't leave me here\". <br /> Do you leave your friend or stay ?",
|
||||
"response": "Stay"
|
||||
},
|
||||
{
|
||||
"banner": false,
|
||||
"issue": false,
|
||||
"response": false
|
||||
}
|
||||
]
|
||||
];
|
||||
|
||||
const OFF = document.querySelector('#off');
|
|
@ -0,0 +1,9 @@
|
|||
async function off() {
|
||||
SCREEN.style.display = 'none';
|
||||
OFF.style.display = 'block';
|
||||
for (let reducer = 100; reducer >= 0; reducer -= 10) {
|
||||
OFF.style.width = `${reducer}%`;
|
||||
await sleep(25);
|
||||
}
|
||||
OFF.style.display = 'none';
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
async function sleep(ms) {
|
||||
await new Promise(
|
||||
function (resolve) {
|
||||
setTimeout(
|
||||
function () {
|
||||
resolve();
|
||||
},
|
||||
ms
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
function stage(level, iterator) {
|
||||
let stage;
|
||||
stage = LEVELS[level][iterator];
|
||||
if (stage.banner && stage.issue && stage.response) {
|
||||
BANNER.style.backgroundImage = `url("${stage.banner}")`;
|
||||
ISSUE.innerHTML = stage.issue;
|
||||
let response;
|
||||
response = stage.response;
|
||||
PROMPT.placeholder = (HINT === 'TRUE') ? response : `${response.charAt(0)}...`;
|
||||
PROMPT.value = null;
|
||||
return response;
|
||||
} else {
|
||||
off();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
PROMPT.onkeypress = function (event) {
|
||||
if (
|
||||
(event.key === 'Enter') &&
|
||||
(level < LEVELS.length) &&
|
||||
(PROMPT.value === response)
|
||||
) {
|
||||
iterator++;
|
||||
if (iterator === LEVELS[level].length) {
|
||||
level++;
|
||||
iterator = 0;
|
||||
response = stage(level, iterator);
|
||||
ISSUE.style.animationDuration = '1s';
|
||||
} else {
|
||||
response = stage(level, iterator);
|
||||
}
|
||||
}
|
||||
};
|
|
@ -0,0 +1,8 @@
|
|||
var level;
|
||||
level = 0;
|
||||
|
||||
var iterator;
|
||||
iterator = 0;
|
||||
|
||||
var response;
|
||||
response = stage(level, iterator);
|
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
|
||||
<path d="M64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zm64 64v64h64V96h64v64h64V96h64v64H320v64h64v64H320v64h64v64H320V352H256v64H192V352H128v64H64V352h64V288H64V224h64V160H64V96h64zm64 128h64V160H192v64zm0 64V224H128v64h64zm64 0H192v64h64V288zm0 0h64V224H256v64z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 398 B |
|
@ -0,0 +1,37 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link rel="icon" type="image/svg+xml" href="./favicon.svg" />
|
||||
<link rel="stylesheet" type="text/css" href="./assets/css/global.css?v=1.0.0" />
|
||||
<link rel="stylesheet" type="text/css" href="./assets/css/banner.css?v=1.0.0" />
|
||||
<link rel="stylesheet" type="text/css" href="./assets/css/issue.css?v=1.0.0" />
|
||||
<link rel="stylesheet" type="text/css" href="./assets/css/prompt.css?v=1.0.0" />
|
||||
<link rel="stylesheet" type="text/css" href="./assets/css/off.css?v=1.0.0" />
|
||||
<title>eXit</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<main id="screen">
|
||||
<div id="banner"></div>
|
||||
<div class="issue">
|
||||
<p id="issue"></p>
|
||||
</div>
|
||||
<div class="prompt">
|
||||
<span>> </span>
|
||||
<input type="text" id="prompt" autofocus="true" />
|
||||
</div>
|
||||
</main>
|
||||
<hr id="off" size="10" />
|
||||
<script type="text/javascript" src="./assets/js/constants.js?v=1.0.0"></script>
|
||||
<script type="text/javascript" src="./assets/js/functions/sleep.js?v=1.0.0"></script>
|
||||
<script type="text/javascript" src="./assets/js/functions/off.js?v=1.0.0"></script>
|
||||
<script type="text/javascript" src="./assets/js/functions/stage.js?v=1.0.0"></script>
|
||||
<script type="text/javascript" src="./assets/js/variables.js?v=1.0.0"></script>
|
||||
<script type="text/javascript" src="./assets/js/main.js?v=1.0.0"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 657 KiB |
After Width: | Height: | Size: 659 KiB |