From 116892ebdac254edf8d1a26bceb5f5844007e189 Mon Sep 17 00:00:00 2001 From: RPISEC Date: Sat, 20 Jun 2015 16:09:01 -0400 Subject: [PATCH] Initial commit --- ACKNOWLEDGEMENTS | 15 + CMakeLists.txt | 36 ++ INSTALL | 7 + LICENSE | 22 + README.md | 289 +++++++++++ external_tools.sh | 103 ++++ include/utils.h | 59 +++ resources/images/cc-by-nc.png | Bin 0 -> 5145 bytes resources/images/final.png | Bin 0 -> 14938 bytes resources/images/ip_addr.png | Bin 0 -> 6696 bytes resources/images/mbe.jpg | Bin 0 -> 74058 bytes resources/images/vmware.png | Bin 0 -> 134272 bytes resources/images/warzone.png | Bin 0 -> 7153 bytes setup_wargame.sh | 457 ++++++++++++++++++ src/CMakeLists.txt | 8 + src/lab01/CMakeLists.txt | 13 + src/lab01/README.md | 16 + src/lab01/lab1A.c | 86 ++++ src/lab01/lab1B.c | 121 +++++ src/lab01/lab1C.c | 31 ++ src/lab02/CMakeLists.txt | 15 + src/lab02/lab2A.c | 59 +++ src/lab02/lab2B.c | 35 ++ src/lab02/lab2C.c | 38 ++ src/lab03/CMakeLists.txt | 16 + src/lab03/lab3A.c | 106 ++++ src/lab03/lab3B.c | 60 +++ src/lab03/lab3C.c | 49 ++ src/lab04/CMakeLists.txt | 16 + src/lab04/lab4A.c | 74 +++ src/lab04/lab4B.c | 27 ++ src/lab04/lab4C.c | 66 +++ src/lab05/CMakeLists.txt | 16 + src/lab05/lab5A.c | 107 ++++ src/lab05/lab5B.c | 15 + src/lab05/lab5C.c | 26 + src/lab06/CMakeLists.txt | 15 + src/lab06/lab6A.c | 123 +++++ src/lab06/lab6B.c | 191 ++++++++ src/lab06/lab6B.readme | 8 + src/lab06/lab6C.c | 94 ++++ src/lab07/CMakeLists.txt | 12 + src/lab07/lab7A.c | 273 +++++++++++ src/lab07/lab7A.readme | 3 + src/lab07/lab7C.c | 185 +++++++ src/lab08/CMakeLists.txt | 15 + src/lab08/lab8A.c | 104 ++++ src/lab08/lab8A.readme | 3 + src/lab08/lab8B.c | 251 ++++++++++ src/lab08/lab8C.c | 132 +++++ src/lab09/CMakeLists.txt | 12 + src/lab09/lab9A.cpp | 199 ++++++++ src/lab09/lab9A.readme | 1 + src/lab09/lab9C.cpp | 91 ++++ src/lab09/lab9C.readme | 1 + src/lab10/CMakeLists.txt | 10 + src/lab10/README | 10 + src/lab10/lab10A.c | 355 ++++++++++++++ src/lab10/lab10C.c | 127 +++++ src/lecture/CMakeLists.txt | 10 + src/lecture/aslr/CMakeLists.txt | 15 + src/lecture/aslr/aslr2.c | 25 + src/lecture/aslr/aslr_leak1.c | 29 ++ src/lecture/aslr/aslr_leak2.c | 23 + src/lecture/cpp/CMakeLists.txt | 12 + src/lecture/cpp/cpp_lec01.cpp | 45 ++ src/lecture/cpp/cpp_lec02.cpp | 70 +++ src/lecture/cpp/rect.cpp | 37 ++ src/lecture/format_strings/CMakeLists.txt | 11 + src/lecture/format_strings/fmt_lec01.c | 17 + src/lecture/format_strings/fmt_lec02.c | 29 ++ src/lecture/format_strings/fmt_lec03.c | 29 ++ src/lecture/format_strings/fmt_lec04.c | 15 + src/lecture/heap/CMakeLists.txt | 15 + src/lecture/heap/heap_chunks.c | 34 ++ src/lecture/heap/heap_smash.c | 49 ++ src/lecture/heap/heap_uaf.c | 149 ++++++ src/lecture/heap/print_frees.c | 53 ++ src/lecture/heap/sizes.c | 27 ++ src/lecture/misc/CMakeLists.txt | 10 + src/lecture/misc/canary.c | 33 ++ src/lecture/misc/heap.c | 50 ++ src/lecture/misc/uninitialized_data.c | 56 +++ src/lecture/misc/uninitialized_data_noaslr.sh | 3 + src/lecture/rop/CMakeLists.txt | 11 + src/lecture/rop/rop_exit.c | 13 + src/lecture/rop/rop_pivot.c | 29 ++ src/lecture/shellcode/CMakeLists.txt | 9 + src/lecture/shellcode/inject.c | 15 + src/project1/CMakeLists.txt | 4 + src/project1/README | 10 + src/project1/tw33tchainz | Bin 0 -> 21095 bytes src/project2/CMakeLists.txt | 4 + src/project2/GENERAL_CROWELL.key | 1 + src/project2/GENERAL_DOOM.key | 1 + src/project2/GENERAL_HOTZ.key | 1 + src/project2/README | 7 + src/project2/rpisec_nuke | Bin 0 -> 56604 bytes 98 files changed, 5154 insertions(+) create mode 100644 ACKNOWLEDGEMENTS create mode 100644 CMakeLists.txt create mode 100644 INSTALL create mode 100644 LICENSE create mode 100644 README.md create mode 100644 external_tools.sh create mode 100644 include/utils.h create mode 100644 resources/images/cc-by-nc.png create mode 100644 resources/images/final.png create mode 100644 resources/images/ip_addr.png create mode 100644 resources/images/mbe.jpg create mode 100644 resources/images/vmware.png create mode 100644 resources/images/warzone.png create mode 100644 setup_wargame.sh create mode 100644 src/CMakeLists.txt create mode 100644 src/lab01/CMakeLists.txt create mode 100644 src/lab01/README.md create mode 100644 src/lab01/lab1A.c create mode 100644 src/lab01/lab1B.c create mode 100644 src/lab01/lab1C.c create mode 100644 src/lab02/CMakeLists.txt create mode 100644 src/lab02/lab2A.c create mode 100644 src/lab02/lab2B.c create mode 100644 src/lab02/lab2C.c create mode 100644 src/lab03/CMakeLists.txt create mode 100644 src/lab03/lab3A.c create mode 100644 src/lab03/lab3B.c create mode 100644 src/lab03/lab3C.c create mode 100644 src/lab04/CMakeLists.txt create mode 100644 src/lab04/lab4A.c create mode 100644 src/lab04/lab4B.c create mode 100644 src/lab04/lab4C.c create mode 100644 src/lab05/CMakeLists.txt create mode 100644 src/lab05/lab5A.c create mode 100644 src/lab05/lab5B.c create mode 100644 src/lab05/lab5C.c create mode 100644 src/lab06/CMakeLists.txt create mode 100644 src/lab06/lab6A.c create mode 100644 src/lab06/lab6B.c create mode 100644 src/lab06/lab6B.readme create mode 100644 src/lab06/lab6C.c create mode 100644 src/lab07/CMakeLists.txt create mode 100644 src/lab07/lab7A.c create mode 100644 src/lab07/lab7A.readme create mode 100644 src/lab07/lab7C.c create mode 100644 src/lab08/CMakeLists.txt create mode 100644 src/lab08/lab8A.c create mode 100644 src/lab08/lab8A.readme create mode 100644 src/lab08/lab8B.c create mode 100644 src/lab08/lab8C.c create mode 100644 src/lab09/CMakeLists.txt create mode 100644 src/lab09/lab9A.cpp create mode 100644 src/lab09/lab9A.readme create mode 100644 src/lab09/lab9C.cpp create mode 100644 src/lab09/lab9C.readme create mode 100644 src/lab10/CMakeLists.txt create mode 100644 src/lab10/README create mode 100644 src/lab10/lab10A.c create mode 100644 src/lab10/lab10C.c create mode 100644 src/lecture/CMakeLists.txt create mode 100644 src/lecture/aslr/CMakeLists.txt create mode 100644 src/lecture/aslr/aslr2.c create mode 100644 src/lecture/aslr/aslr_leak1.c create mode 100644 src/lecture/aslr/aslr_leak2.c create mode 100644 src/lecture/cpp/CMakeLists.txt create mode 100644 src/lecture/cpp/cpp_lec01.cpp create mode 100644 src/lecture/cpp/cpp_lec02.cpp create mode 100644 src/lecture/cpp/rect.cpp create mode 100644 src/lecture/format_strings/CMakeLists.txt create mode 100644 src/lecture/format_strings/fmt_lec01.c create mode 100644 src/lecture/format_strings/fmt_lec02.c create mode 100644 src/lecture/format_strings/fmt_lec03.c create mode 100644 src/lecture/format_strings/fmt_lec04.c create mode 100644 src/lecture/heap/CMakeLists.txt create mode 100644 src/lecture/heap/heap_chunks.c create mode 100644 src/lecture/heap/heap_smash.c create mode 100644 src/lecture/heap/heap_uaf.c create mode 100644 src/lecture/heap/print_frees.c create mode 100644 src/lecture/heap/sizes.c create mode 100644 src/lecture/misc/CMakeLists.txt create mode 100644 src/lecture/misc/canary.c create mode 100644 src/lecture/misc/heap.c create mode 100644 src/lecture/misc/uninitialized_data.c create mode 100755 src/lecture/misc/uninitialized_data_noaslr.sh create mode 100644 src/lecture/rop/CMakeLists.txt create mode 100644 src/lecture/rop/rop_exit.c create mode 100644 src/lecture/rop/rop_pivot.c create mode 100644 src/lecture/shellcode/CMakeLists.txt create mode 100644 src/lecture/shellcode/inject.c create mode 100644 src/project1/CMakeLists.txt create mode 100644 src/project1/README create mode 100755 src/project1/tw33tchainz create mode 100644 src/project2/CMakeLists.txt create mode 100644 src/project2/GENERAL_CROWELL.key create mode 100644 src/project2/GENERAL_DOOM.key create mode 100644 src/project2/GENERAL_HOTZ.key create mode 100644 src/project2/README create mode 100755 src/project2/rpisec_nuke diff --git a/ACKNOWLEDGEMENTS b/ACKNOWLEDGEMENTS new file mode 100644 index 0000000..d17122e --- /dev/null +++ b/ACKNOWLEDGEMENTS @@ -0,0 +1,15 @@ +ACKNOWLEDGMENTS / AUTHORS OF MODERN BINARY EXPLOITATION + +Original Authors + * Patrick Biernat + * Jeremy Blackthorne + * Alexei Bulazel + * Branden Clark + * Sophia D'Antoine + * Markus Gaasedelen + * Austin Ralls + +Special thanks to + * The RPI CS Department for giving us this opportunity and letting us run with it + * Professor Bülent Yener for sponsoring such a course + * Our students who put up with us all semester diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..612c599 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,36 @@ +# RPISEC copyright/license should go here + +cmake_minimum_required(VERSION 2.8) + +project(MBE) +enable_testing() +include_directories("./include") + +# Settings +set(MBE_FLAGS "-m32 -O0 -fno-inline-functions") +set(NO_MITS_FLAGS "-z execstack -z norelro -fno-stack-protector") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MBE_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MBE_FLAGS}") + +# Handy macro +MACRO(SUBDIRLIST result curdir) + FILE(GLOB children RELATIVE ${curdir} ${curdir}/*) + SET(dirlist "") + FOREACH(child ${children}) + IF(IS_DIRECTORY ${curdir}/${child}) + LIST(APPEND dirlist ${child}) + ENDIF() + ENDFOREACH() + SET(${result} ${dirlist}) +ENDMACRO() + +MACRO(SET_FLAGS target flags) + SET_TARGET_PROPERTIES(${target} PROPERTIES COMPILE_FLAGS ${flags}) + SET_TARGET_PROPERTIES(${target} PROPERTIES LINK_FLAGS ${flags}) +ENDMACRO() + +# Where the files students get will go (install dir) +set(RELEASE_DIR "${CMAKE_BINARY_DIR}/release") + +### Build the code ### +add_subdirectory(src) diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..19603fc --- /dev/null +++ b/INSTALL @@ -0,0 +1,7 @@ +Build instructions + +Make an Ubuntu 14.04 x32 server VM for building/testing. + +mkdir ./build && cd ./build +cmake ../ +make && make install diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0b55b16 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2015, RPISEC +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e8caac9 --- /dev/null +++ b/README.md @@ -0,0 +1,289 @@ +# Modern Binary Exploitation - CSCI 4968 +This repository contains the materials as developed and used by [RPISEC](http://rpis.ec) to +teach Modern Binary Exploitation at [Rensselaer Polytechnic Institute](http://rpi.edu) in +Spring 2015. This was a university course developed and run solely by students to teach +skills in vulnerability research, reverse engineering, and binary exploitation. + +

+MBE +

+ +## About the Course + +Vulnerability research & exploit development is something totally outside the bounds of what +you see in a normal computer science curriculum, but central to a lot of what we RPISEC +members find ourselves doing in our free time. We also find that subjects in offensive +security tend to have a stigma around them in university that we would like to help shake +off. These are practical, applied skills that we're excited to share with those interested +in learning. + +The question this course posed was _'Can we teach a bunch of programmers how to pwn?'_ + +**Course website:** http://security.cs.rpi.edu/courses/binexp-spring2015/ + +**Syllabus:** http://security.cs.rpi.edu/courses/binexp-spring2015/Syllabus.pdf + +### Course Abstract + +>_Cybersecurity is one of the fastest growing fields in computer science, though its study is rarely covered in academia due to its rapid pace of development and its technical specificity. Modern Binary Exploitation will focus on teaching practical offensive security skills in binary exploitation and reverse engineering. Through a combination of interactive lectures, hands on labs, and guest speakers from industry, the course will offer students a rare opportunity to explore some of the most technically involved and fascinating subjects in the rapidly evolving field of security._ + +>_The course will start off by covering basic x86 reverse engineering, vulnerability analysis, and classical forms of Linux-based userland binary exploitation. It will then transition into protections found on modern systems (Canaries, DEP, ASLR, RELRO, Fortify Source, etc) and the techniques used to defeat them. Time permitting, the course will also cover other subjects in exploitation including kernel-land and Windows based exploitation._ + +### Prerequisite Knowledge +This course carried a prereq of +[Computer Organization - CSCI 2500](http://catalog.rpi.edu/preview_course_nopop.php?catoid=10&coid=16571) +at RPI. Computer Organization is RPI's basic computer architecture course that teaches +things like C, MIPS assembly, x86 assembly, Datapaths, CPU Pipelining, CPU Caching, +Memory Mapping, etc. + +Our expected demographic for Modern Binary Exploitation was students with zero reverse +engineering or binary exploitation knowledge. That said, to be able to take this course +you will probably need at least the following skills. +* Working knowledge of C/C++ +* Any assembly level experience +* Basic Linux command line experience + +### Lecture Breakdown +Lecture | Title | Topics +------- | ----- | ------ +01 | Syllabus and Review | Linux, C, x86 +02 | Introduction to Reverse Engineering | Tools and the VM +03 | Extended Reverse Engineering | GDB & IDA +04 | Intro to Memory Corruption | ELF, the stack, calling conventions, buffer overflows +05 | Shellcoding / Code Injection | Writing shellcode, developing scenario relevant payloads +06 | Format String Vulnerabilities | Format strings, DTOR/GOT overwrites +07 | DEP and ROP | Data Execution Prevention, writing ROP chains, ret2libc +08 | Secure Systems and Game Console Exploitation | OpenBSD, SELinux, GRSEC, Game Console Exploitation +09 | Address Space Layout Randomization (ASLR) | Overview, info leaks, partial overwrites, ASLR closure +10 | Heap Exploitation | Heap structure and concepts, corruption, use after free +11 | Misc Concepts and Stack Cookies | Signed/unsignedness issues, uninitialized data, etc, bypassing stack cookies +12 | C++ Differences and Concepts | C++ basics, structures, vTables, exceptions +13 | Linux Kernel Exploitation | Kernel basics, kernel exploitation, mitigations (mmap_min_addr, kallsyms, SMEP/SMAP), bypassing mitigations +14 | Exploitation on 64bit, ARM, Windows | Exploitation differences on other architectures & platforms +15 | Automation & The Future of Exploitation | Fuzzing, taint analysis, dynamic instrumentation, SMT/SAT solvers + +### Lab Breakdown +Lab | Topic | Corresponding Lectures +--- | ----- | ---------------------- +[01](/src/lab01) | Reverse Engineering | 01-03 +[02](/src/lab02) | Memory Corruption | 04 +[03](/src/lab03) | Shellcoding | 05 +[04](/src/lab04) | Format Strings | 06 +[P1](/src/project1) | Project 1 | 01-06 (Comprehensive) +[05](/src/lab05) | DEP and ROP | 07 +**XX** | **ASLR should always be enabled from this point on** | **See VM Information for details** +[06](/src/lab06) | ASLR | 09 +[07](/src/lab07) | Heap | 10 +[08](/src/lab08) | Misc and Stack Cookies | 11 +[09](/src/lab09) | C++ | 12 +[P2](/src/project2) | Project 2 | 01-12 (Comprehensive) +[10](/src/lab10) | Linux Kernel | 13 + +### Repository Breakdown +* [src/](/src) - Source code for labs +* [setup_wargame.sh](/setup_wargame.sh),[external_tools.sh](/external_tools.sh) - Install scripts to setup MBE on an Ubuntu 14.04 32-bit machine +* [MBE_release.tar.gz](https://github.com/RPISEC/MBE/releases/download/v1.0_release/MBE_release.tar.gz) - Binaries for labs and projects +* [MBE_lectures.tar.gz](https://github.com/RPISEC/MBE/releases/download/v1.0_release/MBE_lectures.tar.gz) - PDFs of all lecture slides +* [MBE_VM.vmdk.gz](https://github.com/RPISEC/MBE/releases/download/v1.0_release/MBE_VM.vmdk.gz) - A vmdk (disk image) of a VM that is already setup + +## Labs - The RPISEC Warzone + +The Warzone is a custom wargame that was built from the ground up for this course. It provided +a complete and consistent learning platform for us to release the labs and projects to the +students. The wargame was built ontop of a vanilla Ubuntu 14.04 32-bit server install, and is +modeled after existing local privilege escalation themed wargames. If you have ever played +the fantastic [SmashTheStack IO](http://io.smashthestack.org/) wargame, the Warzone has a +somewhat similar structure. + +

+RPISEC Warzone +

+ +Some basic tweaks have been made in an attempt to isolate players from each other and create +an individual experience, but it's probably far from perfect. It also comes pre-installed with +some tools, scripts, and configs that can make a beginner's life a bit easier in exploit +development. + +You can roll with the Warzone we designed, or you can try to setup your own using our scripts. +___ +### Option One - Pre-made Warzone VM +As the years pass, compilers will change, security will improve, and the challenges in this +repo may no longer be solvable. Because of this, we have created a virtual machine disk image +that closely replicates the universal Warzone wargame server we ran for the duration of this +course. The VM has all the tools setup, challenges pre-compiled, and lab accounts ready to go. +Hopefully it will endure the test of time. + +#### Virtual Machine Setup + +RPISEC is a huge advocate of VMware because of its quality and stability, so we recommend +using our disk image below with VMware Workstation, VMware Fusion, or VMware Player. That +said, it should also work with VirtualBox. + +VMware provides a great [2 minute video](https://www.youtube.com/watch?v=I6WfFLQwoPg) on how to setup a virtual machine using an existing disk image. + +

+Final +

