"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
TW-D 2023-10-16 05:37:47 -04:00 committed by GitHub
parent 95aab5627a
commit 6d2463b2e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 327 additions and 0 deletions

View File

@ -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)

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -0,0 +1,5 @@
#off {
background-color: white;
margin-top: 50vh;
display: none;
}

View File

@ -0,0 +1,11 @@
#prompt {
background-color: black;
caret-color: white;
font-size: large;
color: white;
border: none;
}
#prompt:focus {
outline: none;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 645 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 725 KiB

View File

@ -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');

View File

@ -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';
}

View File

@ -0,0 +1,12 @@
async function sleep(ms) {
await new Promise(
function (resolve) {
setTimeout(
function () {
resolve();
},
ms
);
}
);
}

View File

@ -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();
}
}

View File

@ -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);
}
}
};

View File

@ -0,0 +1,8 @@
var level;
level = 0;
var iterator;
iterator = 0;
var response;
response = stage(level, iterator);

View File

@ -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

View File

@ -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>&gt;&nbsp;</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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 KiB