+ +1. Download [MBE_VM.vmdk.gz](https://github.com/RPISEC/MBE/releases/download/v1.0_release/MBE_VM.vmdk.gz) from our release page +2. Extract the archive to obtain the disk image +3. Using VMware go to `File->New Virtual Machine...` and create a Custom VM +4. When prompted for `Guest Operating System Installation`, select `I will install the operating system later` +5. You can use the default options for almost all the prompts you encounter. For specs, we suggest the following: + * 1 processor / core + * 512 MB of RAM + * NAT Networking +6. When prompted to `Select a Disk`, select `Use an existing virtual disk` and navigate to the .vmdk you extracted +7. In the end your final screen should look something like this. Click Finish and then power on the VM. + +

+Final +

+ + +#### How to Play +We tried to keep the course fairly self contained but if you find yourself lost or struggling [OverTheWire's Bandit](http://overthewire.org/wargames/bandit/) is a great intro to Linux wargames. You can also poke people on [IRC](#contact) if you have questions. +* SSH is pre-setup on the VM, but we need an IP. First, sign in through the VMWare or VirtualBox console. To find the IP address type:
+ ```$ ip addr```
+

+ ip addr +

+ and then SSH using [PuTTY](http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe) or a command line client
+ ```$ ssh lab1C@172.16.29.130```
+ ```lab1C@172.16.130's password: lab01start```
+* Navigate to `/levels/labXX` to begin
+ ```$ cd /levels/lab01``` +* The Warzone is structured like any local privilege escalation wargame. +You must exploit a challenge to escalate your privileges and gain access to another user (level). +Once you exploit a level and escalate to the next user (confirm with `whoami`), read their password from their home dir
+ ```$ cat /home/lab1B/.pass``` +* SSH in using the new username and password to continue! + +#### VM information +* admin user: `gameadmin:gameadmin` +* rc files are in `/etc/cfg` + * All lab/project users have symlinks to these files in their home directories + * These files are also symlinked in `/etc/skel` +* To begin a lab, login as `labXC:lab0Xstart` + * e.g. `lab1C:lab01start` + * Projects are `projectX:projectXstart` +* Levels are in `/levels` +* Passwords are in `/home/$USER/.pass` +* Tools are installed in `/tools` and `/usr/local/bin` +* **ASLR must be enabled after completing the DEP/ROP lab, and stay enabled for the rest of the course** + * Until reboot: ```# echo 2 > /proc/sys/kernel/randomize_va_space``` + * Persist reboot: ```# echo 'kernel.randomize_va_space = 2' > /etc/sysctl.d/01-disable-aslr.conf``` + +___ +### Option Two - Make a Custom Warzone +We have provided a bash script that will fully setup the exact environment in the provided VM. + +**DO NOT RUN THIS SCRIPT ON YOUR PERSONAL COMPUTER, RUN IT IN A VIRTUAL MACHINE** + +1. Download [MBE_release.tar.gz](https://github.com/RPISEC/MBE/releases/download/v1.0_release/MBE_release.tar.gz) +2. Move the archive to your VM or machine and extract it
+ **NOTE: It is not recommended to run the script from /tmp, as the sticky bits can screw up wildcards**
+ ```$ tar xzvf MBE_release.tar.gz``` +3. Modify the configuration variables at the top of [setup_wargame.sh](/setup_wargame.sh) to suit your needs +4. Make the setup script executable and run it with sudo
+ ```$ chmod +x ./setup_wargame.sh```
```$ sudo ./setup_wargame.sh```
+It should take about 10-20 minutes to complete depending on your internet connection and the +number of Ubuntu updates. + +## Frequently Asked Questions + +#### Why can't I login to lab01c? +Account names are case sensitive, so please check that you're logging in as lab01**C** + +#### Where are the lab solutions? +Posting solutions spoils the fun and grind of the game, and as an academic resource it is +likely some of these materials may be re-used by other classes in the future. As goes with +most wargames, we would like to ask that you refrain from publicly posting writeups or +exploits to the labs and projects. + +If you are ever stuck on a problem or have any questions, you're more than welcome to +ask on [IRC](#contact). + +#### Why are the lecture slides for XYZ so sparse? +This was a very hands on course, so almost every lecture we had students slinging GDB commands +or following along with us on screen. The slides were accessory to the lectures and may have +gaps or experience brevity at times. With seven of us creating and giving lectures, the slides +and teaching styles vary a bit. We did our best to keep them consistent. + +#### Do you have videos of the lectures? +Sadly we did not record any of the lectures, maybe next time. + +#### Why provide the lab sources to the students? +We're huge fans of reversing / CTF challenges, but reversing is mostly a time problem. With +students juggling other classes and work during the school semester, we'd rather them focus on +learning the exploitation techniques without the overhead of reversing every binary. + +#### These challenges are really easy, what gives? +The 50 students that enrolled had little to no prior computer security experience. The labs +are not designed to be novel CTF challenges, they're meant to be more academic examples paced +to crystallize the concepts. Seasoned CTF'ers can probably blow through most of these +challenges in a day or two. + +#### Why didn't you cover subject XYZ? +If XYZ is related to vulnerability research, we're all ears. The course is far from perfect +and we are open to hear any feedback for improving it. + +#### Will this course be taught again at RPI? +There's a lot of interest in having it offered again, so it's being considered for Spring +2016. The feedback was almost exclusively positive with the students finding the material +challenging, but engaging. We've got dozens of ideas on how to make it even better next time. + +#### Where can I learn more? +Play more wargames: +* [SmashTheStack IO](http://io.smashthestack.org/) +* [Pwnable KR](http://pwnable.kr/) +* [OverTheWire](http://overthewire.org/wargames/) +* [Reversing KR](http://reversing.kr/) +* [W3Challs](http://w3challs.com/) + +And when they're happening, play [CTFs](https://ctftime.org/)! + +#### I have a question, how can I get in touch with you? +Our club keeps a pretty active [IRC](http://rpis.ec/irc) presence. Someone there can probably +answer your question. + +**Server:** `irc.rpis.ec` +**Port:** `6667`, or `6697` (SSL) + + +If you would like a more formal means of communication, you can reach us at `contact [at] rpis.ec` + + +# Licensing +This course was explicitly designed for academic & educational use only. Please keep this +in mind when sharing and distributing our course material. The specific licenses involved +can be found below. + +**Lecture Slides** + +The lectures are covered by the Creative Commons Attribution-NonCommercial 4.0 +International license [CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/legalcode). +

+CC BY-NC 4.0 +

+**Code** + +The code in this repo is covered by the BSD 2-Clause license. You can view this license in [LICENSE](/LICENSE). + +# Acknowledgements +Hundreds of hours and countless all nighters went into the production and execution of +this course. This section serves to recognize those who made all of this possible. + +## Original Authors + * Patrick Biernat + * Jeremy Blackthorne + * Alexei Bulazel + * Branden Clark + * Sophia D'Antoine + * Markus Gaasedelen + * Austin Ralls + +## Special Thanks + * The [RPI CS Department](http://www.cs.rpi.edu/) for giving us this opportunity and letting us run with it + * Professor Bülent Yener for sponsoring such a course + * Our students who put up with us all semester diff --git a/external_tools.sh b/external_tools.sh new file mode 100644 index 0000000..f89eb5f --- /dev/null +++ b/external_tools.sh @@ -0,0 +1,103 @@ +#!/bin/bash + +######################################### +# Install Tools +######################################### + +# install pip packages +function install_pip2s { + easy_install -U pip requests + pip2 install colorama git+https://github.com/Gallopsled/pwntools#egg=pwntools docopt capstone ropgadget libformatstr xortool + # capstone is weird + cp /usr/local/lib/python2.7/dist-packages/usr/lib/python2.7/dist-packages/capstone/libcapstone.so /usr/lib/libcapstone.so.3 + # patch pwntools in a terrible way + if [ `uname -i` == 'i686' ]; then + sed -i 's/platform\.machine()/"i386"/' /usr/local/lib/python2.7/dist-packages/pwnlib/asm.py + fi +} +export -f install_pip2s + +# setup gdb PEDA +function install_gdb_peda { + OPWD=$PWD + # remove gdb if it exists on this system + apt-get remove -y gdb + + # grab gdb + cd /tmp + wget -O gdb.pkg.tar.xz http://ftp.gnu.org/gnu/gdb/gdb-7.9.tar.xz + tar -Jxf gdb.pkg.tar.xz + + # compile gdb + cd gdb-* + ./configure --with-python=python2 --prefix=/usr + make + make install + cp -R gdb/data-directory/python /usr/share/gdb + + # remove gdb + cd .. + rm -rf gdb* + echo "gdb hold" | dpkg --set-selections + echo "[+] Installed gdb with python2!" + + cd $TOOLS_DIR + git clone https://github.com/longld/peda.git $TOOLS_DIR/peda + mkdir -p $SKEL_LINK_DIR + touch $GDBINIT + echo "source $TOOLS_DIR/peda/peda.py" >> $GDBINIT + echo "[+] Installed gdb PEDA!" + cd $OPWD +} +export -f install_gdb_peda + +# setup checksec +function install_checksec { + OPWD=$PWD + cd /usr/local/bin + wget https://github.com/slimm609/checksec.sh/raw/master/checksec -O checksec + chmod +x checksec + echo "[+] Installed checksec!" + cd $OPWD +} +export -f install_checksec + +# setup radare2 +function install_radare2 { + OPWD=$PWD + cd $TOOLS_DIR + sudo -u $REALUSER git clone https://github.com/radare/radare2.git + cd radare2 + sudo -u $REALUSER ./sys/install.sh + echo "[+] Installed radare2!" + cd $OPWD +} +export -f install_radare2 + +# setup fixenv +function install_fixenv { + OPWD=$PWD + cd /tmp + git clone https://github.com/hellman/fixenv.git + mv ./fixenv/r.sh /usr/local/bin/fixenv + chmod +x /usr/local/bin/fixenv + rm -rf /tmp/fixenv + echo "[+] Installed fixenv!" + cd $OPWD +} +export -f install_fixenv + +# setup shtest +function install_shtest { + OPWD=$PWD + cd /tmp + git clone https://github.com/hellman/shtest.git + cd shtest + gcc -Wall -m32 shtest.c -o shtest + mv shtest /usr/local/bin/shtest + cd .. + rm -rf shtest + echo "[+] Installed shtest!" + cd $OPWD +} +export -f install_shtest diff --git a/include/utils.h b/include/utils.h new file mode 100644 index 0000000..83199d9 --- /dev/null +++ b/include/utils.h @@ -0,0 +1,59 @@ +/* + * Tools for anti-debug/disasm + */ + +/* throws off esp analysis to thwart hexrays */ +#define deathrays \ + __asm__ volatile("push %eax \n"\ + "xor %eax, %eax\n"\ + "jz .+5 \n"\ + ".word 0xC483 \n"\ + ".byte 0x04 \n"\ + "pop %eax \n"); + +/* clear argv to avoid shellcode */ +#define clear_argv(_argv) \ + for (; *_argv; ++_argv) { \ + memset(*_argv, 0, strlen(*_argv)); \ + } +#define clear_envp(_envp) clear_argv(_envp) + +/* disables IO buffering on the file descriptor */ +#define disable_buffering(_fd) setvbuf(_fd, NULL, _IONBF, 0) + +/* clears stdin up until newline */ +void clear_stdin(void) +{ + char x = 0; + while(1) + { + x = getchar(); + if(x == '\n' || x == EOF) + break; + } +} + +/* gets a number from stdin and cleans up after itself */ +unsigned int get_unum(void) +{ + unsigned int res = 0; + fflush(stdout); + scanf("%u", &res); + clear_stdin(); + return res; +} + +void prog_timeout(int sig) +{ + asm("mov $1, %eax;" + "mov $1, %ebx;" + "int $0x80"); +} + +#include +#define ENABLE_TIMEOUT(_time) \ + __attribute__ ((constructor)) void enable_timeout_cons() \ + { \ + signal(SIGALRM, prog_timeout); \ + alarm(_time); \ + } diff --git a/resources/images/cc-by-nc.png b/resources/images/cc-by-nc.png new file mode 100644 index 0000000000000000000000000000000000000000..5f982147075ad08691e3b3c53e92633ca0ddcb2f GIT binary patch literal 5145 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 z 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 A)&Kwi literal 0 HcmV?d00001 diff --git a/resources/images/ip_addr.png b/resources/images/ip_addr.png new file mode 100644 index 0000000000000000000000000000000000000000..d6041fde6789495e9573953af566731ed3f59aaa GIT binary patch literal 6696 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 AU;qFB literal 0 HcmV?d00001 diff --git a/resources/images/mbe.jpg b/resources/images/mbe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c445f986343a399b5d5a791f6436dfedd447f4b GIT binary patch literal 74058 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%0AkpB*MI1}wNn({dNi*W_EJCWMHAMm{{S`Yu0QVe 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

QRtk=K!Lap|+OsddGT%O1y3I$ZGl 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 E4>4n)hX4Qo literal 0 HcmV?d00001 diff --git a/resources/images/vmware.png b/resources/images/vmware.png new file mode 100644 index 0000000000000000000000000000000000000000..8e076df28df4586dd2a8d6cecf0ddaedd8167334 GIT binary patch literal 134272 zcmX6^V|XS_vwmXR+}P&Eb~ZLQ$;P&A+qP{yvCYlKw(aEP{mze>?yIJ!y1VKwboWfS zf}8{bEG{en06>tE6jcHMKs5jW5EE$7Zwh~wAVHA}J9OB0C3L6LTwL0KjcETiH}a`2>^iY4cuKCd@BM##RXfnn+1F z(hohJf`%9dSvrh3e+5Ia4@FE29B(u)3@j$bFA77E4n6|*AJjf^K}=v_Sj70-j%T6e z->#>_sn6zR{-dh9?8X_WUTF9fNmfO6KlpNCLX_>mk-_1eeFi~)STZ{RGIZk~V#g0s z5Wuq!FE1@gFH|=G#BBi%8qoVIvzG}!^b6@!I9&(CF9@X9DgLJnv>!S^&?82;1Ry95 z;+LI9p$y0a2mGEeGTZ|w&;x!``W`L-{IZ|ZJwX84NyHc+dGP=uG~+N)fEf>S&$Z!n+Xm|jVVpuRW0NfMsdz6&a4G@$LKo`GN z=e?n=K|Z4SmQ;EJZ#x;6n7=kOy*-q=Is+lqv=kOCI)?$ML53hhzk50ki$5FE_T3}^ zkQa~fJ=?nvw`s(h>1mFb7DRpe(;mn#5<|ni&x4stJ3#C(qQ}(VAS7lY+D~DN3sZ_1VRyb3}Q#LK_9_wnV55arS2)q^O@-@p7T*O#2|{jO42* z&*u_hm1b3MRJuzt5rEoDvwzNVl7l&-DowrfiP%KHqTZ#(D`AsuXExTctVl^s(WsQH zRIHRZ19H?{lxCLz#X2?L{1Jslq$zbMB}`+dA+nE@SCltOVM{T8@o_)YFjQC;-pu#+Lms*1CL(uy%|4LKCE9$A0*&4ARFPyAlKlhv3ZBs?QMAp7)RD_ z6h(9g1VxGsk_}RKg5ulfcng=rqs5V;%!hUM$o8ydsP>(ssE-xyqcsrUP|1En_X^tvGcD{~*_DTC7{V4NMKOOk0O) z1}+nUiQXOF(I0$J2%#&8l>}M@K8{Te=-g`Dn;Fwtmjd2H_bDfgrW!NIGyhokTF@q_ z2hFpUGZ!RGu}s??1Mk8j!({>{7*hEeGVz8tMuGd%P7n6FJ09~7*_n-*{TF3xwU->1 z=9i)Cxsz0HuE9Af{m9{zCrR zpl{C}Uc@~y0^DoHj}0pqLQ#3`LKs4^0o4HqebvNfqvvte#7{?Q)A7^hh`|az$A4#` z3=Rz<2YlcugF}PWLj+>%!ZdK_m{ZwZ=hj6Ww?tn>Q$#m2O_}AnYU!ofY4|G`EO=Kr zJJ>n|h8avWCzmv`HKeR$@VOXhYB+4Hy0_jh?m~C7cj5LtvCp5xsu1gy7v?Go02fjam&M8xQDf2C+PYQ-wVU_C8x*zR;D|VAR}dHh2xm#^c8bkElUk!%D^Q{YSO#c7PXZ zJKmGNp43!cIoSSZ#$?{)*<4ktb0urMD^E_ z$&&G#)LY||KuvhX$#cq^wQjYXwf)5i*gV(=6e(iMa{J;E!91UeQtV&aGYQ0zAKjnX zSFZF390;n>S;M=ecB1b4Cr>b2PlO2Et1eNVRXb1%KU@e*2^cMeGj21)GnF&mv<QyDW~JqcJyG`*dP%1+Mq_F;Hg|Giew;(25=y=8%9 zd)0yLv@W%dKyH>U7HcnYbW7(wWtnQPZwt*?#E( zZ1yyHI>F1~oZh$xy5C@a{awo8;@be;dDuP;Jw0q;ZumG*eoRkvuDDWOR(HvF>E8=p z2(5^0gf0naf3E+#TKBc+b1=s=E^RJ9^)@xJ$J(p-_)f0(d)%#D>< z?_TZgqR(~RmEfvy3rT+8i^!Mi%j~88L3y_HEfFU%@e3R*?e5)(m459z-y|}URQd$~ zc#s1Cet`hM%hz{#0suHO0RX4J0RZka007H2L4Qab018qmB`T!iwtD_y8i%i*L*zDp zIr%t{oxPH=;oa8QsF}Hvy|R`L+yG{upa3^`l&dXD#8lN?&80A%6%zsMAPGclf@a7h z`OUIqENC!fO5)-Xv)nopb{B*-#-px3NLb?meIylQm%$w8HpE~a!Vy}^2 z=O_9=7h^k60J4kFETj+~I6X24Cd4mfHla49J)Z)`mb834@oZzE!o6B#Hf|v!bDP3W zs?#7v*Y+$TP#^GsAsT1(b1he>}=CI_@OZA<0SO(uQMjo9kbM%I?jS^O6Jub!3X3rn^E@w0ddLajcqTxGq& z15WMOkNxl?2HhV}fVN-TY<>#>IqOi5yWsJkH3#s3x`3Y}w+W3rti^1(^v9raWY--) z(o>po2~8lZ>H*%b8Ej_l17nU{-|Nm^36`(igk0@yYVoj~yT02+W?kz|GzQcWuy^cW zfeUkj1AE`OfZ^H2Ve=0ey0vrmcm%C0H(Gg5kAzQ{s4W|L7r_LK$Ilb}#vA0clrCL$ z7ZTP2R-Qr=aBDu`>&QQaMqoN^YNz#UJmr63W|CX@*8g43{}{c>NI`4yeJg0eV<&Xq zC;t2HmGnYl^UvdaM4s2x{5L#co2^6bA9Fy>iR*ganpI#ONEh_;R1Ka>0Hob}$sQ*` zk9DW@+C|lD12AQ;8Nc~1&fWK=fx7#0GWO`A#V;L zQ}=sh1`|kFU=>)PoZxcMSu+s*L#PEUTjw1H6OpSvaL>Bi96Wl9H~leqE?pFM83d(s zJfYfr6EYC=$j*ZQPB%aR%V0HI51`v_y31fOQ20N7^4oQFzGUldHvvnqT0Zg)+^dPs zJA~E{I^|~V17h}C32Lq1tS5TzJdh}@wia+*X1(^~L$&w5k!IM_*LNN?HR5ysY)I79 zAG6cy)Kl3`PiX}L=&CdKKp3$6X;28~cOh1SrYX1Jpp~-FkoBlkV9bTEV67onICtE{ zO)y}cCbv*0yk_YFumh%;iz%Z0^jUBqU9;5^TF_ENny_v2X(ZYNl~NYfj+?+9650+t+brljlr@yI_2wOO=q@%t9C+Olo)fZT{J2&Wlm0Ry1d z(&#P&93cH{7VSZub@a>z-Gka=(b#| zppJ#b?2^lxZMJWF`UckvPvshtv@34x$9?LIewRxpoZk+obE~SWAQ%9B$oFN@a#_L@ zM$rI*8dJXO=J2h;!aO5XIROhWa#nSW*n-e${G4rqXSLE~x$&x7l;^3q?1GC`yY99( z6)P>qofxF=ajZj%c~Vm?oNU(Q?wHemp1 zxddNVpD#VU%ytt{z4w_VSQ&b=M(qeAmS*A~3ma=aPXoF6WqE(Sp$)VNnAmu`PotZ| z>B!Rkubf%Up~c=Q3 zRU~Q0jM$I!6D&r=bsI1RSGzX*B?H+<;$3`8W0D6Yc_5N7iz0?TR(=c zCu1%oe7~N)?uIX*E-08t^WH8xmKWDc4mmJdQJnmU#(7*XdmKI<;~P^AS;Hf-plsy^ zeXkQoay?I~t2<*E{#3lZ$sw&r=yr1@SH-!YnZ@Y42I`?N0%xyDR~}rR2)fq=>~`Om z>NRewRex0Z?1@M*G3d6v7XIM3H~upY)@!HLL2x2h#*@Dz+JRvnf&>Vg8s^_{1^{{; zhFNETH`ASXHc^9wzVE@DYSmoMm#g88AM$)puR0aGqJpkGA#m_e$8y@OYtB3t&VU37 zpZAR;{!ORfM>V=VZtr7jMvZ6uo8P^C-Ttee@N^;I@wvT^tgZ2RiH=3e?XZFDMHJdF zU(Rl^XjL<#G5PkI-9bxTZ*|`g4~>0LP^dZtQ@S`b67YRJkXfe408ptZGiyg|nzQ?b zCCGp77VC!A?lU{wz0!NO`nI?}#kZ<^UoZQ9>^*2d4kco&L1oM>PKKCpoQlh^YB{&A zSp;5aKh62-afHH+{VBQo3P>UkQkgf3290tBJ6XjzzhV z#!b~Nfv7X+xbL1|)y9yU?5#YUaR_|fR`h)I&A9&fS%23XK9x)Oyq#!m+x0be_#t7S z$B8Rg4>lFUR$9)5uoQ#NW4E^9#{JM=S^JO;)aonx_2c5F`}JgqbEjM`&T5H`wBem?Gjszs=3lI&M zV_H;}`32$)f8(ZFegs%+KlQw?uKw|F^C4}q*@!_B*!-M+%XGcsci*2qX#R1*@ABG# z1G;i5ZKB+eQLutM6=EiufFf?qWN&#Z|8>4r&&$V`zIi{^^5IRH<8H9jjF&hDdOOHk zo6}}@vGl~h>HXfd0THpRmQ`ZdjNaJV7jFe=Qz&w?tMB~;HNvQydN%jU&T~kCnd9m5 z&>J1hmz&M&d7uXFXTgS1STDPTm$4b9wLQNS&u-}o0B~4u+}w@$Hv8;-c6UeCcE3)S z{Nj1K6lhTp^?hAGyQU`@zQ;x&*wgE|2xdsyTt08FKf4#G3a3r-_#~#WnDm;trGe$g)?!zq77~9u zynw_j#8Z-qja;kH5&32Lyg{)p$fx_^h9Ry8n$%d zgB~J_SLA%(`9+V&DU!d0=Z@YSSVHu1y*}^9>WWP32gUZ1pSp;ixt#;iX+9x9&(@)# zbY-ezp}bRf$?AJ)(&AsmsX2FGoSQ15hv?3=y`M(`)rE~M-Z=*%2PWyU2G=PBXJ%4r z(}d7y+)h9Vo`t*gr>7)@on2$t97O%;4{1|Io{4D0MpHn`pI{#>Hv%F}Yd-LZhRP@RpVQ~px-tV8>Xk#dIGj*exNYKltmk_FX=5EEDMLUL{EO^XGKQA?Cs zF=0N`X30eoA!}%hKy}=Tm729Y3U>C&jbl(AaA&+A0%R9|!`3sORuI9BvukOQ`HX_U z$V(+<&7#dimMGe;#*~X9y=EZlu2XgNC;2DMxPX5k$DnrBX6LhWk>3b~YQnB_7&S-8 z-$XzCB?revzrWaNPF&0X9Sg$=5o28j2?B1{o|xDruaTb-Du^w1zP<42k}{SJH_A48 z4+RuE*Y19pGHw-ay~Ut8N^LMZ`)`b%5;yiCQ{&uZK5++}G2^0bMCLLWeoAn5<~*@n z6kRo^Z=zT(nzx)C&YS^RYI0Y`etpCUjgR~<7>%XcC9sxDR_9nX-I7a3afQlGs||xQ zLS>}1j+w=8(p-nUIYV)K)M-P;M1>4`ZOJS9(os_}awP;i`*xC_s+ahUIeA{PpQ5+; zgXMTbU5O|=`EF8}I$qZN{yrupCs(^>B5oGGgLEBwqlg-e=Zaf%U!@ETebo|Q%O$gO zZZ%YMhyKEP#$jEC@`8?@GsIA_CFD?g7v|r^xMUIW7;N_4CP;nTMa(sh-%C6e(h7+` z-1octGw}J~+a%r$VJM-xZjs%Z7%w-e*$;$nES~?(V3;9;GHO z4T(aXwTP9k1SzB|IPgmW(}MlSL!uUe&1@JHh9WEuZ#Gs)9-HE&hKOD6O0HD^UbWkJ zYIxv@y_AoUsY;;t^mAkHEXSgit#;z#kTTftB;9K<_S&j}uf`cIKx z{QJQ?_Dbo2pBkvrt>jqYAK&<0zGVpmH_e%BnJ$yuwK#Dzzc9o?CCqT&GiuNCN!Reu*n$Ty8{8B)r z@2TsbP8ACzBKWC;gU}!QiK#=1kiTayh0^@|mr^Vi9aJfdin?f@$8;{63Q<9YILybk}Q@Zzblo}%?_ccB*D#{C06P8A#q9!8CoyXOb zC6p0FqjusAj4qw4r{hQ=9-hCyfM-p~A7Nb-%}A3pENnaw4JRM;OA-;jg_*koCiG(! zfahZJYF$(H6@uq#%^?5sz3L;9DN)CzWq)Hm_K}pAo2{N#e(3=!) zvD@AOPtcp>ZdiMKQBR)No5JyPHF2qgQochP9K17dG&YC+qu zwoTT{Mp2JF;t*o+Wo`%Y23=TjS76_t5az9&8{5Q=B2BZiCSJas79YpjLc-TUMeR^Hp@TP&Eq+we!|;WwGmQ&ObF zt>(fomXL!ts|0X#PQLTZWPSI*(*$g}yW0T}5I+h#v=hNv;$|H2t0$D{z2}A8-1W7{x2FeImu;?12Q0;d`!XIA|spu*SXY zP-s|3kK0Oqu%9~d)X2_C;Y`e;L3VWE{ZaHheyt$3V1GfIAk5GdAc>p>PyILmmI2aJ zc)Gp6yZs}G``600m9#{cNGmq;?kUPSsrd@-!xnK>fWOMEWucii2c9>F#le3}9hJqO zD8Z&kH3v%}$l8z^dQwcp%!rT|$c3Q{L&XPDIp>*awB?t>|xW5^}1@E(1!rXdAk47T67gm#ZiLt@E||`Ro>jikl=a zHyL4v$bJ4#rf0wbAv!})?8oy-YD`WKF%JNPKnc!7^3R#%)=lu4J!1JOw;mGHrkDj{ zf2SF}Xga`{H|YU+SVRNKM7PakpelF~zvz(ooTTcoFp7s;d5lOp**Px*!I5Foo#{x3 zy;ZBRGAcg!MJ0L4=v!Z~Z3!djNsjRuV2vD;tH?%u?3oGu8X+0e^J(j45k6wqG+DX_ zR>I~gIF2kJzbNuoc*7TUgkcq?FCeP*V3;gL_}DwgwUAAX5^{%|2!jTp z3u;Ami+84FN$Y)=BFQ4jOic5otzDOuYDJx&;enxhkO?&Ok-Vi*k2Xxz)$b`d)523n7zmCpwNAN8&pu! zuMU9c57+A8`^Y(SF5r{R3edSD`WvhPWoX@YsG>m&a??m|QlpevYj=0BDx56SFYG@X zml6FJ{}0X?Q5R2gU+Fw{xj6EXiiJyXV`Y}|pGkC@Qe_@PGA(0|$4BtP!ddL$ zOicY)1Ves?{$U_2TAvdfMW!lC6$^hqCsTW11ig~EQ5Vu2gRCdhg-{dR0)udSYY7e4 zqMt^s>>9>!HH%O3&3Kb`foz)NZCOHaF{~zPx{kD7MvsD_?shyiyevM%kcX3AAVgF;^ANFL-=$9RbX?7qCBdr<#go@ z3_5prZ9X@{{o%BUBFaNI5LR{#$TN*;*h1{JT_lddEfY<;#v3fwr9{*@rV>Znp!p+r zR&*kaNzWP~0UAgZ?W%vvndE|9n20kZw;hLYDMFZjs0Evmi3vYU4;4LDKTZ3b0Ufv8 zzuxcGLK#Nt;@$s{A#P=iyw;Gt?x~2G$B>;g{Ht*IP9_|KSMwti2kw^6;AWfC$G2t8 zsq_eA)NROj97*9M7@|qLVy}IY?JL-k(C{=hHrmeaQ%E_N2{K=<|GkHLH(I_P{>9JS za_0x$G=3VTj=(gl8f>uaCE=9z|5TWoNE~*GiAilM$0wL*tOvzotXsgLQN)x90%4sd zsEWMpdj{oBAB1UFt#&v5OWlY#2z5i^YC+`UV)ob{{W3ucmugGF5KX6ptJ%iH=6ZX& zIOPVh6G(H$VE>6U{P9NZs2FVj-)n?@^{ga}(9hovcNhxZ_u1F_A^a;hxQU@Tb1lFWOYC>ym&HdrpO z>`lG=v*a4fEj|w6Sy}`clJ;K;*pmMku4tv-(#k57eCUDhWVRlKyTydIix*=iw+-6` z&{%GCo1bj;IGt|^_`d6V`Mx17>!|V7y(=3YI3}7YS|Bh&L)0i6iilc0%BzL$A-8SC zUU;P1$d;nO>~@jtp<|bhYH7-f3|%`^J%+|!y&dAEe!Vx#_|~7EUI}=fk6h`F)e%W# zi2bE*u<^HttI{q2qN44?nC4duNAB9exASY_#-ecwAm$Y*?yg{AtJJOcgcd6TDU`0xfdlyAPTmEpEM z+;1DErC*QXdLf5y2d&kh_BN}Uk^WQUXgqqo}a$%fsve; zlEu0tK-80D$x`Wd)p;N@4Ee+Z>IoK1sb~i|3zf1WW<9Dg7Z~;3(5gigl zR7?i`ks*h33G-Y($G&dXu$JLxeP5@OdpypXcAY=~d0+s5y9&1>91V1JzI*qeQ-oC~ zng3nlzYBDSEy3fC&*J!YvWnyvCW%hX)v0;4oJDGateoFHADg|guBL=ri61MM_nZP9 zFNqJFXz+qXR5BS{)1kC~Jt8MEfOVb(&>%OOI zUm7U8xMJh9N;dIMkww}?gf{!j(GC$wA5R1B*jiQBvs9l(H)ZTTku*_H|ByWWXF-ks z_7<5zhksp9wthXXUU~bzZ+V-(3V886UUjqI*mk?0=zra`e6?AgI_b?vCTS8)!r~=q zUY|mJeBJx{_ns`b@=|(NpP#GP=(Nx)+&=0yisw9_jJ71(q zgfI+Fxx4zKi}Ud^lWmR)Hc<!fVATG2Va$vzWlARfdjPWpf?y@LC= z{GMEhU1Lxpc^3Xol9?}v5<|2}Lz|{yK%Y4k$P#nA@^b%OF^Blln8|WEw04SvB#)I^L5KMb_vH>cP=%HUCG*k_up!k(7m#e;RdIB96=N z2J{IyE<@&ShRxtPy>x_7)3|ck>PblR`3Z%cZ92X9H69z-ulEB>`OW*!r;8T>Z{IYI zOn_78H!z4op-V#@A-b7=${d7?<2*4F<4Qtry>8!fa!!7pbo_g2`PJjwe9M_>^Rd6!PHT&^x9$y zoZZUt&%zbPpiFWg-A%IB!{dAOqgDJp;oA;tEq=FMVwLM%Q4DOfklSl*%-2pX!e^sE z$Bq2g#+dJ`zTA80lTEik7~?)0>(nA^Py+cPU5yD7dw3bdYG0F_|3hNfT&Kt5AA8!s z)eobC_HQ6%)7c!@Q3i5rPDW!5wKrr@R>7Cdqy&wzW%os)YsDV?%WRbFqS}|@iNwQM zm)sN2aS=ZZ*M@V7xlag7?my3AGckpsjLyWeHD-)GxJ$|;&j!8NN)wSsAUBzC@PGV9 zT3DGJTn2o|u9GGho+opL zYQ$G!>-^TUT~c$##1Cf%!Abv0NAi4kBg~mS1DHE#h7RtDuY=Vcf!C(@o|+i}M^%ER zKH9+Do@b)ZE$@U6-yZJ!J8wsGlzmCYXk6;aQRPh?MV-cjLCR1{SHxuwgvPU4v>yl! zXQ40AskgP(KRuq`FD&RK3m@Q1N}2hBam?4X1W#`oc+>YJ4sS%TC?B(NvM24;ha-7n z5FX@{SlhDur}TJ=>{#VJIS*&?95r$tS%Q|7^MK{Nz7BSu$4mdd6J{(4M-lr!e-QD~ zM{MblC2FU22x-x=1y&+U%F;DM(lsYLBp|<_8rnLFGw6hSFx4QNS<8SV7oXmJ>+qMn z4p5Ke^UtZHzvUh)-Q$|Q$`{och(D4!_bqRln}(Nn`(g`tPxv1PO!au2e3BFdG1(1j zxD+y8?k>J=@ZLV(Yzf|CuVQMr^l@~zEg?3ikZoW&l( zGID`!Oi80&mnJ$aUQ5=H`mbT@LR;cs7P?8S>A$|8Y`md}GbDkm3SUm{Zioa~{*Zgu z4>)EeWF}NR!FcBDvIc4~w;{X7(OfJNkWzzk`P0&x^O+1`l(mdm*l7X+34Fe+o=v`w z!*n^r7w9&nc0AE*Qj6zHG|_ABt12&O1Z?7&cPY8`suXy&#s=VIn<<{ z?gYaQYA++uaeb@X{WkMT_iH!<&$s^buWPH^*HVeLZ=K8aRt@mw%ll%|F*lmhBAfTb zM1eFg17ci;bQsRo`eP*$&&HHp5=0ZRh)Y3Da7*yE=Y4TvVP|9F;k- zEL}7j;$K>&#RA05=s`NLRASHgKrLX^@$~NlcGhqex(NdZgoTNetsNvz&d_aBPnU0F z5l`}-yq^9~d+SfPulJkJ7qn$eIYcsfUHNQ6*$3TpoV1!lYTI_c)M5qJ;3_{Y>P0R4 zfA4%ES8d9)_m&3aij~VPk;ts!8ooc2%98sp4tV+{=8sd|;!u_Jrvj@Een7vjJs~#_ zgH52yF(Stpp-T3B#{k=8I7R}mkHAVx#uSM|ORp4IrL;u9d+;L4-#jqdQvW3TJwTZ; zku5V^VC4u(aO>Vqrpw4`-hvcIaE~=+Zz2c?!vfYHQ>rHYAetn3>t`J zF`vr|m{idz;NC@ZGHGDzBY0y^;nM2;aHJ+>iA-=EZKoFs!?kelQup*x?Ul+hg|pEQ z_sfaYlD-j=+m+MyQ!8x}R%%d|$W_-jl^mHhSgXX+Md!E8OM9Ny-2 zH5TefQ<#~Al_)(%b9`@)a^Wt_mZKIC^NzVrNJ|%=WHbDuKpMR`g1Y}uJ}%mk5-U(Q{3dI({ zoA7-*75#6g0*WD6U_nRZfxk0Mv&5w&nx=MT3|DT ziu~_kP?O2RSA3n^&@;!ndcX->9KZUUsf-6`3nr1HCTI(4U9uo%?XuLMbpGQ!A`@C% zeVs69cVbTM>0R7rWEc>@fpp@yt{2P$T4FD(S=_{WYtW=8N3-*8&k z0(Q=^D4U`h-q_TfQpOW!_!o;yLj6KjCJ9jUUzS)E*FP=4Qz^+`!WNjVcSV`PQxIj{ zfTbf^t%3qmyVg-r^F^()3K&TlK`qb<#?2`~4^)nXx_Hsa;0i+8QDq4GpE0qemeh;V z{lLH4RuSM^>-AR92naB(@p)npcw$h6`2Hovll-2Bq07iEdWZFS*fXn}jJ zgovp$E!Rvchn!8<0Myv`6vT>J!=1D1*b??nf7&eZDLtYrQE(=G4inl{x~i!?E&Mq{ zV|Kmr8MS*ivFzYQP07sQD6W55!PPljgE?a7nu9qaRWBHazl|{G_UceVCpA=KRUb|w zIKWOC>$spY9TmJW=XaMnCxsu}R5Ph*>l;{<6-{YQWi_*_%^ESRyDcWwr`jv#SoPV} z#0Mcpv-IUuqF*{qy*IsG zUzOF&EMGLO9JW&Z?`b3*gX-K7&BICrhkEsls;B!T*T0M0d|R@ilLpol&SAL2ivVUV zCYyumxvu|8toya#SGRipto;zoe>kI2st@TF-X&VOnVWbz`n z@Kw{j4?hb=P#iItkG5YytLOz+y;OC}EZ`KpyDO&Dn}aJ_6y{KuJigVY(!6g7T}63G zb_!FL6Li0+BsC~W^s1wpT}|bPVcb%1KQFWBUdFG#bVzdwTI78>sBQ15cmcfFkXpRz zXe~R1Q{}sXz^u^s@tE-iRy@2MoT~bcOp3hXzn@JGJaxW2chCzSg8tzHpA5!$vhEQB z2A)>BVYlpBT1MBNUlrm$wcBcRz!n?qeV^Gpz4qPhDIiQ@oZU2FR+`mUa4V}Csyahf zj1bc!Qrk=Be5IMr-atm5Ni+6c>8Ki}@u=!DE4e)zq#Z7(V20a}=&G1eiAu-7*;O^NziHrC z{%d6H-Jz08W5Jgw=3G!Dm(&zKZ)jLi^egquwYs%pN~L+lf)DY8H4G&%3j2?o(BJ4J zH|v_e0uwr!#|%%`jHT*w2pBiH2tEZ^uz!>v8OiQv~>GR=Rr zQjJz$!jX&?(ZZiMA#%nnpAml0EaTtm-0brJ*6xxK_UMT1|@_@~#_w;KIoq5<4m`wTIlYPBWX6k9%x+f9hGzN6Z(O>B)gD9R|?)MmMvUPiEQTC)vAm$a|Z z8n?~KTJtha_Wx)1y;}H7riw;{t!P1+MC)WHvg z-W6;$9U+I(9E}Xw~hmj-siDy{(maiRb|&x z-2FD2ccR4^MITb2GhfiR#;$rlqvH_qqnpD|o_)!Ed)Eek2H zVoJ3cT*vpkbf(K;xBsVb^O3`?Y)Y*0vxZv6G_0~Ff6AT_7k^6a(5)4ne&)3O0+#_d zrR-r)c^6YQRw>-P^mja@VU#-vPNs0Ay>adNV1FLNe{xrL|I~xniQzdr=vmxP(9gBz zc1<1P(6q=(@4}vuVRg4R>u9)IoV_&q=!|{1;xxc#kzgo{)GoJ+H<2}MT7fapI=mXE|Ws&QT_LehA-dC*f!fk2QhQy6#riK;NtuV@-Yxyc)zRPFS_yOg6@Y-&~dvTjK_19(*XD^dB! znnOlzuY9_mX2bpWjzVIy2+w((fme$Uq@_@Aa{4`Mzqd~MNGU@-V{&l$JuI$|%kv9M zYku(Y+1)QbkOxM}A#NNj&dw=|NXQ`&@NspWkA~-eH-Ei6TfB}>6nR>5bvV8*&mSla zdF}3h@s>1I29sj=ds_vlS91E z?)vN6@HJXs=}r08lkt6rOwrM2x#n8F%JKY|C|N(a9y`n3QkIZ=g8#wgS$H*Rx0Sv_ zTAG^Gp1Uw06IrG4$jR!of4@C&`nn~wb#mriTJw~Rd(6W=>w3Dn0olD6?N;N1A_(wiS*DDUgJRYVgKE-Q={<{(Igenfg z98snzT3y>qXQT$hs!mhzM3Xmsbb#{Fonm2(8He$bO7WP)R2j5FK1pMshSNw>)(+iR zk*4ZD1#6W;T&S`{Tc;{^&hkg8d3ZZ|(KNIcIVzkLQg{)i3vmxOXxTtE@TSwi8GIQ< zSOSKi?-aVEFAdfRHcEzxVj#@{OGkHJTkS$f0YU7HN^67(2sLyC)^`T9$_>4*s0Z)n zLD++o#ilYQP6}3{5ZC-^v{w~e4>@_vR8881$n2apXCVH)U1tKH#_@Yq&okbw|lLxy;-D-44{oJ2#D z9~6TE8T7ZZuA{0!(tnn)If4p9qrBGvB84`rD@`LrTD3}|yg(X5HRVnvl@6mh4MhAh zxEIz#0J@;J43so-LM=tQtiS?7m9|Vxd=ZpP_1XhPRVGc1_@0;Uh?p8mN>g%NZOBP= zRL~0&v!O02_yC^Fl$c9B*-@2R86_1u{gm%nHu(*=_=-~dAoY~O^fx&ewWj2luyhBF zu|aXz8AO#HMHET?5i&d2*hxiPbp(#&cz;jGdZI`Ye!;#$ah))sqC?nXV(<{-^$W|@ zG$7nvQj5AZE9AgRb+S(hMH#kCM{pmM~t-Qml7zF#|M_MFXZX7;hU_YMY4 z#G6iJa>O~+0+UU+ATvHjQ|tn2Byi{$w~yXfhxDiGpVWxm50vB#THSLm)CEHr9@XQI(!pl~5gI|Hwj z#rWc>Mn~#N6hBuQU703`y!WMTR%HESq;l8z$f}>|wYv+Az4gBBoCx~(tq*dapVCu( zoYJDUHqKD}&6t_2MKQr>t?tC6uW_x?8GD4g%1mKHI45WI>iILETU3jc>h@!0e~bIW z;zf@Nqg_yvZY!0vBY6fK1#K9C+a%c+?ZvCGs2_tZ2=GJL557Cavkl?J5~}RH}oB7-R^Q zvA#37Fh(htM2=DmCyCMl7bQMs%V9!0`Ip2M=|&IX`O?Tsu?EaSG8AgUlxZ(VsqeVI zD6iR4Hhr~a3|6L%jG|`mGNY7?qluJIpW2klW7{A9cZy)gp{Q6o8im7?*Ef{B=!KOn zW0Zno#}TDSt3l~gn!K~GSUM8L#g{}$3mowJNT$5CEo&ku3yEtX63!bqV^1RgsYn}H z0ngqfsxY-ZgJQxc8$Z<-Rj)-oL9CO2Z-WgTw7lZ($RV?EE`e#fjo5FCTXHlu{FGpCz}fc=H3TA5UV|HhTs)=`vu>iow1z&X`h;8?_&K zQ-7HjNOg70+7^dGy{!@vEVRZXzUPM^y^u7SR6N z(fUXxzlm+_#~7|mS62bw2CoZyPBQVmQ$L@w49Il%{7==H*M-A*;djM!ra?=QXQ{%f zuh;6jMDjyO8YEEC(9AiBn(s0^^7)JWhAE0)0kZ|zhm;pjZq*DcU&dq`if(K2T1=q1 zsDtPE*)xRo;Prt_c>^2u;pPLT?lNRrJv8G$pOVzh)kl&gTZ!3F_X0YDnSEuz2e*(M z9gbY`GVFny4*|9C!kwZMrRBqUUQnmTJH%I_{Xj!B7xI3yXZEUqC`PxFeET-FmAp5&ofm!F802Mcu-Cf_@fm51~v60ZunB6mPP1CA~mhri6>kh z`h^#l$yyiKiEuU|(NrW=hqNxZ!ZpV2nwR?w^C1>ahj0(3SY6}uXGhMpXH(59yxTD| z-&Gm|Z|9%7<{clmH3_;Wo+Rg4>jT2kQ>^^GO0z^8y=5}T>JXO02g(`4a4CL&q@WJ_ zgF)#Rc?H{tM34VVFNh`D$Ehp$`m>r9xo2oNA~TOs9qc70byy;Xm>)7quVWB8xv&n( zCRJF>h7R%qCGgY&#nlUuaYF--v-C=R*I5K9Fzm^GJ)3pTv2I2F*FX7 zmCDV2jrVctMAHUYUgx38n%!@s0_XO+BUtBM-LKh!j{|$BmWDpg;_G#r2|OgrfyIF{ zWo2^ZA5@pm1IRn%SuuVZRflB70klBI)20bRcVk4yMR=mlMIV^dB}%k>t;_<}gHgjj zj*n^}1<}I9p;>u+Ye3B+`K$B78s_=xcYCn-%3o-N3caTYqa&XM!v$jnXC#>mUXm+h zo-k`^EgU!qQfVt+97+Wgz;&Qmp|T;8n~9E+=-7cxQj))<605pMFnrdr{wo)nN+lLA z!$)15m`YTZAM)ry*+0S}57$%{5v(y8$6g;vOlCms7 zo1`m!7o6DV!)YDTmFfKBjbIM=#XVEvx!m5D*jhIhgZ@}-_#JRwtW99m8Yap*4tYyM(s;66!VH$AyJH# zEGILDSuN3d9rD%zVWy#+i+nJ70EVbhiD?%~6}upnNHk)BU5YeMDESIgBX#&Bqv&Z0 z@zQOQZBkUSp~%@;^Uq@T7;-Tx%lAFIcqQ)gv7B7`V;fIuKjQbbGKa71S zMv=kZ@Igw-{<9jE2BYe)hayW;xSOaUX4CqCiB|>n+^!Z6Q%9l_vjkxNT?~jOLvy6B zOwUkQ9GOHEyIQ!*!veBu9UW1WasUD)qA?i&dj-W(=qx;h6_YadQb%k++oV;a9VtcY zRg^IEk;>7y@zuT*S?Mti8Pj{Tq-QYtfMezI#c-dVS40yHpvD1mg_*3Q9QveTwi+{XJ!$qb~lJmZ2_;R8f z__~w-x}TpT$SGC_h^sFJj*c)q`a1CG65#_XKSQjs4N)df0zF`L&A(JCKhUkQR#l=B5{$e-Cy;KtE7*Mo1K6atJj4;Jx z%fV)0M2s-Nr)2{(S(%A~;h}g#wNN=mn5HH5PYZOzGh@dj88pyK9fQFl<|518mxfr% z<~lUl8i6+qLxLShR4iJUXr`te;Cc7u3I$)T{L{rfGNd1oxAP2?9hY=*ZNXSso!e?wiha(FB@P+OCxeWsP z>v=dW6>=r0`QGYj+oPulN?c)#iqoK{35ubpE=8D=sZ*(;7=!7KtK}vMb4Gq*vZ&*k z4t}8lAyf1fO9kJVAn<9VT8sg^_Il-ru&C5Ns<01)1!0H*BW2jB!-JA3fgh2k)rmnSR|Y%rfV@7u(x47+fWov5m`~5>P21B1DBxmXDBev> zrUFJGmwc=IEEXkG@l7VKBs(ZFkqQ{C)ilV+0<=m5N&q0AAHr}jl9fjQ6arx<7|HUo zqzt~rQ1)cch%gJZk(4ZND_nvQc7RnMGY$Z>hiw^0CsYVmNVn{nMz>orzyW;2w!Z6} z*9=n8fHZL!T2ps`&{Y6SgP6JlPL`GhP_&1gVEwnM7#?HH@>Bi9KFW;J`8IXxo})!2 zQps80#oNePC%S~iP*m_R{dVUxnA)^qmY%}X(z|0H>~FNd@-#{0(+6)Qs^alSe!^&l zlLauYw49{WOUt6s@XZ24F`^^J0TjMrJ4yBZvv9ymlqD*&^i(~uE96ls>U0%7y=D|J zC43BqKC}l+gOH6UB=ymnp>QAw4^HRCy4Mt5^Y52raG`kujy4#=#)8^8Gu%P?nUQ=)sQGbJD_xqu(qr(@X z={3^HwGRCZ{T^Yx2HWSm8LIy9nPF+d`9rcCpQ|O1i#Y;q90y|><}E4BjptzQncbrj zvf6m0jwE;VEswoWv-3En2z>q-|Lf-PGh1JnYBfGGlHQk8$M5uT-^!2m^!BoTbER_u(%>PyDiJLy4Mp*5t=)giH-sfG4AvEn6=H z!1z5;IB{cYc%=RVMv3?pMSpnZ8aoxa&SchJN}=QhB11;1888G98*4Hm76Yq8Jerj1 zG0e&|sIjE(EEVt%N-u>3 zQ983;v(u7xo5Es?9cF!$yhW3RiJZ)#y#g8r1Nkf>1+NMPag=&JE{!%$SqeN2uS$u! zs=xwXuGt6_^53DK2BNU&{M`AToQ{@)hS*T9oUQe%ARFLH+D1! z@9$lMSQRwiR*Yj3!kVG4W8-oQFg$m%Nv{RT3R8QL;R^!MoO*}hkv0_->e)x71`RG6 z*hXp1@Y593cvMFzsk1je4?0}^Fs$;epHa(c-U`tXqDByB|5A#2q?G=XSb`06DMS(u z^Rt+%b``rWCG8B`m_XQ$X-H@kDXmY-PC&z)WCDhe-VO4o zv=>s1cFWGX>+ppnGEL9yuMtArrO>%Qlx^k^DK#=xL4`P}y0ynRT)~%UG+L>6 z5V^XAlotXUbj?^!cAill8Mt32Fbm96R-Ct`Mj(lH@v&eNSS8#4Y%nRsb1K$9AdISe zY7;$s4+8X8fmhai_COc2BXF{%<_|XHeom$aw?cb@-vGv-}0z`S6Mrg zS5P8~&hqqW6F9Q_gr=^wE&QBBG(@LqmmS0FTR<75rA|-v7jvnKjlM)=;4hwySrw*v zZm}yW3?4^h$f9-xhOjKLC|!s9l>6#)!bE>2XbrvwPe@~e+9i(^UAf3oavG$`Z>V|V^% z(h^kp2*1mwAoGtRnveN(CN-i*BhGqavdFQkbN62wfxd03aY+chd9i_1BS)de&zG7( zvFb1zbF)kxsaeKCu|INudGt|L`nJMom6mX27&Lc%KTuE+!~tMntlCg8KTXLYQyFo4 zQ=sRza$Ow8uf1wMNg6=!B|BX$qQn-rlQG=N_eeSK@T zA#DNU9M!C6iXOh3>~B{cuV6>_ zAQKPC&MMy^-t1e93{0aYM5YL_PUpSlfifgkHHNtx{-T*EqPpK$Ay~Bcxd-^SrB?9TO2DPHe2az>&5)lwlfpd;O?b&31_=7HOtt+%_Re|X^*)u4VnrYTF9X?E5=IhQ1 zv$+6_T)Z-$LM$7Paby7pB6<%?o;dQ~mC`|}R8t3uHZt>}5>anvtA3BtpuSq>MVA2x3d$%#hNc#$zMP-JXM6y(cEe+nv85=&EJ!yOh@MWbmjRVWnlv zm|k#M8f`_Bya`t-9%h3&PY)ON-CCccS>wm`;$!<*S5s7ag+ov&$BZm>f>nCWG`^}j zx~LF5w-C;0{81BHKBKbwKX9FnhXK+ROqErESO;ku$a_ zbgDM2^j{AiUzdD1U(KjRn@+=+ljJ5-FDlTc|GA%{;?F#3lrxP?QSFJy39N(wq>XxE z{8J_>wCsc9*s7yY?!@w#H{}XNKPwkUXRM0g#IUO2;%nKHYbi>h_3^ZDu?3i0&7X(( zEbbm98M&ENF%hz;I*xe^+rW<6H~4UQ`BEhH8Yy%wiZpxQUw#%yF#nZB8iKkoRI`?Y z24gfSg9cmu{Jp|O5&Z=3tDA?BT>%b^Q8P@Dbn?nPQIJ}w58Os{>;1qSCBQXH*Ha9H zqSkJX*mKd|0r}nDa~E6*;;!1}3OZj+Me0E~sQ%JCgGgX$!Ok6C!JtM-O_oHW zRmZ+GB$ielksPGL-m951t=U;ES=TVJTV+3T37G@?)EKi_iQU{V`PnE=|)l2Ag@fna4w11vJcDgM; z^E9Jd4%`w$EER&m0rek3rwUagq6R7U%-UGj5lWE%sruH}gqb|^9bs!Hya0XvoX^ju zyp+d^Ml?JK1FnwLZr#=G^oM>2sTWC4g(4?>M+FFIOGBVbq977uD(vc?VQ%xmzI+)E0#WoA8Gm(i;~R2Pe^f z<5QPl5_iGX&_L|VQgMW;I0U8Lj;Aao#3%UqSv+med?&m6d@3YRf4>oBtNDW<8VRPj zO!}Smz3lzkm&l_yr8V#>@IA2OYPr&^X4%SpgF`TX>;p`xqyBT~`uk9@c-c5E^+jkf zlV*)U=c*Ogc=*=Rcgr7$5p=Y)&$W8hwmuYwUtL-pt;`y01TxhS>3-QXx$JJ;zOMw{ z8al52;f^hQd|ZmbXN?XCDp(w;u5+VZIdtoZMpvWA5)cve@Hx0M<3E>(Ghl7NN5;nG z`-yESPg&7K!S{t_OnL|$T)1TTrz}iE4+T(sK*SdX3bF`BpC@^nvpq)3X-N$q2?j5Y z%2VZ>3}c5|8hRf$f##>_MoHRP6^6h|pWL_l;OGeD!wlGB&Eupi|VdPZ}E&rB|duk+av>ou7>MHp1!BNoCy+AJyR+ z^s%&TEeIPS6lLp)_wN@6Rl?hLKE4e>#cbSP@1|+@Vh$M*FkLE`V+WJzSoI-+J7$=h z2L8v}ba}em9BI-vN`k|wR%4;*`&~T~j2>hXsj3`T(kGR`SAWf7;;u2#} za?XkkZO}!m(k9-bg>hY?ZK)kdIghl<$=dF{ z;2J7?6+o%s_5R9YIraH2VZu(t>1o~#(X=sCdiwPwy;hGnqr=Ppb*InhQx;WptZQFgZ#~i~^Sk_f?=3CMwo0s44~Z!1-#y-MW%_PpEW| znxS&+n3!Y4m6r&a2eP^yvFscnv{cj@8D;TC9Z%HeiFIb*mbdP!C0b->+9 zm1%od(8knJ3wcPJId?RlLekp_2w!bDLaG%< zz&cY6mn29gm-*fI0UlLd>*O)3ri>F9sIQ+LfO^1e4D z6afpHSgpJ;J{I4svZd^b6eSMD=zEMlJsZ6^6e@6tixocR{32+-t47qPJ6= zTc&F9tvSG2t2w;a%_w)@ftM$d@_f!p(0NWFt`9G)dEWL;{Nl$fVpq(4VeB{jC$-fw#7wCd$RYGRgpRJC+PgfgsTTf@7`@I|y9e=kr-gxRm z4|uwfuhQ(k-=up+&(#MxPj4%CzxC4jx|%y*zoBjuPQ+!|f==26^Bm!N<~rR4o*Y%|W#1_VO4!%YT9aORc- z<&Udl7X`n@8UDyc>2ig0M`H3Age&rT1?q$!RcBe`iUhu@tf!qK#XAc5*-amg`^MjQ zHy%NG3|dVNGd1_Zt5?0l(CM(c&L;D_IU7=5U;1;J+mvniY&1P2RJP!-0y|N-b^F{uw%|X#uh`?M{#TnOb}8+sztH$lJlt!H)DX=%ts;|9H-`nWU9%G&4wT zIfKB@nw;94EKRS2^ltb{Kp72fI+dX)&K4Fb1pejoVAW-8Mok9jpP!_SCa#l1yohFH z0#j~ws%LBYfI1tC_dYhaf@8UqsR?tt&sFBs`S%Ttzq|Z#lA*or^oiu zJ#WYTW&HiTz5eUl)BU`Ic7wyQuC1`Q>*SE~eQtp7>C|L1A}5vB(0_NAFIDQS~KnR_{Pv(PBe;k$+mza zA3G?H%1ph|nj{t#nVm6t$b@|2A16 lvXFQy?*ExeuqCX+h5TkO+;5WBLz6eS)`) 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 z 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 literal 0 HcmV?d00001 diff --git a/resources/images/warzone.png b/resources/images/warzone.png new file mode 100644 index 0000000000000000000000000000000000000000..5d95f8cbac653da3b98db4220ef244f7424be463 GIT binary patch literal 7153 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 literal 0 HcmV?d00001 diff --git a/setup_wargame.sh b/setup_wargame.sh new file mode 100644 index 0000000..7916371 --- /dev/null +++ b/setup_wargame.sh @@ -0,0 +1,457 @@ +#!/bin/bash + +######################################### +# Pre-install checks +######################################### +if [ "$USER" != 'root' ]; then + echo "ERROR: Script must be run using root!" + exit +fi + +######################################### +# Per-Machine Install Variables +######################################### + +# change these things +export PUBKEY="" +export REALUSER='gameadmin' +export HOSTNAME='warzone' +export LEVELS_DIR='/levels' +export SKEL_DIR='/etc/skel' +export SKEL_LINK_DIR='/etc/cfg' +export TOOLS_DIR='/tools' +export TOOLOWNER='toolman' + +# leave as is +export VIMRC=$(echo $SKEL_LINK_DIR/.vimrc) +export SCREENRC=$(echo $SKEL_LINK_DIR/.screenrc) +export BASHRC=$(echo $SKEL_LINK_DIR/.bashrc) +export PROFILE=$(echo $SKEL_LINK_DIR/.profile) +export GDBINIT=$(echo $SKEL_LINK_DIR/.gdbinit) +export R2CONF=$(echo $SKEL_LINK_DIR/.radare2rc) + +######################################### +# Basic Setup +######################################### + +# hush login motd +touch .hushlogin + +# update and apt-get a ton of stuff +apt-get update +apt-get -y upgrade +apt-get -y install unattended-upgrades htop fonts-inconsolata git gdb gcc gcc-multilib g++ g++-multilib git ltrace linux-source openssh-server python-pip ipython python-dev vim guile-2.0 unzip socat libncurses5-dev texinfo +sudo dpkg-reconfigure -plow unattended-upgrades + +# Create main user +useradd -m -s /bin/bash $REALUSER +adduser $REALUSER sudo + +# install ssh key +HOME_DIR=$(eval echo ~$REALUSER) +sudo -u $REALUSER mkdir $HOME_DIR/.ssh +chmod 700 $HOME_DIR/.ssh +sudo -u $REALUSER echo $PUBKEY > $HOME_DIR/.ssh/authorized_keys +chmod 600 $HOME_DIR/.ssh/authorized_keys +chown $REALUSER:$REALUSER $HOME_DIR/.ssh/authorized_keys +restart ssh + +# set perms +chmod 0700 $HOME_DIR + +# set hostname +old_hostname=$(cat /etc/hostname) +hostname "$HOSTNAME" +cat /etc/hosts | sed s/"$old_hostname"/"$HOSTNAME"/ > /tmp/newhosts +mv /tmp/newhosts /etc/hosts +echo "$HOSTNAME" > /etc/hostname + +######################################### +# Configure Wargame Environment +######################################### + +# hardening / wargamification + +# restricting access mostly means make root accessible only, chmod 700 or s/t +chmod 700 `which dmesg` +chmod 700 `which fuser` +chmod 700 `which htop` +chmod 700 `which kill` +chmod 700 `which killall` +chmod 700 `which lsof` +chmod 700 `which pgrep` +chmod 700 `which pkill` +chmod 700 `which ps` +chmod 700 `which screen` +chmod 700 `which su` +chmod 700 `which tmux` +chmod 700 `which top` +chmod 700 `which ulimit` +chmod 700 `which users` +chmod 700 `which w` +chmod 700 `which wall` +chmod 700 `which who` +chmod 700 `which write` + +# restrict access to /proc/maps/ +sed -i 's/^exit 0$//' /etc/rc.local +echo -e 'mount -o remount,hidepid=2 /proc\n' >> /etc/rc.local +mount -o remount,hidepid=2 /proc +chmod 551 /proc + +# make /tmp be not world readable, have sticky bits +chmod 1773 /tmp + +# disable ssh'ing ? (not sure if possible, but these make it harder) +iptables -A OUTPUT -p tcp --dport 22 -j DROP +chmod 700 `which ssh` + +# disable aslr +echo 0 | tee /proc/sys/kernel/randomize_va_space +echo 'kernel.randomize_va_space = 0' > /etc/sysctl.d/01-disable-aslr.conf + +# resource management, stop forkbombs and filling the server (nproclimit) +# make group for wargame users +groupadd gameuser +echo -e '@gameuser\thard\tnproc\t500' >> /etc/security/limits.conf +echo -e '@gameuser\t-\tpriority\t15' >> /etc/security/limits.conf + +# on-login banner +chmod -x /etc/update-motd.d/* +echo -e '#!/bin/sh\ncat /etc/banner' > /etc/update-motd.d/00-banner +chmod +x /etc/update-motd.d/00-banner +echo 'G1swOzMxbSAgICAgICAgX19fX19fX19fX19fX19fX19fX18uX19fICBfX19fX19fX19fX19fX19f +X19fX19fX19fX19fXyAgICAgICAgICAgICAgICANCiAgICAgICAgXF9fX19fXyAgIFxfX19fX18g +ICBcICAgfC8gICBfX19fXy9cXyAgIF9fX19fL1xfICAgX19fIFwgICAgICAgICAgICAgICANCiAg +ICAgICAgIHwgICAgICAgXy98ICAgICBfX18vICAgfFxfX19fXyAgXCAgfCAgICBfXylfIC8gICAg +XCAgXC8gICAgICAgICAgICAgICANCiAgICAgICAgIHwgICAgfCAgIFx8ICAgIHwgICB8ICAgfC8g +ICAgICAgIFwgfCAgICAgICAgXFwgICAgIFxfX19fICAgICAgICAgICAgICANCiAgICAgICAgIHxf +X19ffF8gIC98X19fX3wgICB8X19fL19fX19fX18gIC8vX19fX19fXyAgLyBcX19fX19fICAvICAg +ICAgICAgICAgICANCiAgICAgICAgICAgICAgICBcLyAgICAgICAgICAgICAgICAgICAgICBcLyAg +ICAgICAgIFwvICAgICAgICAgXC8gICAgICAgICAgICAgICANChtbMDszNm0gX18gICAgICBfXyAg +X19fX18gX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAgICBfX19fX19fICBfX19fX19fX19f +Xw0KLyAgXCAgICAvICBcLyAgXyAgXFxfX19fX18gICBcX19fXyAgICAvXF9fX19fICBcICAgXCAg +ICAgIFwgXF8gICBfX19fXy8NClwgICBcL1wvICAgLyAgL19cICBcfCAgICAgICBfLyAvICAgICAv +ICAvICAgfCAgIFwgIC8gICB8ICAgXCB8ICAgIF9fKV8gDQogXCAgICAgICAgLyAgICB8ICAgIFwg +ICAgfCAgIFwvICAgICAvXyAvICAgIHwgICAgXC8gICAgfCAgICBcfCAgICAgICAgXA0KICBcX18v +XCAgL1xfX19ffF9fICAvX19fX3xfICAvX19fX19fXyBcXF9fX19fX18gIC9cX19fX3xfXyAgL19f +X19fX18gIC8NCiAgICAgICBcLyAgICAgICAgIFwvICAgICAgIFwvICAgICAgICBcLyAgICAgICAg +XC8gICAgICAgICBcLyAgICAgICAgXC8gDQoNChtbMG0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICANCg0KICAgICAg +ICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VzIGFyZSBpbiAvbGV2ZWxzICAgICAgICAgICAgICAg +ICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgUGFzc3dvcmRzIGFyZSBpbiAvaG9tZS9sYWIq +Ly5wYXNzICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIFlvdSBjYW4gY3JlYXRlIGZp +bGVzIG9yIHdvcmsgZGlyZWN0b3JpZXMgaW4gL3RtcCAgICAgICAgICAgIA0KICAgICAgICAgICAg +ICAgICAgICANCiAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tWyAbWzA7OTJtY29udGFjdEBycGlz +LmVjG1swbSBdLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgDQoNCg==' | base64 -d > /etc/banner +rm /etc/legal + +# disable crontab +touch /etc/cron.allow + +#more I'm sure + +######################################### +# Install Tools +######################################### + +# make tools owner +useradd -M -s /bin/false $TOOLOWNER + +# make tools dir +mkdir $TOOLS_DIR +chmod 777 $TOOLS_DIR + +source ./external_tools.sh +install_pip2s +install_gdb_peda +install_checksec +install_radare2 +install_fixenv +install_shtest + +# set perms +chown -R $TOOLOWNER:$TOOLOWNER $TOOLS_DIR/* +chmod 775 $TOOLS_DIR + +######################################### +# Create Skeleton User +######################################### + +# this should populate the skel folder with symlinks. That way any user we make later on the +# server will auto copy these settings, and they will be in a single location for editing. +export SKEL=$SKEL_DIR +mkdir $SKEL_LINK_DIR + +# setup vim config +touch $VIMRC +(echo syntax on \ +; echo set tabstop=4 softtabstop=4 shiftwidth=4 \ +; echo set expandtab ai number ruler \ +; echo highlight Comment ctermfg=green \ +; echo set viminfo=) >> $VIMRC +echo "[+] Configured VIM!" + +# setup .bashrc +cp $SKEL_DIR/.bashrc $BASHRC +(echo -e "\n# Start user config" \ +; echo "export TERM=screen-256color" \ +; echo "export PS1='\[\033[01;31m\]\u\[\033[00;37m\]@\[\033[01;32m\]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '" \ +; echo "export ENV='/etc/profile'" \ +; echo "alias grep='grep --color=auto'" \ +; echo "alias ls='ls --color=auto -l'" \ +; echo "alias checksec='checksec --file'" \ +; echo "alias ropgadget='ROPgadget --binary'" \ +; echo "alias gdb='gdb -q'") >> $BASHRC +echo "[+] Configured bash!" + +# setup .profile +cp $SKEL_DIR/.profile $PROFILE +echo "[+] Configured profile!" + +# setup .gdbinit +(echo -e "\nset disassembly-flavor intel" \ +; echo "set detach-on-fork off" \ +; echo "set follow-fork-mode child") >> $GDBINIT +echo "[+] Configured gdb!" + +# setup radare2 config +echo 'e scr.utf8 = true' > $R2CONF +mkdir -p $SKEL_LINK_DIR/.config/radare2 +ln -s /dev/null $SKEL_LINK_DIR/.config/radare2/history + +# make sure the admin user gets these pretty confs, too +cp $SKEL_LINK_DIR/.* /home/$REALUSER/ +chown -R $REALUSER:$REALUSER $(eval echo ~$REALUSER) + +# start fresh and add symlinks +rm -rf $SKEL_DIR +mkdir $SKEL_DIR +ln -s $VIMRC $SKEL_DIR/.vimrc +ln -s $BASHRC $SKEL_DIR/.bashrc +ln -s $PROFILE $SKEL_DIR/.profile +ln -s $GDBINIT $SKEL_DIR/.gdbinit +ln -s $R2CONF $SKEL_DIR/.radare2rc +ln -s $SKEL_LINK_DIR/.config $SKEL_DIR/.config + +# disable bash history +ln -s /dev/null $SKEL_DIR/.bash_history +chattr -fR +i $SKEL_LINK_DIR + +######################################### +# Setup wargame +######################################### + +function setup_level { + if [ "$#" -ne 7 ]; then + echo "ERROR: Missing arguments" + exit + fi + # rename arguments + username=$1 + next_level=$2 + next_password=$3 + level_subdir=$4 + local level_files=("${!5}") + local level_owners=("${!6}") + local level_perms=("${!7}") + + # unchattr passwd + chattr -f -i /etc/passwd + chattr -f -i /etc/shadow + + # make current level user + user_home=$(eval echo ~$username) + id -u $username &> /dev/null; uexist=$?; + if [ "$uexist" -eq "1" ]; then + useradd -m -s /bin/bash -G gameuser $username + user_home=$(eval echo ~$username) + echo $username:$([ -f $user_home/.pass ] && cat $user_home/.pass \ + || echo $level_subdir"start") | chpasswd + fi + # make next level user + next_home=$(eval echo ~$next_level) + id -u $next_level &> /dev/null; uexist=$?; + if [ "$uexist" -eq "1" ]; then + useradd -m -s /bin/bash -G gameuser $next_level + next_home=$(eval echo ~$next_level) + echo $next_level:$next_password | chpasswd + echo $next_password > $next_home/.pass + chown $next_level:$next_level $next_home/.pass + chmod 0400 $next_home/.pass + fi + # make sure everything is unchattr'd + chattr -fR -i $user_home + chattr -fR -i $next_home + chattr -fR -i $LEVELS_DIR + + # add the levels and perms + llen=${#level_files[@]} + for (( i=0; i<${llen}; i++ )); do + chown ${level_owners[$i]} $LEVELS_DIR/$level_subdir/${level_files[$i]} + chmod ${level_perms[$i]} $LEVELS_DIR/$level_subdir/${level_files[$i]} + done + + # re-chattr levels/directories + chattr -fR +i $user_home + chattr -fR +i $next_home + chattr -fR +i $LEVELS_DIR + + # re-chattr passwd + chattr -f +i /etc/passwd + chattr -f +i /etc/shadow +} + +function add_simple_level { + local level_files=("$1" "$1.c") + local level_owners=("$2:$1" "$1:$1") + local level_perms=("4550" "0400") + setup_level $1 $2 $3 $4 level_files[@] level_owners[@] level_perms[@] +} + +function add_socat_on_start { + # $1 = working directory + # $2 = exec cmd + # $3 = listen part + # $4 = user to run exec as + echo -e "cd $1\nsocat TCP-LISTEN:$3,reuseaddr,fork,su=$4 EXEC:\"$2\" &" >> /etc/rc.local +} + +# Stick levels folder where it belongs +mkdir $LEVELS_DIR +if [ -d "./levels" ] +then + cp -R ./levels/* $LEVELS_DIR +else + echo "ERROR: ./levels not found" + exit +fi + +# Add LICENSE and ACKNOWLEDGEMENTS +cp LICENSE $LEVELS_DIR/LICENSE +cp ACKNOWLEDGEMENTS $LEVELS_DIR/ACKNOWLEDGEMENTS +chmod 444 $LEVELS_DIR/ACKNOWLEDGEMENTS +chmod 444 $LEVELS_DIR/LICENSE + +# Add lab01 +# Will throw some errors since no source file, but w/e +lab=lab1 +add_simple_level $lab'C' $lab'B' 'n0_str1ngs_n0_pr0bl3m' lab01 +add_simple_level $lab'B' $lab'A' '1337_3nCRyptI0n_br0' lab01 +add_simple_level $lab'A' $lab'end' '1uCKy_Gue55' lab01 + +# Add lab02 +lab=lab2 +add_simple_level $lab'C' $lab'B' '1m_all_ab0ut_d4t_b33f' lab02 +add_simple_level $lab'B' $lab'A' 'i_c4ll_wh4t_i_w4nt_n00b' lab02 +add_simple_level $lab'A' $lab'end' 'D1d_y0u_enj0y_y0ur_cats?' lab02 + +# Add lab03 +lab=lab3 +add_simple_level $lab'C' $lab'B' 'th3r3_iz_n0_4dm1ns_0n1y_U!' lab03 +add_simple_level $lab'B' $lab'A' 'wh0_n33ds_5h3ll3_wh3n_U_h4z_s4nd' lab03 +add_simple_level $lab'A' $lab'end' 'sw00g1ty_sw4p_h0w_ab0ut_d3m_h0ps' lab03 + +# Add lab04 +lab=lab4 +add_simple_level $lab'C' $lab'B' 'bu7_1t_w4sn7_brUt3_f0rc34b1e!' lab04 +add_simple_level $lab'B' $lab'A' 'fg3ts_d0e5n7_m4k3_y0u_1nv1nc1bl3' lab04 +add_simple_level $lab'A' $lab'end' '1t_w4s_ju5t_4_w4rn1ng' lab04 + +# Add lab05 +lab=lab5 +add_simple_level $lab'C' $lab'B' 's0m3tim3s_r3t2libC_1s_3n0ugh' lab05 +add_simple_level $lab'B' $lab'A' 'th4ts_th3_r0p_i_lik3_2_s33' lab05 +add_simple_level $lab'A' $lab'end' 'byp4ss1ng_d3p_1s_c00l_am1rite' lab05 + +# Add lab06 +lab=lab6 +add_simple_level $lab'C' $lab'B' 'p4rti4l_0verwr1tes_r_3nuff' lab06 +level_files=($lab'B' $lab'B.c' $lab'B.readme') +level_owners=($lab'A:'$lab'B' $lab'B:'$lab'B' $lab'B:'$lab'B') +level_perms=('0550' '0400' '0400') +setup_level $lab'B' $lab'A' 'strncpy_1s_n0t_s0_s4f3_l0l' lab06 level_files[@] level_owners[@] level_perms[@] +add_socat_on_start "$LEVELS_DIR/lab06" "timeout 300 $LEVELS_DIR/lab06/lab6B" 6642 $lab'A' +add_simple_level $lab'A' $lab'end' 'eye_gu3ss_0n_@ll_mah_h0m3w3rk' lab06 + +# Add lab07 +lab=lab7 +add_simple_level $lab'C' $lab'A' 'us3_4ft3r_fr33s_4re_s1ck' lab07 +level_files=($lab'A' $lab'A.c' $lab'A.readme') +level_owners=($lab'end:'$lab'A' $lab'A:'$lab'A' $lab'A:'$lab'A') +level_perms=('0550' '0400' '0400') +setup_level $lab'A' $lab'end' '0verfl0wz_0n_th3_h3ap_4int_s0_bad' lab07 level_files[@] level_owners[@] level_perms[@] +add_socat_on_start "$LEVELS_DIR/lab07" "timeout 60 $LEVELS_DIR/lab07/lab7A" 7741 $lab'end' + +# Add lab08 +lab=lab8 +add_simple_level $lab'C' $lab'B' '3v3ryth1ng_Is_@_F1l3' lab08 +add_simple_level $lab'B' $lab'A' 'Th@t_w@5_my_f@v0r1t3_ch@11' lab08 +level_files=($lab'A' $lab'A.c' $lab'A.readme') +level_owners=($lab'end:'$lab'A' $lab'A:'$lab'A' $lab'A:'$lab'A') +level_perms=('0550' '0400' '0400') +setup_level $lab'A' $lab'end' 'H4x0r5_d0nt_N33d_m3t4pHYS1c5' lab08 level_files[@] level_owners[@] level_perms[@] +add_socat_on_start "$LEVELS_DIR/lab08" "timeout 60 $LEVELS_DIR/lab08/lab8A" 8841 $lab'end' + +# Add lab09 (cpp and networked) +lab=lab9 +level_files=($lab'C' $lab'C.cpp' $lab'C.readme') +level_owners=($lab'A:'$lab'C' $lab'C:'$lab'C' $lab'C:'$lab'C') +level_perms=('0550' '0400' '0400') +setup_level $lab'C' $lab'A' '1_th0uGht_th4t_w4rn1ng_wa5_l4m3' lab09 level_files[@] level_owners[@] level_perms[@] +add_socat_on_start "$LEVELS_DIR/lab09" "timeout 60 $LEVELS_DIR/lab09/lab9C" 9943 $lab'A' +level_files=($lab'A' $lab'A.cpp' $lab'A.readme') +level_owners=($lab'end:'$lab'A' $lab'A:'$lab'A' $lab'A:'$lab'A') +level_perms=('0550' '0400' '0400') +setup_level $lab'A' $lab'end' '1_d1dNt_3v3n_n33d_4_Hilti_DD350' lab09 level_files[@] level_owners[@] level_perms[@] +add_socat_on_start "$LEVELS_DIR/lab09" "timeout 300 $LEVELS_DIR/lab09/lab9A" 9941 $lab'end' + +# Add project1 +lab=project1 +level_files=('tw33tchainz' 'README') +level_owners=($lab'_priv:'$lab $lab':'$lab) +level_perms=('4550' '0400') +setup_level $lab $lab'_priv' 'm0_tw33ts_m0_ch4inz_n0_m0n3y' $lab level_files[@] level_owners[@] level_perms[@] + +# Add project2 +lab=project2 +level_files=('rpisec_nuke' 'README' 'GENERAL_CROWELL.key' 'GENERAL_DOOM.key' 'GENERAL_HOTZ.key') +level_owners=($lab'_priv:'$lab $lab':'$lab $lab'_priv:'$lab $lab'_priv:'$lab $lab'_priv:'$lab) +level_perms=('4550' '0400' '0400' '0400' '0400') +setup_level $lab $lab'_priv' 'th3_pr1nt_funct10n_w4s_100_l!n3s_al0ne' $lab level_files[@] level_owners[@] level_perms[@] +add_socat_on_start "$LEVELS_DIR/project2" "timeout 300 $LEVELS_DIR/project2/rpisec_nuke" 31337 $lab'_priv' + +# Add lecture examples +lecuser=lecture +lecpriv=lecture_priv +## Make users +chattr -fR -i /etc/passwd +chattr -fR -i /etc/shadow +useradd -m -s /bin/bash -G gameuser $lecuser +echo $lecuser':'$lecuser | chpasswd +useradd -m -s /bin/bash -G gameuser $lecpriv +passwd -l $lecpriv +chattr -fR +i $(eval echo ~$lecuser) +chattr -fR +i $(eval echo ~$lecpriv) +chattr -fR +i /etc/passwd +chattr -fR +i /etc/shadow +## Set permissions +chattr -fR -i $LEVELS_DIR +find /levels/lecture -type f | xargs -I {} chown $lecpriv:$lecuser {} {} +find /levels/lecture -type f | xargs -I {} chmod 4550 {} {} +find /levels/lecture -type f -name '*.c*' | xargs -I {} chown $lecuser:$lecuser {} {} +find /levels/lecture -type f -name '*.c*' | xargs -I {} chmod 0400 {} {} +chattr -fR +i $LEVELS_DIR + +# This needs to be here +echo 'exit 0' >> /etc/rc.local + +echo '*** DONE! ***' +echo -n 'reboot now? (y/n): ' +read REBOOT +if [ "$REBOOT" == 'y' ]; then + reboot +else + echo 'You must reboot for certain settings to kick in' + echo 'Please reboot soon' +fi diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..f89eca1 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds all of the level directories +SUBDIRLIST(SUBDIRS ${CMAKE_CURRENT_SOURCE_DIR}) +foreach(subdir ${SUBDIRS}) + message(STATUS "Building ${subdir}...") + add_subdirectory(${subdir}) +endforeach() diff --git a/src/lab01/CMakeLists.txt b/src/lab01/CMakeLists.txt new file mode 100644 index 0000000..30ff30f --- /dev/null +++ b/src/lab01/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(lab1C lab1C.c) + +add_executable(lab1B lab1B.c) +SET_FLAGS(lab1B "-s") + +add_executable(lab1A lab1A.c) +SET_FLAGS(lab1A "-s") + +# These are the files we want to give students +install(TARGETS lab1C lab1B lab1A DESTINATION "${RELEASE_DIR}/lab01") diff --git a/src/lab01/README.md b/src/lab01/README.md new file mode 100644 index 0000000..0fcacb4 --- /dev/null +++ b/src/lab01/README.md @@ -0,0 +1,16 @@ +## Reversing Labs +I tried to base these more or less on Jeremy's labs. If you get the +key correct, you get a shell, so we can structure these the same way +we've been doing the rest of the levels. + +### Lab C +Simple Integer compare, obvious yes/no path. + +### Lab B +XOR'd string, you supply key by getting the difference between your input +and a hardcoded value. "Correct" path is obfuscated so you have to actually xor +stuff together and reason it out (or thats the idea) + +### Lab A +Simple keygen. The serial is calculated by adding to a base checksum and doing +some XOR / modulus stuff. diff --git a/src/lab01/lab1A.c b/src/lab01/lab1A.c new file mode 100644 index 0000000..536cb28 --- /dev/null +++ b/src/lab01/lab1A.c @@ -0,0 +1,86 @@ +/* +Modern Binary Exploitation +Lab 1: Introduction to Reverse Engineering +LabA: Keygen + +gcc -s -m32 ./labA.c +*/ + +#include +#include +#include +#include +#include + +#include "utils.h" +#define ANSI_COLOR_RED "\x1b[31m" +#define ANSI_COLOR_GREEN "\x1b[32m" +#define ANSI_COLOR_YELLOW "\x1b[33m" + +ENABLE_TIMEOUT(60) + +int auth(char * username, unsigned int serial) { + int i, len; + unsigned int chk; + + username[strcspn(username, "\n")] = 0; + len = strnlen(username, 32); + + deathrays; + if (len < 6) { + return 1; + } + + if (ptrace(PTRACE_TRACEME, 0, 1, 0) == -1) + { + printf(ANSI_COLOR_GREEN ".---------------------------.\n"); + printf(ANSI_COLOR_RED "| !! TAMPERING DETECTED !! |\n"); + printf(ANSI_COLOR_GREEN "'---------------------------'\n"); + + return 1; + } + + chk = (username[3] ^ 0x1337) + 0x5EEDED; + for(i=0; i 127) { + return 1; + } + chk += (username[i] ^ chk) % 1337; + } + + if (serial != chk) { + return 1; + } + + return 0; +} + +int main(int argc, char ** argv) { + unsigned int serial; + char username[32]; + + deathrays; + printf(".---------------------------.\n"); + printf("|--------- RPISEC --------|\n"); + printf("|+ SECURE LOGIN SYS v. 3.0 +|\n"); + printf("|---------------------------|\n"); + + printf("|~- Enter your Username: ~-|\n"); + printf("'---------------------------'\n"); + fgets(username, 32, stdin); + + printf(".---------------------------.\n"); + printf("| !! NEW ACCOUNT DETECTED !!|\n"); + printf("|---------------------------|\n"); + printf("|~- Input your serial: ~-|\n"); + printf("'---------------------------'\n"); + scanf("%u", &serial); + + if(!auth(username, serial)) { + printf("Authenticated!\n"); + system("/bin/sh"); + return EXIT_SUCCESS; + } + + return EXIT_FAILURE; +} diff --git a/src/lab01/lab1B.c b/src/lab01/lab1B.c new file mode 100644 index 0000000..3232848 --- /dev/null +++ b/src/lab01/lab1B.c @@ -0,0 +1,121 @@ +/* +Modern Binary Exploitation +Lab 1: Introduction to Reverse Engineering +LabB: Harder CrackMe + +gcc -s -m32 ./labB.c +*/ + +#include +#include +#include +#include + +#include "utils.h" + +void decrypt(unsigned int key) { + unsigned int len; + unsigned int i; + char str[] = "Q}|u`sfg~sf{}|a3"; + + deathrays; + len = strlen(str); + + for (i=0; i +#include + +int main(int argc, char ** argv) { + int input; + + printf("-----------------------------\n"); + printf("--- RPISEC - CrackMe v1.0 ---\n"); + printf("-----------------------------\n"); + printf("\nPassword: "); + scanf("%d", &input); + + if (input == 0x149A) { + printf("\nAuthenticated!\n"); + system("/bin/sh"); + } + else { + printf("\nInvalid Password!!!\n"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/src/lab02/CMakeLists.txt b/src/lab02/CMakeLists.txt new file mode 100644 index 0000000..0b1a2dc --- /dev/null +++ b/src/lab02/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(lab2C lab2C.c) +SET_FLAGS(lab2C "-O0 -fno-stack-protector") + +add_executable(lab2B lab2B.c) +SET_FLAGS(lab2B "-O0 -fno-stack-protector") + +add_executable(lab2A lab2A.c) +SET_FLAGS(lab2A "-O0 -fno-stack-protector") + +# These are the files we want to give students +install(TARGETS lab2C lab2B lab2A DESTINATION "${RELEASE_DIR}/lab02") +install(FILES lab2C.c lab2B.c lab2A.c DESTINATION "${RELEASE_DIR}/lab02") diff --git a/src/lab02/lab2A.c b/src/lab02/lab2A.c new file mode 100644 index 0000000..9dd363a --- /dev/null +++ b/src/lab02/lab2A.c @@ -0,0 +1,59 @@ +#include +#include +#include + +/* + * compiled with: + * gcc -O0 -fno-stack-protector lab2A.c -o lab2A + */ + +void shell() +{ + printf("You got it\n"); + system("/bin/sh"); +} + +void concatenate_first_chars() +{ + struct { + char word_buf[12]; + int i; + char* cat_pointer; + char cat_buf[10]; + } locals; + locals.cat_pointer = locals.cat_buf; + + printf("Input 10 words:\n"); + for(locals.i=0; locals.i!=10; locals.i++) + { + // Read from stdin + if(fgets(locals.word_buf, 0x10, stdin) == 0 || locals.word_buf[0] == '\n') + { + printf("Failed to read word\n"); + return; + } + // Copy first char from word to next location in concatenated buffer + *locals.cat_pointer = *locals.word_buf; + locals.cat_pointer++; + } + + // Even if something goes wrong, there's a null byte here + // preventing buffer overflows + locals.cat_buf[10] = '\0'; + printf("Here are the first characters from the 10 words concatenated:\n\ +%s\n", locals.cat_buf); +} + +int main(int argc, char** argv) +{ + if(argc != 1) + { + printf("usage:\n%s\n", argv[0]); + return EXIT_FAILURE; + } + + concatenate_first_chars(); + + printf("Not authenticated\n"); + return EXIT_SUCCESS; +} diff --git a/src/lab02/lab2B.c b/src/lab02/lab2B.c new file mode 100644 index 0000000..426576b --- /dev/null +++ b/src/lab02/lab2B.c @@ -0,0 +1,35 @@ +#include +#include +#include + +/* + * compiled with: + * gcc -O0 -fno-stack-protector lab2B.c -o lab2B + */ + +char* exec_string = "/bin/sh"; + +void shell(char* cmd) +{ + system(cmd); +} + +void print_name(char* input) +{ + char buf[15]; + strcpy(buf, input); + printf("Hello %s\n", buf); +} + +int main(int argc, char** argv) +{ + if(argc != 2) + { + printf("usage:\n%s string\n", argv[0]); + return EXIT_FAILURE; + } + + print_name(argv[1]); + + return EXIT_SUCCESS; +} diff --git a/src/lab02/lab2C.c b/src/lab02/lab2C.c new file mode 100644 index 0000000..e7592ac --- /dev/null +++ b/src/lab02/lab2C.c @@ -0,0 +1,38 @@ +#include +#include +#include + +/* + * compiled with: + * gcc -O0 -fno-stack-protector lab2C.c -o lab2C + */ + +void shell() +{ + printf("You did it.\n"); + system("/bin/sh"); +} + +int main(int argc, char** argv) +{ + if(argc != 2) + { + printf("usage:\n%s string\n", argv[0]); + return EXIT_FAILURE; + } + + int set_me = 0; + char buf[15]; + strcpy(buf, argv[1]); + + if(set_me == 0xdeadbeef) + { + shell(); + } + else + { + printf("Not authenticated.\nset_me was %d\n", set_me); + } + + return EXIT_SUCCESS; +} diff --git a/src/lab03/CMakeLists.txt b/src/lab03/CMakeLists.txt new file mode 100644 index 0000000..061b6e0 --- /dev/null +++ b/src/lab03/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(lab3C lab3C.c) +SET_FLAGS(lab3C "${NO_MITS_FLAGS}") + +add_executable(lab3B lab3B.c) +SET_FLAGS(lab3B "${NO_MITS_FLAGS}") + +add_executable(lab3A lab3A.c) +SET_FLAGS(lab3A "${NO_MITS_FLAGS}") + +# These are the files we want to give students +install(TARGETS lab3C lab3B lab3A DESTINATION "${RELEASE_DIR}/lab03") +install(FILES lab3C.c lab3B.c lab3A.c DESTINATION "${RELEASE_DIR}/lab03") + diff --git a/src/lab03/lab3A.c b/src/lab03/lab3A.c new file mode 100644 index 0000000..09668ab --- /dev/null +++ b/src/lab03/lab3A.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include "utils.h" + +#define STORAGE_SIZE 100 + +/* gcc -Wall -z execstack -o lab3A lab3A.c */ + +/* get a number from the user and store it */ +int store_number(unsigned int * data) +{ + unsigned int input = 0; + unsigned int index = 0; + + /* get number to store */ + printf(" Number: "); + input = get_unum(); + + /* get index to store at */ + printf(" Index: "); + index = get_unum(); + + /* make sure the slot is not reserved */ + if(index % 3 == 0 || (input >> 24) == 0xb7) + { + printf(" *** ERROR! ***\n"); + printf(" This index is reserved for quend!\n"); + printf(" *** ERROR! ***\n"); + + return 1; + } + + /* save the number to data storage */ + data[index] = input; + + return 0; +} + +/* returns the contents of a specified storage index */ +int read_number(unsigned int * data) +{ + unsigned int index = 0; + + /* get index to read from */ + printf(" Index: "); + index = get_unum(); + + printf(" Number at data[%u] is %u\n", index, data[index]); + + return 0; +} + +int main(int argc, char * argv[], char * envp[]) +{ + int res = 0; + char cmd[20] = {0}; + unsigned int data[STORAGE_SIZE] = {0}; + + /* doom doesn't like enviroment variables */ + clear_argv(argv); + clear_envp(envp); + + printf("----------------------------------------------------\n"\ + " Welcome to quend's crappy number storage service! \n"\ + "----------------------------------------------------\n"\ + " Commands: \n"\ + " store - store a number into the data storage \n"\ + " read - read a number from the data storage \n"\ + " quit - exit the program \n"\ + "----------------------------------------------------\n"\ + " quend has reserved some storage for herself :> \n"\ + "----------------------------------------------------\n"\ + "\n"); + + + /* command handler loop */ + while(1) + { + /* setup for this loop iteration */ + printf("Input command: "); + res = 1; + + /* read user input, trim newline */ + fgets(cmd, sizeof(cmd), stdin); + cmd[strlen(cmd)-1] = '\0'; + + /* select specified user command */ + if(!strncmp(cmd, "store", 5)) + res = store_number(data); + else if(!strncmp(cmd, "read", 4)) + res = read_number(data); + else if(!strncmp(cmd, "quit", 4)) + break; + + /* print the result of our command */ + if(res) + printf(" Failed to do %s command\n", cmd); + else + printf(" Completed %s command successfully\n", cmd); + + memset(cmd, 0, sizeof(cmd)); + } + + return EXIT_SUCCESS; +} diff --git a/src/lab03/lab3B.c b/src/lab03/lab3B.c new file mode 100644 index 0000000..19c4941 --- /dev/null +++ b/src/lab03/lab3B.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "utils.h" + +ENABLE_TIMEOUT(60) + +/* gcc -z execstack -fno-stack-protector -o lab3B lab3B.c */ + +/* hint: write shellcode that opens and reads the .pass file. + ptrace() is meant to deter you from using /bin/sh shellcode */ + +int main() +{ + pid_t child = fork(); + char buffer[128] = {0}; + int syscall = 0; + int status = 0; + + if(child == 0) + { + prctl(PR_SET_PDEATHSIG, SIGHUP); + ptrace(PTRACE_TRACEME, 0, NULL, NULL); + + /* this is all you need to worry about */ + puts("just give me some shellcode, k"); + gets(buffer); + } + else + { + /* mini exec() sandbox, you can ignore this */ + while(1) + { + wait(&status); + if (WIFEXITED(status) || WIFSIGNALED(status)){ + puts("child is exiting..."); + break; + } + + /* grab the syscall # */ + syscall = ptrace(PTRACE_PEEKUSER, child, 4 * ORIG_EAX, NULL); + + /* filter out syscall 11, exec */ + if(syscall == 11) + { + printf("no exec() for you\n"); + kill(child, SIGKILL); + break; + } + } + } + + return EXIT_SUCCESS; +} diff --git a/src/lab03/lab3C.c b/src/lab03/lab3C.c new file mode 100644 index 0000000..bf46c71 --- /dev/null +++ b/src/lab03/lab3C.c @@ -0,0 +1,49 @@ +#include +#include +#include + +/* gcc -z execstack -fno-stack-protector -o lab3C lab3C.c */ + +char a_user_name[100]; + +int verify_user_name() +{ + puts("verifying username....\n"); + return strncmp(a_user_name, "rpisec", 6); +} + +int verify_user_pass(char *a_user_pass) +{ + return strncmp(a_user_pass, "admin", 5); +} + +int main() +{ + char a_user_pass[64] = {0}; + int x = 0; + + /* prompt for the username - read 100 byes */ + printf("********* ADMIN LOGIN PROMPT *********\n"); + printf("Enter Username: "); + fgets(a_user_name, 0x100, stdin); + + /* verify input username */ + x = verify_user_name(); + if (x != 0){ + puts("nope, incorrect username...\n"); + return EXIT_FAILURE; + } + + /* prompt for admin password - read 64 bytes */ + printf("Enter Password: \n"); + fgets(a_user_pass, 0x64, stdin); + + /* verify input password */ + x = verify_user_pass(a_user_pass); + if (x == 0 || x != 0){ + puts("nope, incorrect password...\n"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/src/lab04/CMakeLists.txt b/src/lab04/CMakeLists.txt new file mode 100644 index 0000000..c46dbe4 --- /dev/null +++ b/src/lab04/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(lab4C lab4C.c) +SET_FLAGS(lab4C "${NO_MITS_FLAGS}") + +add_executable(lab4B lab4B.c) +SET_FLAGS(lab4B "${NO_MITS_FLAGS}") + +add_executable(lab4A lab4A.c) +SET_FLAGS(lab4A "-z execstack -z relro -z now") + +# These are the files we want to give students +install(TARGETS lab4C lab4B lab4A DESTINATION "${RELEASE_DIR}/lab04") +install(FILES lab4C.c lab4B.c lab4A.c DESTINATION "${RELEASE_DIR}/lab04") + diff --git a/src/lab04/lab4A.c b/src/lab04/lab4A.c new file mode 100644 index 0000000..bc8aca4 --- /dev/null +++ b/src/lab04/lab4A.c @@ -0,0 +1,74 @@ +/* + * Format String Lab - A Problem + * gcc -z execstack -z relro -z now -o lab4A lab4A.c + */ +#include +#include +#include +#include +#include +#include +#include + +#define BACKUP_DIR "./backups/" +#define LOG_FILE "./backups/.log" + +void +log_wrapper(FILE *logf, char *msg, char *filename) +{ + char log_buf[255]; + strcpy(log_buf, msg); + snprintf(log_buf+strlen(log_buf), 255-strlen(log_buf)-1/*NULL*/, filename); + log_buf[strcspn(log_buf, "\n")] = '\0'; + fprintf(logf, "LOG: %s\n", log_buf); +} + +int +main(int argc, char *argv[]) +{ + char ch = EOF; + char dest_buf[100]; + FILE *source, *logf; + int target = -1; + + if (argc != 2) { + printf("Usage: %s filename\n", argv[0]); + } + + // Open log file + logf = fopen(LOG_FILE, "w"); + if (logf == NULL) { + printf("ERROR: Failed to open %s\n", LOG_FILE); + exit(EXIT_FAILURE); + } + + log_wrapper(logf, "Starting back up: ", argv[1]); + + // Open source + source = fopen(argv[1], "r"); + if (source == NULL) { + printf("ERROR: Failed to open %s\n", argv[1]); + exit(EXIT_FAILURE); + } + + // Open dest + strcpy(dest_buf, BACKUP_DIR); + strncat(dest_buf, argv[1], 100-strlen(dest_buf)-1/*NULL*/); + target = open(dest_buf, O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR); + if (target < 0) { + printf("ERROR: Failed to open %s%s\n", BACKUP_DIR, argv[1]); + exit(EXIT_FAILURE); + } + + // Copy data + while( ( ch = fgetc(source) ) != EOF) + write(target, &ch, 1); + + log_wrapper(logf, "Finished back up ", argv[1]); + + // Clean up + fclose(source); + close(target); + + return EXIT_SUCCESS; +} diff --git a/src/lab04/lab4B.c b/src/lab04/lab4B.c new file mode 100644 index 0000000..28376f7 --- /dev/null +++ b/src/lab04/lab4B.c @@ -0,0 +1,27 @@ +/* + * Format String Lab - B Problem + * gcc -z execstack -z norelro -fno-stack-protector -o lab4B lab4B.c + */ +#include +#include +#include + +int main(int argc, char *argv[]) +{ + int i = 0; + char buf[100]; + + /* read user input securely */ + fgets(buf, 100, stdin); + + /* convert string to lowercase */ + for (i = 0; i < strlen(buf); i++) + if (buf[i] >= 'A' && buf[i] <= 'Z') + buf[i] = buf[i] ^ 0x20; + + /* print out our nice and new lowercase string */ + printf(buf); + + exit(EXIT_SUCCESS); + return EXIT_FAILURE; +} diff --git a/src/lab04/lab4C.c b/src/lab04/lab4C.c new file mode 100644 index 0000000..9278d1d --- /dev/null +++ b/src/lab04/lab4C.c @@ -0,0 +1,66 @@ +/* + * Format String Lab - C Problem + * gcc -z execstack -z norelro -fno-stack-protector -o lab4C lab4C.c + */ +#include +#include +#include +#include + +#define PASS_LEN 30 + +int main(int argc, char *argv[]) +{ + char username[100] = {0}; + char real_pass[PASS_LEN] = {0}; + char in_pass[100] = {0}; + FILE *pass_file = NULL; + int rsize = 0; + + /* open the password file */ + pass_file = fopen("/home/lab4B/.pass", "r"); + if (pass_file == NULL) { + fprintf(stderr, "ERROR: failed to open password file\n"); + exit(EXIT_FAILURE); + } + + /* read the contents of the password file */ + rsize = fread(real_pass, 1, PASS_LEN, pass_file); + real_pass[strcspn(real_pass, "\n")] = '\0'; // strip \n + if (rsize != PASS_LEN) { + fprintf(stderr, "ERROR: failed to read password file\n"); + exit(EXIT_FAILURE); + } + + /* close the password file */ + fclose(pass_file); + + puts("===== [ Secure Access System v1.0 ] ====="); + puts("-----------------------------------------"); + puts("- You must login to access this system. -"); + puts("-----------------------------------------"); + + /* read username securely */ + printf("--[ Username: "); + fgets(username, 100, stdin); + username[strcspn(username, "\n")] = '\0'; // strip \n + + /* read input password securely */ + printf("--[ Password: "); + fgets(in_pass, sizeof(in_pass), stdin); + in_pass[strcspn(in_pass, "\n")] = '\0'; // strip \n + + puts("-----------------------------------------"); + + /* log the user in if the password is correct */ + if(!strncmp(real_pass, in_pass, PASS_LEN)){ + printf("Greetings, %s!\n", username); + system("/bin/sh"); + } else { + printf(username); + printf(" does not have access!\n"); + exit(EXIT_FAILURE); + } + + return EXIT_SUCCESS; +} diff --git a/src/lab05/CMakeLists.txt b/src/lab05/CMakeLists.txt new file mode 100644 index 0000000..3bfe233 --- /dev/null +++ b/src/lab05/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(lab5C lab5C.c) +SET_FLAGS(lab5C "-fno-stack-protector") + +add_executable(lab5B lab5B.c) +SET_FLAGS(lab5B "--static -fno-stack-protector") + +add_executable(lab5A lab5A.c) +SET_FLAGS(lab5A "--static") + +# These are the files we want to give students +install(TARGETS lab5C lab5B lab5A DESTINATION "${RELEASE_DIR}/lab05") +install(FILES lab5C.c lab5B.c lab5A.c DESTINATION "${RELEASE_DIR}/lab05") + diff --git a/src/lab05/lab5A.c b/src/lab05/lab5A.c new file mode 100644 index 0000000..8857c05 --- /dev/null +++ b/src/lab05/lab5A.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include "utils.h" + +#define STORAGE_SIZE 100 + +/* gcc --static -o lab5A lab5A.c */ + +/* get a number from the user and store it */ +int store_number(unsigned int * data) +{ + unsigned int input = 0; + int index = 0; + + /* get number to store */ + printf(" Number: "); + input = get_unum(); + + /* get index to store at */ + printf(" Index: "); + index = (int)get_unum(); + + /* make sure the slot is not reserved */ + if(index % 3 == 0 || index > STORAGE_SIZE || (input >> 24) == 0xb7) + { + printf(" *** ERROR! ***\n"); + printf(" This index is reserved for doom!\n"); + printf(" *** ERROR! ***\n"); + + return 1; + } + + /* save the number to data storage */ + data[index] = input; + + return 0; +} + +/* returns the contents of a specified storage index */ +int read_number(unsigned int * data) +{ + int index = 0; + + /* get index to read from */ + printf(" Index: "); + index = (int)get_unum(); + + printf(" Number at data[%d] is %u\n", index, data[index]); + + return 0; +} + +int main(int argc, char * argv[], char * envp[]) +{ + int res = 0; + char cmd[20] = {0}; + unsigned int data[STORAGE_SIZE] = {0}; + + /* doom doesn't like enviroment variables */ + clear_argv(argv); + clear_envp(envp); + + printf("----------------------------------------------------\n"\ + " Welcome to doom's crappy number storage service! \n"\ + " Version 2.0 - With more security! \n"\ + "----------------------------------------------------\n"\ + " Commands: \n"\ + " store - store a number into the data storage \n"\ + " read - read a number from the data storage \n"\ + " quit - exit the program \n"\ + "----------------------------------------------------\n"\ + " doom has reserved some storage for himself :> \n"\ + "----------------------------------------------------\n"\ + "\n"); + + + /* command handler loop */ + while(1) + { + /* setup for this loop iteration */ + printf("Input command: "); + res = 1; + + /* read user input, trim newline */ + fgets(cmd, sizeof(cmd), stdin); + cmd[strlen(cmd)-1] = '\0'; + + /* select specified user command */ + if(!strncmp(cmd, "store", 5)) + res = store_number(data); + else if(!strncmp(cmd, "read", 4)) + res = read_number(data); + else if(!strncmp(cmd, "quit", 4)) + break; + + /* print the result of our command */ + if(res) + printf(" Failed to do %s command\n", cmd); + else + printf(" Completed %s command successfully\n", cmd); + + memset(cmd, 0, sizeof(cmd)); + } + + return EXIT_SUCCESS; +} diff --git a/src/lab05/lab5B.c b/src/lab05/lab5B.c new file mode 100644 index 0000000..1f4effa --- /dev/null +++ b/src/lab05/lab5B.c @@ -0,0 +1,15 @@ +#include +#include + +/* gcc -fno-stack-protector --static -o lab5B lab5B.c */ + +int main() +{ + + char buffer[128] = {0}; + + printf("Insert ROP chain here:\n"); + gets(buffer); + + return EXIT_SUCCESS; +} diff --git a/src/lab05/lab5C.c b/src/lab05/lab5C.c new file mode 100644 index 0000000..12a4739 --- /dev/null +++ b/src/lab05/lab5C.c @@ -0,0 +1,26 @@ +#include +#include + +/* gcc -fno-stack-protector -o lab5C lab5C.c */ + +char global_str[128]; + +/* reads a string, copies it to a global */ +void copytoglobal() +{ + char buffer[128] = {0}; + gets(buffer); + memcpy(global_str, buffer, 128); +} + +int main() +{ + char buffer[128] = {0}; + + printf("I included libc for you...\n"\ + "Can you ROP to system()?\n"); + + copytoglobal(); + + return EXIT_SUCCESS; +} diff --git a/src/lab06/CMakeLists.txt b/src/lab06/CMakeLists.txt new file mode 100644 index 0000000..df0c590 --- /dev/null +++ b/src/lab06/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(lab6C lab6C.c) +SET_FLAGS(lab6C "-pie -fPIE -fno-stack-protector") + +add_executable(lab6B lab6B.c) +SET_FLAGS(lab6B "-z relro -z now -pie -fPIE -fno-stack-protector") + +add_executable(lab6A lab6A.c) +SET_FLAGS(lab6A "-pie -fPIE") + +# These are the files we want to give students +install(TARGETS lab6C lab6B lab6A DESTINATION "${RELEASE_DIR}/lab06") +install(FILES lab6C.c lab6B.c lab6B.readme lab6A.c DESTINATION "${RELEASE_DIR}/lab06") diff --git a/src/lab06/lab6A.c b/src/lab06/lab6A.c new file mode 100644 index 0000000..bfb37a0 --- /dev/null +++ b/src/lab06/lab6A.c @@ -0,0 +1,123 @@ +/* +Exploitation with ASLR enabled +Lab A + +gcc -fpie -pie -o lab6A ./lab6A.c + +Patrick Biernat +*/ + +#include +#include +#include +#include "utils.h" + +struct uinfo { + char name[32]; + char desc[128]; + unsigned int sfunc; +}user; + + +struct item { + char name[32]; + char price[10]; +}aitem; + +struct item ulisting; + +void write_wrap(char ** buf) { + write(1, *buf, 8); +} + +void make_note() { + char note[40]; + printf("Make a Note About your listing...: "); + gets(note); +} + +void print_listing() { + printf( + "Here is the listing you've created: \n"); + if(*ulisting.name == '\x00') { + return; + } + printf("Item: %s\n", ulisting.name); + printf("Price: %s\n",ulisting.price); +} + +void make_listing() { + printf("Enter your item's name: "); + fgets(ulisting.name, 31, stdin); + printf("Enter your item's price: "); + fgets(ulisting.price, 9, stdin); +} + +void setup_account(struct uinfo * user) { + char temp[128]; + memset(temp, 0, 128); + printf("Enter your name: "); + read(0, user->name, sizeof(user->name)); + printf("Enter your description: "); + read(0, temp, sizeof(user->desc)); + strncpy(user->desc, user->name,32); + strcat(user->desc, " is a "); + + memcpy(user->desc + strlen(user->desc), temp, strlen(temp)); +} + +void print_name(struct uinfo * info) { + printf("Username: %s\n", info->name); +} + +int main(int argc, char ** argv) { + disable_buffering(stdout); + struct uinfo merchant; + char choice[4]; + + printf( + ".-------------------------------------------------. \n" \ + "| Welcome to l337-Bay + | \n" + "|-------------------------------------------------| \n" + "|1: Setup Account | \n" + "|2: Make Listing | \n" + "|3: View Info | \n" + "|4: Exit | \n" + "|-------------------------------------------------| \n" ); + + // Initialize user info + memset(merchant.name, 0, 32); + memset(merchant.desc, 0 , 64); + merchant.sfunc = (unsigned int)print_listing; + + //initialize listing + memset(ulisting.name, 0, 32); + memset(ulisting.price, 0, 10); + + while(1) { + memset(choice, 0, 4); + printf("Enter Choice: "); + + if (fgets(choice, 2, stdin) == 0) { + break; + } + getchar(); // Eat the newline + + if (!strncmp(choice, "1",1)) { + setup_account(&merchant); + } + if (!strncmp(choice, "2",1)) { + make_listing(); + } + if (!strncmp(choice, "3",1)) { // ITS LIKE HAVING CLASSES IN C! + ( (void (*) (struct uinfo *) ) merchant.sfunc) (&merchant); + } + if (!strncmp(choice, "4",1)) { + return EXIT_SUCCESS; + } + + } + + + return EXIT_SUCCESS; +} diff --git a/src/lab06/lab6B.c b/src/lab06/lab6B.c new file mode 100644 index 0000000..6af08c0 --- /dev/null +++ b/src/lab06/lab6B.c @@ -0,0 +1,191 @@ +/* doom's +/* compiled with: gcc -z relro -z now -pie -fPIE -fno-stack-protector -o lab6B lab6B.c */ + +#include +#include +#include +#include +#include "utils.h" + +ENABLE_TIMEOUT(300) + +/* log the user in */ +int login() +{ + printf("WELCOME MR. FALK\n"); + + /* you win */ + system("/bin/sh"); + return 0; +} + +/* doom's super secret password mangling scheme */ +void hash_pass(char * password, char * username) +{ + int i = 0; + + /* hash pass with chars of username */ + while(password[i] && username[i]) + { + password[i] ^= username[i]; + i++; + } + + /* hash rest of password with a pad char */ + while(password[i]) + { + password[i] ^= 0x44; + i++; + } + + return; +} + +/* doom's super secure password read function */ +int load_pass(char ** password) +{ + FILE * fd = 0; + int fail = -1; + int psize = 0; + + /* open the password file */ + fd = fopen("/home/lab6A/.pass", "r"); + if(fd == NULL) + { + printf("Could not open secret pass!\n"); + return fail; + } + + /* get the size of the password */ + if(fseek(fd, 0, SEEK_END)) + { + printf("Failed to seek to end of pass!\n"); + return fail; + } + + psize = ftell(fd); + + if(psize == 0 || psize == -1) + { + printf("Could not get pass size!\n"); + return fail; + } + + /* reset stream */ + if(fseek(fd, 0, SEEK_SET)) + { + printf("Failed to see to the start of pass!\n"); + return fail; + } + + /* allocate a buffer for the password */ + *password = (char *)malloc(psize); + if(password == NULL) + { + printf("Could not malloc for pass!\n"); + return fail; + } + + /* make sure we read in the whole password */ + if(fread(*password, sizeof(char), psize, fd) != psize) + { + printf("Could not read secret pass!\n"); + free(*password); + return fail; + } + + fclose(fd); + + /* successfully read in the password */ + return psize; +} + +int login_prompt(int pwsize, char * secretpw) +{ + char password[32]; + char username[32]; + char readbuff[128]; + int attempts = -3; + int result = -1; + + /* login prompt loop */ + while(attempts++) + { + /* clear our buffers to avoid any sort of data re-use */ + memset(password, 0, sizeof(password)); + memset(username, 0, sizeof(username)); + memset(readbuff, 0, sizeof(readbuff)); + + /* safely read username */ + printf("Enter your username: "); + fgets(readbuff, sizeof(readbuff), stdin); + + /* use safe strncpy to copy username from the read buffer */ + strncpy(username, readbuff, sizeof(username)); + + /* safely read password */ + printf("Enter your password: "); + fgets(readbuff, sizeof(readbuff), stdin); + + /* use safe strncpy to copy password from the read buffer */ + strncpy(password, readbuff, sizeof(password)); + + /* hash the input password for this attempt */ + hash_pass(password, username); + + /* check if password is correct */ + if(pwsize > 16 && memcmp(password, secretpw, pwsize) == 0) + { + login(); + result = 0; + break; + } + + printf("Authentication failed for user %s\n", username); + } + + return result; +} + +int main(int argc, char* argv[]) +{ + int pwsize; + char * secretpw; + + disable_buffering(stdout); + + /* load the secret pass */ + pwsize = load_pass(&secretpw); + pwsize = pwsize > 32 ? 32 : pwsize; + + /* failed to load password */ + if(pwsize == 0 || pwsize == -1) + return EXIT_FAILURE; + + /* hash the password we'll be comparing against */ + hash_pass(secretpw, "lab6A"); + printf("----------- FALK OS LOGIN PROMPT -----------\n"); + + /* authorization loop */ + if(login_prompt(pwsize, secretpw)) + { + + /* print the super serious warning to ward off hackers */ + printf("+-------------------------------------------------------+\n"\ + "|WARNINGWARNINGWARNINGWARNINGWARNINGWARNINGWARNINGWARNIN|\n"\ + "|GWARNINGWARNI - TOO MANY LOGIN ATTEMPTS - NGWARNINGWARN|\n"\ + "|INGWARNINGWARNINGWARNINGWARNINGWARNINGWARNINGWARNINGWAR|\n"\ + "+-------------------------------------------------------+\n"\ + "| We have logged this session and will be |\n"\ + "| sending it to the proper CCDC CTF teams to analyze |\n"\ + "| ----------------------------- |\n"\ + "| The CCDC cyber team dispatched will use their |\n"\ + "| masterful IT and networking skills to trace |\n"\ + "| you down and serve swift american justice |\n"\ + "+-------------------------------------------------------+\n"); + + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/src/lab06/lab6B.readme b/src/lab06/lab6B.readme new file mode 100644 index 0000000..cf118c5 --- /dev/null +++ b/src/lab06/lab6B.readme @@ -0,0 +1,8 @@ +lab6B is not a suid binary, instead you must pwn the privileged +service running on port 6642 + +Using netcat: + nc wargame.server.example 6642 -vvv + +Your final exploit must work against this service in order to +get the .pass file from the lab6A user. diff --git a/src/lab06/lab6C.c b/src/lab06/lab6C.c new file mode 100644 index 0000000..dfdd3d6 --- /dev/null +++ b/src/lab06/lab6C.c @@ -0,0 +1,94 @@ +/* +Exploitation with ASLR +Lab C + + gcc -pie -fPIE -fno-stack-protector -o lab6C lab6C.c +*/ + +#include +#include +#include + +struct savestate { + char tweet[140]; + char username[40]; + int msglen; +} save; + +void set_tweet(struct savestate *save ); +void set_username(struct savestate * save); + +void handle_tweet() +{ + struct savestate save; + + /* Initialize our save state to sane values. */ + memset(save.username, 0, 40); + save.msglen = 140; + + /* read a username and tweet from the user */ + set_username(&save); + set_tweet(&save); + + printf(">: Tweet sent!\n"); + return; +} + +void set_tweet(struct savestate *save ) +{ + char readbuf[1024]; + memset(readbuf, 0, 1024); + + printf(">: Tweet @Unix-Dude\n"); + printf(">>: "); + + /* read a tweet from the user, safely copy it to struct */ + fgets(readbuf, 1024, stdin); + strncpy(save->tweet, readbuf, save->msglen); + + return; +} + +void set_username(struct savestate * save) +{ + int i; + char readbuf[128]; + memset(readbuf, 0, 128); + + printf(">: Enter your username\n"); + printf(">>: "); + + /* Read and copy the username to our savestate */ + fgets(readbuf, 128, stdin); + for(i = 0; i <= 40 && readbuf[i]; i++) + save->username[i] = readbuf[i]; + + printf(">: Welcome, %s", save->username); + return; +} + +/* debug functionality, not used in production */ +void secret_backdoor() +{ + char cmd[128]; + + /* reads a command and executes it */ + fgets(cmd, 128, stdin); + system(cmd); + + return; +} + +int main(int argc, char * argv[]) +{ + + printf( + "--------------------------------------------\n" \ + "| ~Welcome to l33t-tw33ts ~ v.0.13.37 |\n" \ + "--------------------------------------------\n"); + + /* make some tweets */ + handle_tweet(); + + return EXIT_SUCCESS; +} diff --git a/src/lab07/CMakeLists.txt b/src/lab07/CMakeLists.txt new file mode 100644 index 0000000..12a81a1 --- /dev/null +++ b/src/lab07/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(lab7C lab7C.c) +SET_FLAGS(lab7C "-z relro -z now -fPIE -pie -fstack-protector-all") + +add_executable(lab7A lab7A.c) +SET_FLAGS(lab7A "-static -z relro -z now -fstack-protector-all") + +# These are the files we want to give students +install(TARGETS lab7C lab7A DESTINATION "${RELEASE_DIR}/lab07") +install(FILES lab7C.c lab7A.c lab7A.readme DESTINATION "${RELEASE_DIR}/lab07") diff --git a/src/lab07/lab7A.c b/src/lab07/lab7A.c new file mode 100644 index 0000000..af0a032 --- /dev/null +++ b/src/lab07/lab7A.c @@ -0,0 +1,273 @@ +/* compiled with: gcc -static -z relro -z now -fstack-protector-all -o lab7A lab7A.c */ + +#include +#include +#include +#include +#include +#include "utils.h" + +ENABLE_TIMEOUT(60) + +#define MAX_MSG 10 +#define MAX_BLOCKS 32 +#define BLOCK_SIZE 4 + +struct msg { + void (* print_msg)(struct msg *); + unsigned int xor_pad[MAX_BLOCKS]; + unsigned int message[MAX_BLOCKS]; + unsigned int msg_len; +}; + +struct msg * messages[MAX_MSG]; + +/* apply one time pad */ +void encdec_message(unsigned int * message, unsigned int * xor_pad) +{ + int i = 0; + for(i = 0; i < MAX_BLOCKS; i++) + message[i] ^= xor_pad[i]; +} + +/* print information about the given message */ +void print_message(struct msg * to_print) +{ + unsigned int i = 0; + char * xor_pad; + char * message; + + xor_pad = (char *)&to_print->xor_pad; + message = (char *)&to_print->message; + + /* print the message's xor pad */ + printf("\nXOR Pad: \n" + "-----------------------------------------\n"); + + for(i = 0; i < BLOCK_SIZE*MAX_BLOCKS; i++) + { + printf("%02x", xor_pad[i] & 0xFF); + if(i % 32 == 31) + puts(""); + } + + /* print encrypted message */ + printf("\nEncrypted Message: \n" + "-----------------------------------------\n"); + + for(i = 0; i < BLOCK_SIZE*MAX_BLOCKS; i++) + { + printf("%02x", message[i] & 0xFF); + if(i % 32 == 31) + puts(""); + } + + puts(""); +} + +/* creates a message */ +int create_message() +{ + int i, j; + struct msg * new_msg = NULL; + + /* find a free message slot */ + for(i = 0; i < MAX_MSG; i++) + if(messages[i] == NULL) + break; + + /* make sure we actually found an empty slot */ + if(messages[i]) + { + printf("-No message slots left!\n"); + return 1; + } + + printf("-Using message slot #%u\n", i); + + /* initialize new message */ + new_msg = malloc(sizeof(struct msg)); + memset(new_msg, 0, sizeof(struct msg)); + new_msg->print_msg = &print_message; + + for(j = 0; j < MAX_BLOCKS; j++) + new_msg->xor_pad[j] = rand(); + + /* get the length of data the user intends to encrypt */ + printf("-Enter data length: "); + + new_msg->msg_len = get_unum(); + + if(new_msg->msg_len == 0) + { + printf("-Message length must be greater than zero!\n"); + free(new_msg); + return 1; + } + + /* make sure the message length is no bigger than the xor pad */ + if((new_msg->msg_len / BLOCK_SIZE) > MAX_BLOCKS) + new_msg->msg_len = BLOCK_SIZE * MAX_BLOCKS; + + /* read in the message to encrypt with the xor pad */ + printf("-Enter data to encrypt: "); + read(0, &new_msg->message, new_msg->msg_len); + + /* encrypt message */ + encdec_message(new_msg->message, new_msg->xor_pad); + + /* save the new message to the global list */ + messages[i] = new_msg; + + return 0; +} + +int edit_message() +{ + char numbuf[32]; + unsigned int i = 0; + + /* get message index to destroy */ + printf("-Input message index to edit: "); + fgets(numbuf, sizeof(numbuf), stdin); + i = strtoul(numbuf, NULL, 10); + + if(i >= MAX_MSG || messages[i] == NULL) + { + printf("-Invalid message index!\n"); + return 1; + } + + printf("-Input new message to encrypt: "); + + /* clear old message, and read in a new one */ + memset(&messages[i]->message, 0, BLOCK_SIZE * MAX_BLOCKS); + read(0, &messages[i]->message, messages[i]->msg_len); + + /* encrypt message */ + encdec_message(messages[i]->message, messages[i]->xor_pad); + + return 0; +} + +/* free a secure message */ +int destroy_message() +{ + char numbuf[32]; + unsigned int i = 0; + + /* get message index to destroy */ + printf("-Input message index to destroy: "); + fgets(numbuf, sizeof(numbuf), stdin); + i = strtoul(numbuf, NULL, 10); + + if(i >= MAX_MSG || messages[i] == NULL) + { + printf("-Invalid message index!\n"); + return 1; + } + + /* destroy message */ + memset(messages[i], 0, sizeof(struct msg)); + free(messages[i]); + messages[i] = NULL; + + return 0; +} + +/* print a message at a select index */ +int print_index() +{ + char numbuf[32]; + unsigned int i = 0; + + /* get message index to print */ + printf("-Input message index to print: "); + fgets(numbuf, sizeof(numbuf), stdin); + i = strtoul(numbuf, NULL, 10); + + if(i >= MAX_MSG || messages[i] == NULL) + { + printf("-Invalid message index!\n"); + return 1; + } + + /* print the message of interest */ + messages[i]->print_msg(messages[i]); + + return 0; +} + +/* the vulnerability is in here */ +void print_menu() +{ + printf("+---------------------------------------+\n" + "| Doom's OTP Service v1.0 |\n" + "+---------------------------------------+\n" + "|------------ Services Menu ------------|\n" + "|---------------------------------------|\n" + "| 1. Create secure message |\n" + "| 2. Edit secure message |\n" + "| 3. Destroy secure message |\n" + "| 4. Print message details |\n" + "| 5. Quit |\n" + "+---------------------------------------+\n"); +} + +int main() +{ + int choice = 0; + srand(time(NULL)); + disable_buffering(stdout); + + while(1) + { + print_menu(); + + /* get menu option */ + printf("Enter Choice: "); + choice = get_unum(); + + printf("-----------------------------------------\n"); + + /* handle menu selection */ + if(choice == 1) + { + if(create_message()) + printf("-Failed to create message!\n"); + else + printf("-Message created successfully!\n"); + } + else if(choice == 2) + { + if(edit_message()) + printf("-Failed to edit message!\n"); + else + printf("-Message has been successfully modified!\n"); + } + else if(choice == 3) + { + if(destroy_message()) + printf("-Failed to destroy message!\n"); + else + printf("-Message destroyed!\n"); + } + else if(choice == 4) + { + if(print_index()) + printf("-Failed to print message!\n"); + } + else if(choice == 5) + { + break; // exit + } + else + printf("-Invalid choice!\n"); + + choice = 0; + puts(""); + } + + printf("See you tomorrow!\n"); + return EXIT_SUCCESS; +} diff --git a/src/lab07/lab7A.readme b/src/lab07/lab7A.readme new file mode 100644 index 0000000..651c6bb --- /dev/null +++ b/src/lab07/lab7A.readme @@ -0,0 +1,3 @@ +lab7A is a remote level much like lab6B. It is running on port 7741. + +nc wargame.server.example 7741 -vvv diff --git a/src/lab07/lab7C.c b/src/lab07/lab7C.c new file mode 100644 index 0000000..80ca684 --- /dev/null +++ b/src/lab07/lab7C.c @@ -0,0 +1,185 @@ +/* compiled with: gcc -z relro -z now -fPIE -pie -fstack-protector-all -o lab7C lab7C.c */ +#include +#include +#include +#include +#include "utils.h" + +#define MAX_STR 6 +#define MAX_NUM 6 + +struct data { + char reserved[8]; + char buffer[20]; + void (* print)(char *); +}; + +struct number { + unsigned int reserved[6]; // implement later + void (* print)(unsigned int); + unsigned int num; +}; + +void small_str(char * a_str) +{ + printf("here's your lame string: %s\n", a_str); +} + +void big_str(char * a_str) +{ + printf("nice big str yo: %s\n", a_str); +} + +void small_num(unsigned int a_num) +{ + printf("not 1337 enough: %u\n", a_num); +} + +void big_num(unsigned int a_num) +{ + printf("tite number dawg: %u\n", a_num); +} + +void print_menu() +{ + printf("-- UAF Playground Menu ----------------------\n" + "1. Make a string\n" + "2. Make a number\n" + "3. Delete a string\n" + "4. Delete a number\n" + "5. Print a string\n" + "6. Print a number\n" + "7. Quit\n" + "---------------------------------------------\n" + "Enter Choice: "); +} + +/* bugs galore... but no memory corruption! */ +int main(int argc, char * argv[]) +{ + struct data * strings[MAX_STR] = {0}; + struct number * numbers[MAX_NUM] = {0}; + struct data * tempstr = NULL; + struct number * tempnum = NULL; + + int strcnt = 0; + int numcnt = 0; + unsigned int choice = 0; + unsigned int index = 0; + + while(1) + { + print_menu(); + + /* get menu option */ + if((choice = get_unum()) == EOF) + break; + + /* make a string */ + if(choice == 1) + { + if(strcnt < MAX_STR) + { + tempstr = malloc(sizeof(struct data)); + + /* no memory corruption this time */ + printf("Input string to store: "); + fgets(tempstr->buffer, 20, stdin); + tempstr->buffer[strcspn(tempstr->buffer, "\n")] = 0; + + /* pick a print function */ + tempstr->print = strlen(tempstr->buffer) > 10 ? big_str : small_str; + + /* store the string to our master list */ + strings[++strcnt] = tempstr; + printf("Created new string!\n"); + } + else + printf("Please delete a string before trying to make another!\n"); + } + + /* make a number */ + else if(choice == 2) + { + if(numcnt < MAX_NUM) + { + tempnum = malloc(sizeof(struct number)); + + printf("Input number to store: "); + tempnum->num = get_unum(); + + /* pick a print function */ + tempnum->print = tempnum->num > 0x31337 ? big_num : small_num; + + /* store the number to our master list */ + numbers[++numcnt] = tempnum; + printf("Created new number!\n"); + } + else + printf("Please delete a number before trying to make another!\n"); + } + + /* delete a string */ + else if(choice == 3) + { + if(strcnt && strings[strcnt]) + { + free(strings[strcnt--]); + printf("Deleted most recent string!\n"); + } + else + printf("There are no strings left to delete!\n"); + } + + /* delete a number */ + else if(choice == 4) + { + if(numcnt && numbers[numcnt]) + { + free(numbers[numcnt--]); + printf("Deleted most recent number!\n"); + } + else + printf("There are no numbers left to delete!\n"); + } + + /* print a string */ + else if(choice == 5) + { + printf("String index to print: "); + index = get_unum(); + + if(index < MAX_STR && strings[index]) + strings[index]->print(strings[index]->buffer); + else + printf("There is no string to print!\n"); + } + + /* print a number */ + else if(choice == 6) + { + printf("Number index to print: "); + index = get_unum(); + + if(index < MAX_NUM && numbers[index]) + numbers[index]->print(numbers[index]->num); + else + printf("There is no number to print!\n"); + } + + /* quit */ + else if(choice == 7) + break; + + /* base case */ + else + printf("Invalid choice!\n"); + + index = 0; + choice = 0; + printf("\n"); + } + + printf("See you tomorrow!\n"); + return EXIT_SUCCESS; +} diff --git a/src/lab08/CMakeLists.txt b/src/lab08/CMakeLists.txt new file mode 100644 index 0000000..c0bffb4 --- /dev/null +++ b/src/lab08/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(lab8C lab8C.c) +SET_FLAGS(lab8C "-z relro -z now -fPIE -pie -fstack-protector-all") + +add_executable(lab8B lab8B.c) +SET_FLAGS(lab8B "-z relro -z now -fPIE -pie -fstack-protector-all") + +add_executable(lab8A lab8A.c) +SET_FLAGS(lab8A "-static -fstack-protector-all -mpreferred-stack-boundary=2") + +# These are the files we want to give students +install(TARGETS lab8C lab8B lab8A DESTINATION "${RELEASE_DIR}/lab08") +install(FILES lab8C.c lab8B.c lab8A.c lab8A.readme DESTINATION "${RELEASE_DIR}/lab08") diff --git a/src/lab08/lab8A.c b/src/lab08/lab8A.c new file mode 100644 index 0000000..348b9d2 --- /dev/null +++ b/src/lab08/lab8A.c @@ -0,0 +1,104 @@ +#include +#include +#include +#include "utils.h" +#define STDIN 0 + +//gcc -fstack-protector-all -mpreferred-stack-boundary=2 -o lab8A lab8A.c +int *global_addr; +int *global_addr_check; + +// made so you can only read what we let you + +void selectABook() { + /* Our Apologies,the interface is currently under developement */ + char buf_secure[512]; + scanf("%s", buf_secure); + printf(buf_secure); + if(strcmp(buf_secure, "A") == 0){ + readA(); + }else if(strcmp(buf_secure,"F") == 0){ + readB(); + }else if(*buf_secure == '\x00'){ + readC(); + }else if(buf_secure == 1337){ + printf("\nhackers dont have time to read.\n"); + exit(EXIT_FAILURE); + }else{ + printf("\nWhat were you thinking, that isn't a good book."); + selectABook(); + } + return; +} + +void readA(){ + + printf("\n\n*************************************************\n"); + printf("{|} Aristote's Metaphysics 350 B.C. Book VIII {|}\n"); + printf("*************************************************\n\n"); + printf("To return to the difficulty which has been stated with respect both to definitions and to numbers, what is the cause of their unity? In the case of all things which have several parts and in which the totality is not, as it were, a mere heap, but the whole is something beside the parts, there is a cause; for even in bodies contact is the cause of unity in some cases, and in others viscosity or some other such quality. And a definition is a set of words which is one not by being connected together, like the Iliad, but by dealing with one object.-What then, is it that makes man one; why is he one and not many, e.g. animal + biped, especially if there are, as some say, an animal-itself and a biped-itself? Why are not those Forms themselves the man, so that men would exist by participation not in man, nor in-one Form, but in two, animal and biped, and in general man would be not one but more than one thing, animal and biped? \n"); + +} + +void readB(){ + + printf("\n\n*************************************************\n"); + printf("{|} Aristote's Metaphysics 350 B.C. Book IVIZ {|}\n"); + printf("*************************************************\n\n"); + printf( + + "Clearly, then, if people proceed thus in their usual manner of definition and speech, they cannot explain and solve the difficulty. But if, as we say, one element is matter and another is form, and one is potentially and the other actually, the question will no longer be thought a difficulty. For this difficulty is the same as would arise if 'round bronze' were the definition of 'cloak'; for this word would be a sign of the definitory formula, so that the question is, what is the cause of the unity of 'round' and 'bronze'? The difficulty disappears, because the one is matter, the other form. What, then, causes this-that which was potentially to be actually-except, in the case of things which are generated, the agent? For there is no other cause of the potential sphere's becoming actually a sphere, but this was the essence of either. Of matter some is intelligible, some perceptible, and in a formula there is always an element of matter as well as one of actuality; e.g. the circle is 'a plane figure'. But of the things which have no matter, either intelligible or perceptible, each is by its nature essentially a kind of unity, as it is essentially a kind of being-individual substance, quality, or quantity (and so neither 'existent' nor 'one' is present in their definitions), and the essence of each of them is by its very nature a kind of unity as it is a kind of being-and so none of these has any reason outside itself, for being one, nor for being a kind of being; for each is by its nature a kind of being and a kind of unity, not as being in the genus 'being' or 'one' nor in the sense that being and unity can exist apart from particulars. \n"); + +} + +void readC(){ + + printf("\n\n*************************************************\n"); + printf("{|} Aristote's Metaphysics 350 B.C. Book MN9+ {|}\n"); + printf("*************************************************\n\n"); + printf( + "Owing to the difficulty about unity some speak of 'participation', and raise the question, what is the cause of participation and what is it to participate; and others speak of 'communion', as Lycophron says knowledge is a communion of knowing with the soul; and others say life is a 'composition' or 'connexion' of soul with body. Yet the same account applies to all cases; for being healthy, too, will on this showing be either a 'communion' or a 'connexion' or a 'composition' of soul and health, and the fact that the bronze is a triangle will be a 'composition' of bronze and triangle, and the fact that a thing is white will be a 'composition' of surface and whiteness. The reason is that people look for a unifying formula, and a difference, between potency and complete reality. But, as has been said, the proximate matter and the form are one and the same thing, the one potentially, and the other actually. Therefore it is like asking what in general is the cause of unity and of a thing's being one; for each thing is a unity, and the potential and the actual are somehow one. Therefore there is no other cause here unless there is something which caused the movement from potency into actuality. And all things which have no matter are without qualification essentially unities. "); + + +} + +void findSomeWords() { + /* We specialize in words of wisdom */ + char buf[24]; + // to avoid the null + global_addr = (&buf+0x1); + // have to make sure no one is stealing the librarians cookies (they get angry) + global_addr_check = global_addr-0x2; + char lolz[4]; + + printf("\n..I like to read ^_^ <== "); + read(STDIN, buf, 2048); // >> read a lot every day ! + + if(((*( global_addr))^(*(global_addr_check))) != ((*( global_addr))^(0xdeadbeef))){ + printf("\n\nWoah There\n"); + // why are you trying to break my program q-q + exit(EXIT_FAILURE); + } + + // protected by my CUSTOM cookie - so soooo safe now + return; +} + +int main(int argc, char* argv[]) { + + disable_buffering(stdout); + printf("\n\n\n"); + printf("**********************************************\n"\ + "{|} Welcome to QUEND's Beta-Book-Browser {|}\n"\ + "**********************************************\n"\ + "\n" + "\t==> reading is for everyone <==\n"\ + "\t[+] Enter Your Favorite Author's Last Name: "); + selectABook(); + + printf("\n...please turn to page 394...\n"); + findSomeWords(); + + printf("\n\t[===] Whew you made it !\n\n"); + return EXIT_SUCCESS; +} diff --git a/src/lab08/lab8A.readme b/src/lab08/lab8A.readme new file mode 100644 index 0000000..8eb69ab --- /dev/null +++ b/src/lab08/lab8A.readme @@ -0,0 +1,3 @@ +lab8A is a remote level much like lab6B. It is running on port 8841. + +nc wargame.server.example 8841 -vvv diff --git a/src/lab08/lab8B.c b/src/lab08/lab8B.c new file mode 100644 index 0000000..ebd9243 --- /dev/null +++ b/src/lab08/lab8B.c @@ -0,0 +1,251 @@ +/* + * gcc -z relro -z now -fPIE -pie -fstack-protector-all -o lab8B lab8B.c + */ + +#include +#include +#include + +#define MAX_FAVES 10 + +struct vector { + void (*printFunc)(struct vector*); + char a; + short b; + unsigned short c; + int d; + unsigned int e; + long f; + unsigned long g; + long long h; + unsigned long long i; +}; + +struct vector v1; +struct vector v2; +struct vector v3; +struct vector* faves[MAX_FAVES]; + +void printVector(struct vector* v); + +void printMenu() +{ + printf("+------------------------------------------------------------+\n"); + printf("| |\n"); + printf("| 1. Enter data :> |\n"); + printf("| 2. Sum vectors :] |\n"); + printf("| 3. Print vector :3 |\n"); + printf("| 4. Save sum to favorites 8) |\n"); + printf("| 5. Print favorites :O |\n"); + printf("| 6. Load favorite :$ |\n"); + printf("| 9. Get help :D |\n"); + printf("| |\n"); + printf("+------------------------------------------------------------+\n"); + printf("I COMMAND YOU TO ENTER YOUR COMMAND: "); +} + +struct vector* vectorSel() +{ + printf("Which vector? "); + char sel; + while((sel = getchar()) == '\n'); // I love C. + switch(sel) + { + case '1': + return &v1; + case '2': + return &v2; + case '3': + return &v3; + default: + printf("\nBAD VECTOR SELECTION\n"); + exit(EXIT_FAILURE); + } +} + +void enterData() +{ + struct vector* v = vectorSel(); + if(v == &v3) + { + printf("Please don't try to manually enter data into the sum.\n"); + return; + } + printf("Data entry time!\n"); + printf("char a: "); + while((v->a = getchar()) == '\n'); // Still love C. + printf("short b: "); + scanf("%hd", &(v->b)); + printf("unsigned short c: "); + scanf("%hu", &(v->c)); + printf("int d: "); + scanf("%d", &(v->d)); + printf("unsigned int e: "); + scanf("%u", &(v->e)); + printf("long f: "); + scanf("%ld", &(v->f)); + printf("unsigned long g: "); + scanf("%lu", &(v->g)); + printf("long long h: "); + scanf("%lld", &(v->h)); + printf("unsigned long long i: "); + scanf("%llu", &(v->i)); + v->printFunc = printVector; +} + +void sumVectors() +{ + if(v1.a==0 || v2.a==0 || + v1.b==0 || v2.b==0 || + v1.c==0 || v2.c==0 || + v1.d==0 || v2.d==0 || + v1.e==0 || v2.e==0 || + v1.f==0 || v2.f==0 || + v1.g==0 || v2.g==0 || + v1.h==0 || v2.h==0 || + v1.i==0 || v2.i==0) + { + printf("You didn't even set the addends... :(\n"); + return; + } + v3.a = v1.a + v2.a; + v3.b = v1.b + v2.b; + v3.c = v1.c + v2.c; + v3.d = v1.d + v2.d; + v3.e = v1.e + v2.e; + v3.f = v1.f + v2.f; + v3.g = v1.g + v2.g; + v3.h = v1.h + v2.h; + v3.i = v1.i + v2.i; + printf("Summed.\n"); +} + +/* + * Bonus points if you don't use this function. + */ +void thisIsASecret() +{ + system("/bin/sh"); +} + +void printVector(struct vector* v) +{ + printf("Address: %p\n", v); + printf("void printFunc: %p\n", v->printFunc); + printf("char a: %c\n", v->a); + printf("short b: %hd\n", v->b); + printf("unsigned short c: %hu\n", v->c); + printf("int d: %d\n", v->d); + printf("unsigned int e: %u\n", v->e); + printf("long f: %ld\n", v->f); + printf("unsigned long g: %lu\n", v->g); + printf("long long h: %lld\n", v->h); + printf("unsigned long long i: %llu\n", v->i); +} + +void fave() +{ + unsigned int i; + for(i=0; i= MAX_FAVES) + { + printf("Index out of bounds\n"); + return; + } + + struct vector* v = vectorSel(); + if(v == &v3) + { + printf("Please don't try to manually enter data into the sum.\n"); + return; + } + memcpy(v, faves[i], sizeof(v)); +} + +void help() +{ + printf("\ +This program adds two vectors together and stores it in a third vector. You \ +can then add the sum to your list of favorites, or load a favorite back into \ +one of the addends.\n"); +} + +int main(int argc, char** argv) +{ + char sel; + printMenu(); + v1.printFunc = printf; + v2.printFunc = printf; + v3.printFunc = printf; + struct vector* v; + while((sel = getchar()) && (sel == '\n' || getchar())) // Magic ;^) + { + if(sel == '\n') + continue; + + switch(sel) + { + case '0': + printf("OK, bye.\n"); + return EXIT_SUCCESS; + case '1': + enterData(); + break; + case '2': + sumVectors(); + break; + case '3': + v = vectorSel(); + //printf("Calling %p\n", v->printFunc); + v->printFunc(v); + break; + case '4': + fave(); + break; + case '5': + printFaves(); + break; + case '6': + loadFave(); + break; + case '9': + help(); + break; + default: + printf("\nThat was bad input. \ +Just like your futile attempt to pwn this.\n"); + return EXIT_FAILURE; + } + printMenu(); + } + return EXIT_SUCCESS; +} diff --git a/src/lab08/lab8C.c b/src/lab08/lab8C.c new file mode 100644 index 0000000..e8a8791 --- /dev/null +++ b/src/lab08/lab8C.c @@ -0,0 +1,132 @@ +/* + * gcc -z relro -z now -fPIE -pie -fstack-protector-all -o lab8C lab8C.c + */ + +#include +#include +#include +#include +#include +#include +#include + +struct fileComp { + char fileContents1[255]; + char fileContents2[255]; + int cmp; +}; + +char* readfd(int fd) +{ + // Find length of file + int size = lseek(fd, 0, SEEK_END); + if(size >= 255) + { + printf("Your file is too big.\n"); + exit(EXIT_FAILURE); + } + // Reset fd to beginning of file + lseek(fd, 0, SEEK_SET); + // Allocate space for the file and a null byte + char* fileContents = malloc((size+1) & 0xff); + if(!fileContents) + { + printf("Could not allocate space for file contents\n"); + exit(EXIT_FAILURE); + } + // Read the file contents into the buffer + int numRead = read(fd, fileContents, size & 0xff); + return fileContents; +} + +int getfd(char* arg) +{ + if(arg[0] != '-' || arg[1] != 'f' || arg[3] != '=') + { + printf("Invalid formatting in argument \"%s\"\n", arg); + return -1; + } + + int fd; + if(arg[2] == 'n') + { + // O_NOFOLLOW means that it won't follow symlinks. Sorry. + fd = open(arg+4, O_NOFOLLOW | O_RDONLY); + if(fd == -1) + { + printf("File could not be opened\n"); + return -1; + } + } + else if(arg[2] == 'd') + { + errno = 0; + fd = atoi(arg+4); + } + else + { + printf("Invalid formatting in argument \"%s\"\n", arg); + return -1; + } + + return fd; +} + +struct fileComp* comparefds(int fd1, int fd2) +{ + struct fileComp* fc = malloc(sizeof(struct fileComp)); + if(!fc) + { + printf("Could not allocate space for file contents\n"); + exit(EXIT_FAILURE); + } + + strcpy(fc->fileContents1, readfd(fd1)); + strcpy(fc->fileContents2, readfd(fd2)); + fc->cmp = strcmp(fc->fileContents1, fc->fileContents2); + return fc; +} + +char* securityCheck(char* arg, char* s) +{ + if(strstr(arg, ".pass")) + return "<<>>"; + return s; +} + +int main(int argc, char** argv) +{ + if(argc != 3) + { + printf("Hi. This program will do a lexicographical comparison of the \ +contents of two files. It has the bonus functionality of being \ +able to process either filenames or file descriptors.\n"); + printf("Usage: %s {-fn=|-fd=} {-fn=|-fd=}\n", argv[0]); + return EXIT_FAILURE; + } + + int fd1 = getfd(argv[1]); + int fd2 = getfd(argv[2]); + if(fd1 == -1 || fd2 == -1) + { + printf("Usage: %s {-fn=|-fd=} {-fn=|-fd=}\n", argv[0]); + return EXIT_FAILURE; + } + if(fd1 == 0 || fd2 == 0) + { + printf("Invalid fd argument.\n"); + printf("(We're still fixing some bugs with using STDIN.)\n"); + printf("Usage: %s {-fn=|-fd=} {-fn=|-fd=}\n", argv[0]); + return EXIT_FAILURE; + } + + struct fileComp* fc = comparefds(fd1, fd2); + + printf( + "\"%s\" is lexicographically %s \"%s\"\n", + securityCheck(argv[1], fc->fileContents1), + fc->cmp > 0 ? "after" : (fc->cmp < 0 ? "before" : "equivalent to"), + securityCheck(argv[2], fc->fileContents2)); + + return EXIT_SUCCESS; +} diff --git a/src/lab09/CMakeLists.txt b/src/lab09/CMakeLists.txt new file mode 100644 index 0000000..4b05b40 --- /dev/null +++ b/src/lab09/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(lab9C lab9C.cpp) +SET_FLAGS(lab9C "-fstack-protector-all -z relro -z now") + +add_executable(lab9A lab9A.cpp) +SET_FLAGS(lab9C "-fstack-protector-all -z relro -z now -fPIE -pie") + +# These are the files we want to give students +install(TARGETS lab9C lab9A DESTINATION "${RELEASE_DIR}/lab09") +install(FILES lab9C.cpp lab9C.readme lab9A.cpp lab9A.readme DESTINATION "${RELEASE_DIR}/lab09") diff --git a/src/lab09/lab9A.cpp b/src/lab09/lab9A.cpp new file mode 100644 index 0000000..8d47d11 --- /dev/null +++ b/src/lab09/lab9A.cpp @@ -0,0 +1,199 @@ +/* + * compile: g++ -fstack-protector-all -z relro -z now -O1 -fPIE -pie ./lab9A.cpp -g -o lab9A + * clark's improved item storage server! + * Changelog: + * * Using HashSets for insta-access! + * +*/ + +#include +#include +#include +#include +#include "utils.h" + +ENABLE_TIMEOUT(300) + +#define SIZE_HASHSET_VEC 8 + +void +print_menu(void) +{ + printf("+----------- clark's improved item storage -----------+\n" + "| [ -- Now using HashSets for insta-access to items! |\n" + "| 1. Open a lockbox |\n" + "| 2. Add an item to a lockbox |\n" + "| 3. Get an item from a lockbox |\n" + "| 4. Destroy your lockbox and items in it |\n" + "| 5. Exit |\n" + "+-----------------------------------------------------+\n"); +} + +/********* Storage implementation **********/ + +// hash functor +class hash_num { + public: + // I'm no mathematician + unsigned int + operator() (unsigned int const &key) const { + return key; + } +}; + +// Hashset +template +class HashSet { + public: + HashSet(unsigned int size) : m_size(size), set_data(new T[size]) {} + virtual ~HashSet() { delete [] set_data; } + virtual void add(T val); + virtual unsigned int find(T val); + virtual T get(unsigned int); + private: + unsigned int m_size; + HashFunc m_hash; + T *set_data; +}; +typedef HashSet hashset_int; + +template +void +HashSet::add(T val) +{ + int index = this->m_hash(val) % this->m_size; + this->set_data[index] = val; +} + +template +unsigned int +HashSet::find(T val) +{ + return this->m_hash(val) % this->m_size; +} + +template +T +HashSet::get(unsigned int index) +{ + if (index >= m_size) { + std::cout << "Invalid index" << std::endl; + return T(); + } + return set_data[index]; +} + +/********* Storage interface implementation **********/ +void +do_new_set(hashset_int **set_vec) +{ + int bin = -1; + int choice = -1; + std::cout << "Which lockbox do you want?: "; + bin = get_unum(); + if (bin < 0) { + std::cout << "Invalid set ID!" << std::endl; + return; + } else if (bin >= SIZE_HASHSET_VEC) { + std::cout << "No more room!" << std::endl; + return; + } + std::cout << "How many items will you store?: "; + choice = get_unum(); + set_vec[bin] = new hashset_int(choice); +} + +void +do_add_item(hashset_int **set_vec) +{ + int set_id = -1; + int item_val = -1; + + std::cout << "Which lockbox?: "; + set_id = get_unum(); + if (set_id < 0 || set_id >= SIZE_HASHSET_VEC) { + std::cout << "Invalid set ID!" << std::endl; + return; + } + + std::cout << "Item value: "; + item_val = get_unum(); + set_vec[set_id]->add(item_val); +} + +void +do_find_item(hashset_int **set_vec) +{ + int set_id = -1; + int item_val = -1; + int item_index = -1; + + std::cout << "Which lockbox?: "; + set_id = get_unum(); + if (set_id < 0 || set_id >= SIZE_HASHSET_VEC) { + std::cout << "Invalid set ID!" << std::endl; + return; + } + + std::cout << "Item value: "; + item_val = get_unum(); + item_index = set_vec[set_id]->find(item_val); + if (item_index == -1) { + std::cout << "Item not found!" << std::endl; + } else { + std::cout << "Item Found" << std::endl; + printf("lockbox[%d] = %d\n", item_index, set_vec[set_id]->get(item_index)); + } +} + +void +do_del_set(hashset_int **set_vec) +{ + int del_id; + std::cout << "Which set?: "; + del_id = get_unum(); + if (del_id < 0 || del_id >= SIZE_HASHSET_VEC) { + std::cout << "Invalid ID!" << std::endl; + return; + } + delete set_vec[del_id]; +} + +int +main(int argc, char *argv[]) +{ + hashset_int **set_vec = new hashset_int*[SIZE_HASHSET_VEC]; + int choice = -1; + bool done = false; + disable_buffering(stdout); + + while (!done) { + print_menu(); + std::cout << "Enter choice: "; + choice = get_unum(); + switch (choice) { + case 1: + do_new_set(set_vec); + break; + case 2: + do_add_item(set_vec); + break; + case 3: + do_find_item(set_vec); + break; + case 4: + do_del_set(set_vec); + break; + case 5: + done = true; + break; + default: + puts("Invalid option!"); + break; + } + } + + delete [] set_vec; + + return EXIT_SUCCESS; +} diff --git a/src/lab09/lab9A.readme b/src/lab09/lab9A.readme new file mode 100644 index 0000000..7673631 --- /dev/null +++ b/src/lab09/lab9A.readme @@ -0,0 +1 @@ +nc wargame.server.example 9941 diff --git a/src/lab09/lab9C.cpp b/src/lab09/lab9C.cpp new file mode 100644 index 0000000..e08d800 --- /dev/null +++ b/src/lab09/lab9C.cpp @@ -0,0 +1,91 @@ +/* + * compile: g++ -fstack-protector-all -z relro -z now ./lab9C.cpp -o lab9C + * + * DSVector - A basic homwork implementation of std::vector + * This is a wrapper program to test it! + */ + +#include +#include +#include +#include +#include +#include +#include "utils.h" + +ENABLE_TIMEOUT(60) + +void +print_menu(void) +{ + printf("+------- DSVector Test Menu -------+\n" + "| 1. Append item |\n" + "| 2. Read item |\n" + "| 3. Quit |\n" + "+----------------------------------+\n"); +} + +template +class DSVector { + public: + // I don't like indexing from 0, I learned VB.NET first. + DSVector() : len(1), alloc_len(len+256) {} + unsigned int size() { return len; } + void append(T item); + // No info leaks, either! + T get(unsigned int index) { return (index < alloc_len ? vector_data[index] : -1); }; + private: + unsigned int alloc_len; + unsigned int len; + // I was asleep during the dynamic sizing part, at least you can't overflow! + T vector_data[1+256]; +}; + +template +void +DSVector::append(T item) +{ + // No overflow for you! + if (len >= alloc_len) { + std::cout << "Vector is full!" << std::endl; + return; + } + vector_data[this->len++] = item; +} + +int +main(int argc, char *argv[]) +{ + DSVector test1; + unsigned int choice = 0; + bool done = false; + disable_buffering(stdout); + + while (!done) { + print_menu(); + std::cout << "Enter choice: "; + choice = get_unum(); + + /* handle menu selection */ + switch (choice) { + case 1: + std::cout << "Enter a number: "; + choice = get_unum(); + test1.append(choice); + break; + case 2: + std::cout << "Choose an index: "; + choice = get_unum(); + printf("DSVector[%d] = %d\n", choice, test1.get(choice)); + break; + case 3: + done = true; + break; + default: + puts("Invalid choice!"); + break; + } + } + + return EXIT_SUCCESS; +} diff --git a/src/lab09/lab9C.readme b/src/lab09/lab9C.readme new file mode 100644 index 0000000..c11f338 --- /dev/null +++ b/src/lab09/lab9C.readme @@ -0,0 +1 @@ +nc wargame.server.example 9943 diff --git a/src/lab10/CMakeLists.txt b/src/lab10/CMakeLists.txt new file mode 100644 index 0000000..a003474 --- /dev/null +++ b/src/lab10/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +#add_executable(lab10C lab10C.c) +#add_executable(lab10A lab10A.c) + +# These are the files we want to give students +#install(TARGETS lab10C lab10A DESTINATION "${RELEASE_DIR}/lab10") +#install(FILES lab10C.c lab10A.c DESTINATION "${RELEASE_DIR}/lab10") + diff --git a/src/lab10/README b/src/lab10/README new file mode 100644 index 0000000..bd84b42 --- /dev/null +++ b/src/lab10/README @@ -0,0 +1,10 @@ +To start lab C: + +ssh lab10C@warzone-kernel.rpis.ec +password: lab10start + + +Once you pwn the Kernel module to get root, you can read the flag, and the password for lab10A in /root/flag. + + +Good luck! diff --git a/src/lab10/lab10A.c b/src/lab10/lab10A.c new file mode 100644 index 0000000..ecd8e7c --- /dev/null +++ b/src/lab10/lab10A.c @@ -0,0 +1,355 @@ +/* +iptables sux. +*/ + + +#include // included for all kernel modules +#include // included for KERN_INFO +#include // included for __init and __exit macros + +#include // included for filesystem structs +#include // included for device driver stuff : +#include // Because memcpy :) +#include // get_random_bytes() + +// Networking Includes +#include +#include +#include +#include +#include + +#include + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Patrick Biernat"); +MODULE_DESCRIPTION("MBE Lab 10A"); + + +typedef struct disallow_filter { + unsigned int pr_num; + unsigned int port; + unsigned int id; + struct disallow_filter * next; + struct disallow_filter * prev; +}d; + +typedef struct callback_filter { + unsigned int pr_num; + unsigned int id; + + void (*callback)(struct callback_filter *); + struct callback_filter * next; + struct callback_filter * prev; +}c; + +struct disallow_filter * dfilter_head; +struct callback_filter * cfilter_head; +struct nf_hook_ops nfho; + +unsigned int pkt_hook(unsigned int hooknum, struct sk_buff *skb, const struct + net_device * in, const struct net_device * out, + int (*okfn)(struct sk_buff *)) { +/* + This function filters packets as they come into the system. + Callback filters take precedence over disallow filters. +*/ + + struct disallow_filter * walkera; + struct callback_filter * walkerb; + struct iphdr * ip_header; + + printk(KERN_INFO "[uTables] Got a packet!\n"); + + ip_header = (struct iphdr *)skb_network_header(skb); + + walkera = dfilter_head; + walkerb = cfilter_head; + + while(walkerb != 0) { + if(walkerb->pr_num == ip_header->protocol) { + break; + } + walkerb = walkerb->next; + } + if (walkerb) { + walkerb->callback(walkerb); + return NF_ACCEPT; + } + + while(walkera != 0) { + if (walkera->pr_num == ip_header->protocol) { + break; + } + walkera = walkera->next; + } + if (walkera) { + printk(KERN_INFO "[uTables] Caught a disallowed Packet!\n"); + return NF_DROP; + } + + + return NF_ACCEPT; +} + +void emulate_packet(int pnum) { + struct disallow_filter * walkera; + struct callback_filter * walkerb; + printk(KERN_INFO "[uTables] Emulating Protocol: %d\n", pnum); + + + walkera = dfilter_head; + walkerb = cfilter_head; + + while(walkerb != 0) { + if(walkerb->pr_num == pnum) { + break; + } + walkerb = walkerb->next; + } + if (walkerb) { + printk(KERN_INFO "Found callback filter!\n"); + walkerb->callback(walkerb); + return; + } + + while(walkera != 0) { + if (walkera->pr_num == pnum) { + break; + } + walkera = walkera->next; + } + if (walkera) { + printk(KERN_INFO "[uTables] Caught a disallowed Packet!\n"); + return; + } + return; +} + +void default_callback(struct sk_buff * skb) { + printk(KERN_INFO "[uTables] Default Callback Hit!\n"); + return; +} + +static ssize_t pwn_read(struct file* file, char * buf, size_t count, loff_t *ppos) +{ + return len; +} + +int add_cfilter(struct callback_filter * filt) { +/* + Add a callback filter to uTables. +*/ + struct callback_filter * nfilter, *walker; + printk("[uTables] Adding a callback filter\n"); + + nfilter = kmalloc(sizeof(struct callback_filter), GFP_KERNEL); + nfilter->pr_num = filt->pr_num; + nfilter->id = filt->id; + nfilter->callback = default_callback; + nfilter->next = 0; + + walker = cfilter_head; + while(walker->next != 0) { + walker = walker->next; + } + walker->next = nfilter; + nfilter->prev = walker; + + printk(KERN_INFO "New Filter At Address: %p\n", nfilter); + printk(KERN_INFO "New Filter Protocol: %u\n", nfilter->pr_num); + printk(KERN_INFO "New Filter ID: %u\n", nfilter->id); + printk(KERN_INFO "New Filter Callback @: %p\n", nfilter->callback); + printk(KERN_INFO "New Filter NEXT: %p\n", nfilter->next); + printk(KERN_INFO "New Filter PREV: %p\n", nfilter->prev); + + return 0; + +} + +int add_dfilter(struct disallow_filter * filt) { +/* + Add a disallow filter to uTables. +*/ + + struct disallow_filter * nfilter, *walker; + + printk("PR NUM: %d\n", filt->pr_num); + nfilter = kmalloc(sizeof(struct disallow_filter), GFP_KERNEL); + nfilter->pr_num = filt->pr_num; + nfilter->port = filt->port; + nfilter->id = filt->id; + nfilter->next = 0; + + walker = dfilter_head; + while(walker->next != 0) { + walker = walker->next; + } + walker->next = nfilter; + nfilter->prev = walker; + + printk(KERN_INFO "New Filter At Address: %p", nfilter); + printk(KERN_INFO "New Filter Protocol: %u\n", nfilter->pr_num); + printk(KERN_INFO "New Filter Port: %u\n", nfilter->port); + printk(KERN_INFO "New Filter ID: %u\n", nfilter->id); + + return 0; +} + +int remove_defilter(int pr_num) { +/* + Remove a filter for the specified protocol number. +*/ + struct disallow_filter * walker; + + walker = dfilter_head; + while(walker->pr_num != pr_num && walker != NULL){ + walker = walker->next; + } + if(walker) { + printk(KERN_INFO "Removing Filter for %u at %08x\n", walker->pr_num, walker); + walker->prev->next = walker->next; + if(walker->next) { + walker->next->prev = walker->prev; + } + kfree(walker); + return 0; + } + return -1; +} + +int modify_callback(void * data) { +/* + Apart from the default Callback, you may load + additional kernel modules and use their functions + as callback routines from the filtering hook here. +*/ + struct callback_filter * walker; + unsigned int addr; + unsigned int cid; + + memcpy(&cid, data, 4); + memcpy(&addr, data + 4, 4); + printk(KERN_INFO "Addr: %u\n", addr); + printk(KERN_INFO "ID: %u\n", cid); + + if (addr < 0xc0000000) { + printk(KERN_INFO "[ERROR] Userspace Address detected!\n"); + return -1; + } + + walker = cfilter_head; + while (walker != 0) { + if (walker->id == cid) { + break; + } + walker = walker->next; + } + if (walker) { + walker->callback = addr; + printk(KERN_INFO "Updated Filter ID: %u Callback to : %u\n",walker->id, walker->callback); + } + else { + printk(KERN_INFO "Could not find Filter with ID: %u\n",walker->id); + return -1; + } + return 0; +} + +static ssize_t pwn_write(struct file* file, const char * buf, size_t count, loff_t *ppos) +{ // This is how you configure uTables + + if (buf[0] == '\x01') { // Now you know you're talking to this thing :) + printk(KERN_INFO "The flag is in /root/flag\n"); + } + + if (buf[0] == '\x02') { // Add a disallow filter + printk(KERN_INFO "[uTables] Adding new disallow filter\n"); + printk(KERN_INFO "PR: %u", buf[1]); + add_dfilter( (struct disallow_filter *) &(buf[1])); + } + + if (buf[0] == '\x03') { // Add a callback filter + printk(KERN_INFO "[uTables] Adding a new callback filter\n"); + add_cfilter( (struct callback_filter *) &(buf[1])); + } + + if (buf[0] == '\x04') { // Modify a callback function + printk(KERN_INFO "[uTables] Modifying a callback\n"); + modify_callback((void *) &(buf[4])); + } + + if (buf[0] == '\x05') { // Emulate a Packet arriving in the kernel. + printk(KERN_INFO "[uTables] Emulating a packet arriving\n"); + emulate_packet( (int) (buf[1])); + + } + + return count; +} + + +static const struct file_operations pwnops = { + .owner = THIS_MODULE, + .read = pwn_read, + .write = pwn_write, +}; + +static struct miscdevice pwn_dev = { + MISC_DYNAMIC_MINOR, "pwn" , &pwnops +}; + +static int __init mod_init(void) +{ +/* + Initialize data structures and register a device that will be used to + configure uTables. + Also set up our networking hook so we can look at packets coming into the + kernel. +*/ + + int ret; + // Register our device and create heads for our linked lists + ret = misc_register(&pwn_dev); + dfilter_head = kmalloc(sizeof(struct disallow_filter), GFP_KERNEL); + cfilter_head = kmalloc(sizeof(struct callback_filter), GFP_KERNEL); + + // Initialize our linked list heads + dfilter_head->pr_num = -1; + dfilter_head->port = -1; + dfilter_head->next = 0; + dfilter_head->prev = 0; + + cfilter_head->pr_num = -1; + cfilter_head->id = -1; + cfilter_head->callback = default_callback; + cfilter_head->next = 0; + cfilter_head->prev = 0; + + // Set up our basic netfilter hook + nfho.hook = pkt_hook; + nfho.hooknum = 0; + nfho.pf = PF_INET; + nfho.priority = NF_IP_PRI_FIRST; + + // Register our hook + nf_register_hook(&nfho); + + printk(KERN_INFO "Finished Init\n"); + printk(KERN_INFO "Can u get r00t?\n"); + return 0; +} + +static void __exit mod_cleanup(void) +{ + printk(KERN_INFO "Cleaning up module.\n"); + misc_deregister(&pwn_dev); + nf_unregister_hook(&nfho); +} + + +// We're "registering" our module with the rest of the Kernel here. +module_init(mod_init); +module_exit(mod_cleanup); + + diff --git a/src/lab10/lab10C.c b/src/lab10/lab10C.c new file mode 100644 index 0000000..6cd40f1 --- /dev/null +++ b/src/lab10/lab10C.c @@ -0,0 +1,127 @@ +/* +Unix-Dude sux at writing rootkits. + +He forgot the get_r00t code q_q. +*/ + + +#include // included for all kernel modules +#include // included for KERN_INFO +#include // included for __init and __exit macros + +#include // included for filesystem structs +#include // included for device driver stuff : +#include // Because memcpy :) +#include // get_random_bytes() + +#include + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Patrick Biernat"); +MODULE_DESCRIPTION("MBE Lab 10 C"); + +unsigned int secret; + +typedef struct key_material { + char key[1024]; + void (*algo)(char *); + int auth; +}da_keyz; + + +struct key_material * sekret; + +static ssize_t pwn_write(struct file* file, const char * buf, size_t count, loff_t *ppos) +{ // Here we check for the password + + printk(KERN_INFO "%s\n",buf); + if( count == 0x31337) { + if (sekret->auth) { + // Do the root thing here. + printk(KERN_INFO "Nice privs bro.\n"); + } + return 0x31337; + } + + if(buf[0] == '\x01') { + printk("Flag is @ /root/flag"); + } + + if ( ( *(unsigned int *)buf ^ 0xcafebabe) == 0) { + printk(KERN_INFO "Performing Key Authentication now...\n"); + sekret->algo(buf); + } + + return count; +} + + +static const struct file_operations pwnops = { + .owner = THIS_MODULE, + .write = pwn_write, +}; + +static struct miscdevice pwn_dev = { + MISC_DYNAMIC_MINOR, "pwn" , &pwnops +}; + +void algo_xor(char * buf) { +/* + Secure One-Time Pad Authentication Function. +*/ + int i; + int sum; + + sum = 0; + printk(KERN_INFO "Inside algo_xor!\n"); + + for(i=0; i <= 1024; i++) { + sekret->key[i] ^= buf[i]; + } + + for(i=0; i <= 1024; i++) { + sum += sekret->key[i]; + } + + if(sum == 0) { + sekret->auth = 1; + } + else { + printk(KERN_INFO "Authentication Failed!\n"); + memset(sekret, 0 , sizeof(struct key_material)); + get_random_bytes(&(sekret->key),1024); + } + return; +} + +//Think of this as the familiar "main" function +static int __init mod_init(void) +{ + int ret; + // Register Device to /dev + ret = misc_register(&pwn_dev); + + // Allocate Space for the key + sekret = kmalloc(sizeof(struct key_material), GFP_KERNEL); + get_random_bytes(&sekret->key, 1024); + + // Set the algorithm to a sane default + sekret->algo = algo_xor; + + printk(KERN_INFO "Finished Init\n"); + printk(KERN_INFO "Can u get r00t?\n"); + return 0; +} + +static void __exit mod_cleanup(void) +{ + printk(KERN_INFO "Cleaning up module.\n"); + misc_deregister(&pwn_dev); +} + + +//We're "registering" our module with the rest of the Kernel here. +module_init(mod_init); +module_exit(mod_cleanup); + + diff --git a/src/lecture/CMakeLists.txt b/src/lecture/CMakeLists.txt new file mode 100644 index 0000000..10fe7d3 --- /dev/null +++ b/src/lecture/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 2.8) + +set(RELEASE_DIR "${RELEASE_DIR}/lecture") + +# Adds all of the level directories +SUBDIRLIST(SUBDIRS ${CMAKE_CURRENT_SOURCE_DIR}) +foreach(subdir ${SUBDIRS}) + message(STATUS "Building lecture:${subdir}...") + add_subdirectory(${subdir}) +endforeach() diff --git a/src/lecture/aslr/CMakeLists.txt b/src/lecture/aslr/CMakeLists.txt new file mode 100644 index 0000000..d5ba866 --- /dev/null +++ b/src/lecture/aslr/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(aslr2 aslr2.c) +SET_FLAGS(aslr2 "-static -z execstack -fno-stack-protector") + +add_executable(aslr_leak1 aslr_leak1.c) +SET_FLAGS(aslr_leak1 "-pie -fPIE -fno-stack-protector") + +add_executable(aslr_leak2 aslr_leak2.c) +SET_FLAGS(aslr_leak2 "-pie -fPIE -fno-stack-protector") + +# These are the files we want to give students +install(TARGETS aslr2 aslr_leak1 aslr_leak2 DESTINATION "${RELEASE_DIR}/aslr") +install(FILES aslr2.c aslr_leak1.c aslr_leak2.c DESTINATION "${RELEASE_DIR}/aslr") diff --git a/src/lecture/aslr/aslr2.c b/src/lecture/aslr/aslr2.c new file mode 100644 index 0000000..62b3ffd --- /dev/null +++ b/src/lecture/aslr/aslr2.c @@ -0,0 +1,25 @@ +/* +Exploitation with ASLR Enabled +Lecture: Example 2 +Modern Binary Exploitation + +Compiled with: +gcc -m32 -fno-stack-protector -z execstack -static ./aslr2.c + +Patrick Biernat +*/ + + +#include +#include + +int main(int argc, char** argv) +{ + char my_string[16]; + char THE_TRICK[2] = "\xFF\xE4"; + + fgets(my_string,40,stdin); + + + return 0; +} diff --git a/src/lecture/aslr/aslr_leak1.c b/src/lecture/aslr/aslr_leak1.c new file mode 100644 index 0000000..854c46a --- /dev/null +++ b/src/lecture/aslr/aslr_leak1.c @@ -0,0 +1,29 @@ +/* +Exploitation with ASLR Enabled +Lecture: Example 1 +Modern Binary Exploitation + +Compiled with: +gcc -pie -fPIE -fno-stack-protector -o aslr_leak1 aslr_leak1.c + +-Patrick Biernat +*/ +#include +#include + +void i_am_rly_leet() +{ + printf("You found me!\nGood job!\n"); + return; +} + +int main(int argc, char** argv) +{ + char my_string[16]; + printf("Win Func @ %p\n",i_am_rly_leet); + fflush(stdout); + fgets(my_string,40,stdin); + + + return 0; +} diff --git a/src/lecture/aslr/aslr_leak2.c b/src/lecture/aslr/aslr_leak2.c new file mode 100644 index 0000000..984abc0 --- /dev/null +++ b/src/lecture/aslr/aslr_leak2.c @@ -0,0 +1,23 @@ +#include +#include + +/* gcc -pie -fPIE -fno-stack-protector -o aslr_leak2 ./aslr_leak2.c */ + +int main(int argc, char * argv[]) +{ + char leaky[16]; + + if(argc < 2) + { + printf("Please provide two arguments.\n"); + return 1; + } + + memcpy(leaky, argv[1], 16); + + printf("Leaky buffer: %s\n", leaky); + printf("another round? : "); + fgets(leaky, 64, stdin); + + return 0; +} diff --git a/src/lecture/cpp/CMakeLists.txt b/src/lecture/cpp/CMakeLists.txt new file mode 100644 index 0000000..c64af5b --- /dev/null +++ b/src/lecture/cpp/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(rect rect.cpp) + +add_executable(cpp_lec01 cpp_lec01.cpp) + +add_executable(cpp_lec02 cpp_lec02.cpp) + +# These are the files we want to give students +install(TARGETS rect cpp_lec01 cpp_lec02 DESTINATION "${RELEASE_DIR}/cpp") +install(FILES rect.cpp cpp_lec01.cpp cpp_lec02.cpp DESTINATION "${RELEASE_DIR}/cpp") diff --git a/src/lecture/cpp/cpp_lec01.cpp b/src/lecture/cpp/cpp_lec01.cpp new file mode 100644 index 0000000..d398bda --- /dev/null +++ b/src/lecture/cpp/cpp_lec01.cpp @@ -0,0 +1,45 @@ +#include +#include +#include + +class Foo { +public: + virtual void greet() { printf("Foo says hi\n"); } + void me() { printf("Foo is best\n"); } +}; + +class Bar : public Foo { +public: + virtual void greet() { printf("Bar says hi\n"); } + virtual void dismiss() { printf("Bar says bye\n"); } + void me() { printf("Bar is best\n"); } +}; + +class Baz : public Bar { +public: + void dismiss() { printf("Baz says bye \n"); } + void me() { printf("Baz is best\n"); } +}; + +int +main(int argc, char *argv[]) +{ + Foo foo; + Bar bar; + Baz baz; + Bar *barbaz = (Bar *)new Baz; + + foo.greet(); + puts("\n"); + + bar.greet(); + bar.me(); + bar.dismiss(); + puts("\n"); + + barbaz->me(); + barbaz->dismiss(); + + return 0; +} + diff --git a/src/lecture/cpp/cpp_lec02.cpp b/src/lecture/cpp/cpp_lec02.cpp new file mode 100644 index 0000000..e8fe8a0 --- /dev/null +++ b/src/lecture/cpp/cpp_lec02.cpp @@ -0,0 +1,70 @@ +/* + * Credit: https://defuse.ca/exploiting-cpp-vtables.htm + */ + +#include +#include +#include + +class CodeTester { + public: + virtual void test(const char*code) + { + int (*ret)() = (int(*)())code; + ret(); + } +}; + +class CommandExecutor { + public: + virtual void execute(const char *command) + { + system(command); + } +}; + +class Greeter { + public: + virtual void sayHello(const char *name) + { + printf("Hello, %s!\n", name); + } +}; + +void greet(Greeter *greeter); +void doNothing(); + +int main(int argc, char **argv) +{ + Greeter g; + char buf[64]; + printf("You must be 18 years or older to use this program. Are you? "); + + doNothing(); + + gets(buf); /* OVERFLOW */ + if (strcmp(buf, "y") == 0) { + greet(&g); + return 0; + } else { + return 1; + } +} + +void greet(Greeter *greeter) +{ + char name[100]; + printf("What is your name? "); + fgets(name, 100, stdin); + name[strlen(name)-1] = '\0'; + greeter->sayHello(name); +} + +/* This exists just so that the compiler/linker needs to include + * CommandExecutor's code, since otherwise it would be unused. */ +void doNothing() +{ + CommandExecutor e; + CodeTester c; +} + diff --git a/src/lecture/cpp/rect.cpp b/src/lecture/cpp/rect.cpp new file mode 100644 index 0000000..38324c5 --- /dev/null +++ b/src/lecture/cpp/rect.cpp @@ -0,0 +1,37 @@ +#include +#include + +class Rect { + public: + Rect() : width(0), height(0) {} + int area() { return width*height; } + void set_vals(int w, int h); + private: + int width; + int height; +}; + +void +Rect::set_vals(int w, int h) +{ + this->width = w; + this->height = h; +} + +int +main(int argc, char *argv[]) +{ + Rect r; + + printf("sizeof(r) = %d\n", sizeof(r)); + + int *vars = (int *)&r; + + printf("width = %d, height = %d\n", vars[0], vars[1]); + + r.set_vals(10, 24); + printf("setvals(10, 24);\n"); + printf("width = %d, height = %d\n", vars[0], vars[1]); + + return 0; +} diff --git a/src/lecture/format_strings/CMakeLists.txt b/src/lecture/format_strings/CMakeLists.txt new file mode 100644 index 0000000..17c420d --- /dev/null +++ b/src/lecture/format_strings/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(fmt_lec01 fmt_lec01.c) +add_executable(fmt_lec02 fmt_lec02.c) +add_executable(fmt_lec03 fmt_lec03.c) +add_executable(fmt_lec04 fmt_lec04.c) + +# These are the files we want to give students +install(TARGETS fmt_lec01 fmt_lec02 fmt_lec03 fmt_lec04 DESTINATION "${RELEASE_DIR}/format_strings") +install(FILES fmt_lec01.c fmt_lec02.c fmt_lec03.c fmt_lec04.c DESTINATION "${RELEASE_DIR}/format_strings") diff --git a/src/lecture/format_strings/fmt_lec01.c b/src/lecture/format_strings/fmt_lec01.c new file mode 100644 index 0000000..b861703 --- /dev/null +++ b/src/lecture/format_strings/fmt_lec01.c @@ -0,0 +1,17 @@ +/* + * Format Strings Example 1 + * + */ +#include +#include + +int +main(int argc, char *argv[]) +{ + char buf[100]; + + fgets(buf, 100, stdin); + printf(buf); + + return EXIT_SUCCESS; +} diff --git a/src/lecture/format_strings/fmt_lec02.c b/src/lecture/format_strings/fmt_lec02.c new file mode 100644 index 0000000..cb0156e --- /dev/null +++ b/src/lecture/format_strings/fmt_lec02.c @@ -0,0 +1,29 @@ +/* + * Format Strings Example 2 + * + */ +#include +#include + +int +main(int argc, char *argv[]) +{ + int unchangeable = 0xcafebabe; + char buf[100]; + + fgets(buf, 100, stdin); + printf(buf); + + //HINT + fprintf(stderr, "unchangeable @ %p\n", &unchangeable); + + //fgets makes it impossible to overflow the buffer, + // but just in case... + if (unchangeable != 0xcafebabe) { + printf("Cookie overwritten!\n"); + printf("unchangeable changed to %#x\n", unchangeable); + exit(EXIT_FAILURE); + } + + return EXIT_SUCCESS; +} diff --git a/src/lecture/format_strings/fmt_lec03.c b/src/lecture/format_strings/fmt_lec03.c new file mode 100644 index 0000000..b67d7f8 --- /dev/null +++ b/src/lecture/format_strings/fmt_lec03.c @@ -0,0 +1,29 @@ +/* + * Format Strings Example 3 + * + */ +#include +#include + +int +main(int argc, char *argv[]) +{ + int unchangeable = 0xdeadbeef; + char buf[100]; + + fgets(buf, 100, stdin); + printf(buf); + + //HINT + fprintf(stderr, "unchangeable @ %p\n", &unchangeable); + + if (unchangeable == 0xcafebabe) { + printf("Success!\n"); + } else { + printf("Failure!\n"); + printf("unchangeable is %#x", unchangeable); + exit(EXIT_FAILURE); + } + + return EXIT_SUCCESS; +} diff --git a/src/lecture/format_strings/fmt_lec04.c b/src/lecture/format_strings/fmt_lec04.c new file mode 100644 index 0000000..1538272 --- /dev/null +++ b/src/lecture/format_strings/fmt_lec04.c @@ -0,0 +1,15 @@ +#include +#include + +int +main(int argc, char *argv[]) +{ + char buf[100]; + + fgets(buf, 100, stdin); + printf(buf); + fgets(buf, 100, stdin); + printf(buf); + + return EXIT_SUCCESS; +} diff --git a/src/lecture/heap/CMakeLists.txt b/src/lecture/heap/CMakeLists.txt new file mode 100644 index 0000000..f2876c6 --- /dev/null +++ b/src/lecture/heap/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(heap_chunks heap_chunks.c) + +add_executable(heap_smash heap_smash.c) + +add_executable(heap_uaf heap_uaf.c) +SET_FLAGS(heap_uaf "-z relro -z now -fPIE -pie -fstack-protector-all") + +add_executable(sizes sizes.c) + +# These are the files we want to give students +install(TARGETS heap_chunks heap_smash heap_uaf sizes DESTINATION "${RELEASE_DIR}/heap") +install(FILES heap_chunks.c heap_smash.c heap_uaf.c sizes.c DESTINATION "${RELEASE_DIR}/heap") diff --git a/src/lecture/heap/heap_chunks.c b/src/lecture/heap/heap_chunks.c new file mode 100644 index 0000000..6ff83d2 --- /dev/null +++ b/src/lecture/heap/heap_chunks.c @@ -0,0 +1,34 @@ +/* compiled with: gcc -o heap_chunks heap_chunks.c */ +#include +#include +#include + +#define LEN 15 + +void print_chunk(unsigned int * ptr, unsigned int len) +{ + + printf("[ prev - 0x%08x ][ size - 0x%08x ][ data buffer (0x%08x) -------> ... ] - from malloc(%d)\n", \ + *(ptr-2), + *(ptr-1), + (unsigned int)ptr, + len); +} + +int main() +{ + unsigned int * ptr[LEN]; + unsigned int lengths[] = {0, 4, 8, 16, 24, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384}; + int i; + + /* malloc chunks, and them print their fields */ + printf("mallocing...\n"); + + for(i = 0; i < LEN; i++) + ptr[i] = malloc(lengths[i]); + + for(i = 0; i < LEN; i++) + print_chunk(ptr[i], lengths[i]); + + return 0; +} diff --git a/src/lecture/heap/heap_smash.c b/src/lecture/heap/heap_smash.c new file mode 100644 index 0000000..4843e99 --- /dev/null +++ b/src/lecture/heap/heap_smash.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include + +struct toystr { + void (* message)(char *); + char buffer[20]; +}; + +void print_super(char * who) +{ + printf("%s is superrr cool......\n", who); +} + +void print_cool(char * who) +{ + printf("%s is cool!\n", who); +} + +void print_meh(char * who) +{ + printf("%s is meh...\n", who); +} + +int main(int argc, char * argv[]) +{ + struct toystr * coolguy = NULL; + struct toystr * lameguy = NULL; + + coolguy = malloc(sizeof(struct toystr)); + lameguy = malloc(sizeof(struct toystr)); + + coolguy->message = &print_cool; + lameguy->message = &print_meh; + + printf("Input coolguy's name: "); + fgets(coolguy->buffer, 200, stdin); + coolguy->buffer[strcspn(coolguy->buffer, "\n")] = 0; + + printf("Input lameguy's name: "); + fgets(lameguy->buffer, 20, stdin); + lameguy->buffer[strcspn(lameguy->buffer, "\n")] = 0; + + coolguy->message(coolguy->buffer); + lameguy->message(lameguy->buffer); + + return 0; +} diff --git a/src/lecture/heap/heap_uaf.c b/src/lecture/heap/heap_uaf.c new file mode 100644 index 0000000..24ee8c6 --- /dev/null +++ b/src/lecture/heap/heap_uaf.c @@ -0,0 +1,149 @@ +/* doom doesn't mess around with his gcc protections, everything is on! */ +/* compiled with: gcc -z relro -z now -fPIE -pie -fstack-protector-all -o heap_uaf heap_uaf.c */ + +#include +#include +#include +#include + +struct toystr { + void (* message)(char *); + char buffer[20]; +}; + +struct person { + int favorite_num; + int age; + char name[16]; +}; + +void print_cool(char * who) +{ + printf("%s is cool!\n", who); +} + +void print_meh(char * who) +{ + printf("%s is meh...\n", who); +} + +void secret_shell() +{ + execve("/bin/sh", NULL, NULL); +} + +void print_menu() +{ + printf("-- Menu ----------------------\n" + "1. Make coolguy\n" + "2. Make a_person\n" + "3. Delete coolguy\n" + "4. Delete a_person\n" + "5. Print coolguy message\n" + "6. Print person info\n" + "7. Quit\n" + "Enter Choice: "); +} + +/* bugs galore... but no memory corruption! */ +int main(int argc, char * argv[]) +{ + struct toystr * coolguy = NULL; + struct person * a_person = NULL; + int choice = 0; + + while(1) + { + print_menu(); + + /* get menu option */ + scanf("%u", &choice); + getc(stdin); + + /* perform menu actions */ + if(choice == 1) + { + coolguy = malloc(sizeof(struct toystr)); + printf("New coolguy is at 0x%08x\n", (unsigned int)coolguy); + + /* no memory corruption this time */ + printf("Input coolguy's name: "); + fgets(coolguy->buffer, 20, stdin); + coolguy->buffer[strcspn(coolguy->buffer, "\n")] = 0; + coolguy->message = &print_cool; + + /* yay */ + printf("Created new coolguy!\n"); + } + else if(choice == 2) + { + a_person = malloc(sizeof(struct person)); + printf("New person is at 0x%08x\n", (unsigned int)a_person); + + /* initialize a_person */ + printf("Input a_person's name: "); + fgets(a_person->name, 16, stdin); + a_person->name[strcspn(a_person->name, "\n")] = 0; + + printf("Input a_person's favorite number: "); + scanf("%u", &a_person->favorite_num); + getc(stdin); + + printf("Input a_person's age: "); + scanf("%u", &a_person->age); + getc(stdin); + if(a_person->age > 110 || a_person->age < 0) + printf("Wow your age is pretty crazy yo\n"); + + /* all done here */ + printf("Created a new person!\n"); + } + else if(choice == 3) + { + if(coolguy) + { + free(coolguy); + printf("Deleted coolguy!\n"); + } + else + printf("There is no coolguy to free!\n"); + } + else if(choice == 4) + { + if(a_person) + { + free(a_person); + printf("Deleted person!\n"); + } + else + printf("There is no person to free!\n"); + } + else if(choice == 5) + { + if(coolguy) + coolguy->message(coolguy->buffer); + else + printf("There is no coolguy to print the cool message!\n"); + } + else if(choice == 6) + { + if(a_person) + { + printf("Person's name: %s\n", a_person->name); + printf("Person's age: %d\n", a_person->age); + printf("Persons' favorite number: %u\n", a_person->favorite_num); + } + else + printf("There is no person to print!\n"); + } + else if(choice == 7) + break; + else + printf("Invalid choice!\n"); + + choice = 0; + } + + printf("See you tomorrow!\n"); + return 0; +} diff --git a/src/lecture/heap/print_frees.c b/src/lecture/heap/print_frees.c new file mode 100644 index 0000000..4b3ba9c --- /dev/null +++ b/src/lecture/heap/print_frees.c @@ -0,0 +1,53 @@ +/* compiled with: gcc -o print_frees print_frees.c */ +#include +#include +#include + +#define LEN 15 + +void print_chunk(unsigned int * ptr) +{ + /* LOL MAGIC */ + int is_free = *((*(ptr-1) & ~7)/4 + (ptr-1)) & 1; + + if(is_free) + { + printf("[ prev - 0x%08x ][ size - 0x%08x ][ data buffer (0x%08x) ----> ... ] - Chunk 0x%08x - In use\n", \ + *(ptr-2), + *(ptr-1), + (unsigned int)ptr, + (unsigned int)(ptr-2)); + }else{ + + printf("[ prev - 0x%08x ][ size - 0x%08x ][ fd - 0x%08x ][ bk - 0x%08x ] - Chunk 0x%08x - Freed\n", \ + *(ptr-2), + *(ptr-1), + *ptr, + *(ptr+1), + (unsigned int)(ptr-2)); + } + +} + +int main() +{ + unsigned int * ptr[LEN]; + unsigned int lengths[] = {0, 4, 8, 16, 24, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384}; + int i; + + printf("mallocing...\n"); + for(i = 0; i < LEN; i++) + ptr[i] = malloc(lengths[i]); + + for(i = 0; i < LEN; i++) + print_chunk(ptr[i]); + + printf("\nfreeing every other chunk...\n"); + for(i = 0; i < LEN; i+=2) + free(ptr[i]); + + for(i = 0; i < LEN-1; i++) + print_chunk(ptr[i]); + + return 0; +} diff --git a/src/lecture/heap/sizes.c b/src/lecture/heap/sizes.c new file mode 100644 index 0000000..316e288 --- /dev/null +++ b/src/lecture/heap/sizes.c @@ -0,0 +1,27 @@ +/* compiled with: gcc -o sizes sizes.c */ + +#include +#include +#include + +int main() +{ + + unsigned int lengths[] = {32, 4, 20, 0, 64, 32, 32, 32, 32, 32}; + unsigned int * ptr[10]; + int i; + + /* make arbitrary chunks on the heap */ + for(i = 0; i < 10; i++) + ptr[i] = malloc(lengths[i]); + + /* print distance between chunks, eg size of chunks */ + for(i = 0; i < 9; i++) + printf("malloc(%2d) is at 0x%08x, %3d bytes to the next pointer\n", + lengths[i], + (unsigned int)ptr[i], + (ptr[i+1]-ptr[i])*sizeof(unsigned int)); + + + return 0; +} diff --git a/src/lecture/misc/CMakeLists.txt b/src/lecture/misc/CMakeLists.txt new file mode 100644 index 0000000..565adbd --- /dev/null +++ b/src/lecture/misc/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(canary canary.c) +add_executable(heap heap.c) +add_executable(uninitialized_data uninitialized_data.c) + +# These are the files we want to give students +install(TARGETS canary heap uninitialized_data DESTINATION "${RELEASE_DIR}/misc") +install(FILES canary.c heap.c uninitialized_data.c DESTINATION "${RELEASE_DIR}/misc") diff --git a/src/lecture/misc/canary.c b/src/lecture/misc/canary.c new file mode 100644 index 0000000..562b9db --- /dev/null +++ b/src/lecture/misc/canary.c @@ -0,0 +1,33 @@ +#include +#include +#define STDIN 0 +//gcc -fstack-protector-all -mpreferred-stack-boundary=2 -o canary canary.c + +void contrivedLeak() { + char buf[512]; + scanf("%s", buf); + printf(buf); + return; +} + +void contrivedOverflow() { + printf("\n..I like to read ^_^ <== "); + char buf[24]; + read(STDIN, buf, 48); + char lolz[24]; + strcpy(lolz, buf); + printf(lolz); + return; +} + +int main(int argc, char* argv[]) { + setbuf(stdout, NULL); + printf("What you give, you will get back\n"); + printf("==> white elephants: "); + contrivedLeak(); + printf("\nYou're lucky numbers are 512 and 1024\n"); + contrivedOverflow(); + printf("\n\nWoah There\n"); + return 0; + +} diff --git a/src/lecture/misc/heap.c b/src/lecture/misc/heap.c new file mode 100644 index 0000000..afc1e42 --- /dev/null +++ b/src/lecture/misc/heap.c @@ -0,0 +1,50 @@ +/* + * This level is completed when you see the “you have logged in already!” message + * https://exploit-exercises.com/protostar/heap2/ + */ + +#include +#include +#include +#include +#include + +struct auth { + char name[32]; + int auth; +}; + +struct auth *auth; +char *service; + +int main(int argc, char **argv) +{ + char line[128]; + + while(1) { + printf("[ auth = %p, service = %p ]\n", auth, service); + + if(fgets(line, sizeof(line), stdin) == NULL) break; + + if(strncmp(line, "auth ", 5) == 0) { + auth = malloc(sizeof(auth)); + memset(auth, 0, sizeof(auth)); + if(strlen(line + 5) < 31) { + strcpy(auth->name, line + 5); + } + } + if(strncmp(line, "reset", 5) == 0) { + free(auth); + } + if(strncmp(line, "service", 6) == 0) { + service = strdup(line + 7); + } + if(strncmp(line, "login", 5) == 0) { + if(auth->auth) { + printf("you have logged in already!\n"); + } else { + printf("please enter your password\n"); + } + } + } +} diff --git a/src/lecture/misc/uninitialized_data.c b/src/lecture/misc/uninitialized_data.c new file mode 100644 index 0000000..f689ee4 --- /dev/null +++ b/src/lecture/misc/uninitialized_data.c @@ -0,0 +1,56 @@ +#include +#include +#include +#define MAX_USER 1024 +#define MAX_PASS MAX_USER +#define ERR_CRITIC 0x01 +#define ERR_AUTH 0x02 + +void escape(char* cmd) +{ + system(cmd); +} + +int do_auth(void) +{ + char username[MAX_USER], password[MAX_PASS]; + fprintf(stdout, "Please enter your username: "); + fgets(username, MAX_USER, stdin); + fflush(stdin); + fprintf(stdout, "Please enter your password: "); + fgets(password, MAX_PASS, stdin); +#ifdef DEBUG + fprintf(stderr, "Username is at: 0x%08x (%d)\n", &username, strlen(username)); + fprintf(stderr, "Password is at: 0x%08x (%d)\n", &password, strlen(password)); +#endif + if(!strcmp(username, "user") && !strcmp(password, "washere")) + { + return 0; + } + return -1; +} +int log_error(int farray, char *msg) +{ + char *err, *mesg; + char buffer[24]; +#ifdef DEBUG + fprintf(stderr, "Mesg is at: 0x%08x\n", &mesg); + fprintf(stderr, "Mesg is pointing at: 0x%08x\n", mesg); +#endif + memset(buffer, 0x00, sizeof(buffer)); + sprintf(buffer, "Error: %s", mesg); + fprintf(stdout, "%s\n", buffer); + return 0; +} +int main(void) +{ + switch(do_auth()) + { + case -1: + log_error(ERR_CRITIC | ERR_AUTH, "Unable to login"); + break; + default: + break; + } + return 0; +} diff --git a/src/lecture/misc/uninitialized_data_noaslr.sh b/src/lecture/misc/uninitialized_data_noaslr.sh new file mode 100755 index 0000000..51f88e5 --- /dev/null +++ b/src/lecture/misc/uninitialized_data_noaslr.sh @@ -0,0 +1,3 @@ +#/bin/sh +# Note: This will drop privileges, and so can't be used for exploiting setuid binaries. +setarch $(uname -m) -R /levels/lecture/misc/uninitialized_data diff --git a/src/lecture/rop/CMakeLists.txt b/src/lecture/rop/CMakeLists.txt new file mode 100644 index 0000000..ec5c73f --- /dev/null +++ b/src/lecture/rop/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(rop_exit rop_exit.c) + +add_executable(rop_pivot rop_pivot.c) +SET_FLAGS(rop_pivot "-static") + +# These are the files we want to give students +install(TARGETS rop_exit rop_pivot DESTINATION "${RELEASE_DIR}/rop") +install(FILES rop_exit.c rop_pivot.c DESTINATION "${RELEASE_DIR}/rop") diff --git a/src/lecture/rop/rop_exit.c b/src/lecture/rop/rop_exit.c new file mode 100644 index 0000000..517471b --- /dev/null +++ b/src/lecture/rop/rop_exit.c @@ -0,0 +1,13 @@ +#include + +int main() +{ + char buffer[128] = {0}; + + /* break stuff */ + printf("insert ropchain: "); + gets(buffer); + + /* program always returns 0 */ + return 0; +} diff --git a/src/lecture/rop/rop_pivot.c b/src/lecture/rop/rop_pivot.c new file mode 100644 index 0000000..afa0e24 --- /dev/null +++ b/src/lecture/rop/rop_pivot.c @@ -0,0 +1,29 @@ +#include + +/* gcc -static -o rop_pivot rop_pivot.c */ + +int main(int argc, char * argv[]) +{ + char buffer[128] = {0}; + int overwrite[1] = {0}; + + if(argc < 3) + { + printf("I need two arguments\n"); + printf("Usage: %s [overwrite index] [overwrite address]\n", argv[0]); + return 1; + } + + /* create a pivot scenario */ + printf("Overwriting 0x%08x with 0x%08x\n", \ + overwrite[strtoul(argv[1], NULL, 10)], strtoul(argv[2], NULL, 10)); + overwrite[strtoul(argv[1], NULL, 10)] = strtoul(argv[2], NULL, 10); + + /* read a rop chain */ + printf("insert ropchain: "); + fgets(buffer, 128, stdin); + + /* program always returns 0 */ + return 0; +} + diff --git a/src/lecture/shellcode/CMakeLists.txt b/src/lecture/shellcode/CMakeLists.txt new file mode 100644 index 0000000..1381c76 --- /dev/null +++ b/src/lecture/shellcode/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 2.8) + +# Adds an executable target +add_executable(inject inject.c) +SET_FLAGS(inject "${NO_MITS_FLAGS}") + +# These are the files we want to give students +install(TARGETS inject DESTINATION "${RELEASE_DIR}/shellcode") +install(FILES inject.c DESTINATION "${RELEASE_DIR}/shellcode") diff --git a/src/lecture/shellcode/inject.c b/src/lecture/shellcode/inject.c new file mode 100644 index 0000000..a5d7f49 --- /dev/null +++ b/src/lecture/shellcode/inject.c @@ -0,0 +1,15 @@ +#include + +/* gcc -z execstack -fno-stack-protector -o inject inject.c */ + +int main() +{ + char buffer[128]; + + puts("where we're going"); + puts("we don't need ... roads."); + gets(buffer); + + return 0; +} + diff --git a/src/project1/CMakeLists.txt b/src/project1/CMakeLists.txt new file mode 100644 index 0000000..b9f29bf --- /dev/null +++ b/src/project1/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 2.8) + +# These are the files we want to give students +install(FILES tw33tchainz README DESTINATION "${RELEASE_DIR}/project1") diff --git a/src/project1/README b/src/project1/README new file mode 100644 index 0000000..30110da --- /dev/null +++ b/src/project1/README @@ -0,0 +1,10 @@ +Project one is representative of what you might see in the average 200 point +CTF challenge. There is no source provided and you’re expected to do some +reverse engineering with IDA. Through reversing and playing around with the +challenge, you will likely find the issues and vulnerabilities you can leverage +to take control of the challenge. + +The end goal is like any of labs. There’s a secret .pass file in the privileged +project1 account, and we would like you to extract it. + +Good luck. diff --git a/src/project1/tw33tchainz b/src/project1/tw33tchainz new file mode 100755 index 0000000000000000000000000000000000000000..0d829e7fdb65c5e55f02e0a13160e2160d83e440 GIT binary patch literal 21095 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 literal 0 HcmV?d00001 diff --git a/src/project2/CMakeLists.txt b/src/project2/CMakeLists.txt new file mode 100644 index 0000000..2e3630a --- /dev/null +++ b/src/project2/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 2.8) + +# These are the files we want to give students +install(FILES rpisec_nuke GENERAL_CROWELL.key GENERAL_DOOM.key GENERAL_HOTZ.key README DESTINATION "${RELEASE_DIR}/project2") diff --git a/src/project2/GENERAL_CROWELL.key b/src/project2/GENERAL_CROWELL.key new file mode 100644 index 0000000..0b4d4a8 --- /dev/null +++ b/src/project2/GENERAL_CROWELL.key @@ -0,0 +1 @@ +4E96E75BD2912E31F3234F6828A4A897 diff --git a/src/project2/GENERAL_DOOM.key b/src/project2/GENERAL_DOOM.key new file mode 100644 index 0000000..efa8ea2 --- /dev/null +++ b/src/project2/GENERAL_DOOM.key @@ -0,0 +1 @@ +90357303412EF822CD10E798760491A6 diff --git a/src/project2/GENERAL_HOTZ.key b/src/project2/GENERAL_HOTZ.key new file mode 100644 index 0000000..0fe347d --- /dev/null +++ b/src/project2/GENERAL_HOTZ.key @@ -0,0 +1 @@ +D3E60C90579EEE92EFD46898A911B0AF diff --git a/src/project2/README b/src/project2/README new file mode 100644 index 0000000..19e2d86 --- /dev/null +++ b/src/project2/README @@ -0,0 +1,7 @@ +There are a few different stages to this project. There is no source, so you +will be required to do some reversing. Using IDA is HIGHLY advised. + +Ultimately, this is an exploitation challenge. There is a .pass file, and you +are expected to get a shell as with the labs or last project. + +The service is running on port 31337 diff --git a/src/project2/rpisec_nuke b/src/project2/rpisec_nuke new file mode 100755 index 0000000000000000000000000000000000000000..e5eb3715d4afc9ec287f20c0e114f4ab96e5ceea GIT binary patch literal 56604 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 RHSB?e2$m>g@=C+w{tKyxs{a50 literal 0 HcmV?d00001