Making challenges public

2022
six 2022-10-29 13:59:00 +02:00
parent 01d9c00e10
commit f681ab0196
9 changed files with 251 additions and 15 deletions

View File

@ -0,0 +1,16 @@
## search&ink! challenge
This challenge has four requirements to pass:
1. Map the services behind 45.77.137.182 and a way to connect (Alice helps!)
2. Find the flag on-chain! Format as in other challenges PMC{...}
3. Deploy the flipper ink! smart contract from your player DOT address (the one you use in the prequalifer registration form)
4. Automate the coin clip funcion call and share the code through the registration form
This challenge requires you to have a basic understanding of Substrate and ink! smart contracts.
Please make sure to upload your solution through the form when you submit it - a text file is enough with a short explanation.
_Keccak256: 0x82703a464305aad655e2eb617f31e6e57b7e959bf8528f1d3b5968cc02ed60ac_
_Challenge author: six_

View File

@ -0,0 +1,10 @@
## Kusamaverse challenge
This is a very simple challenge. Just find the Polkadot Ambassador space in the Kusamaverse and you will know what to do from there.
[Kusamaverse Link](kusama.momentum.xyz/)
Please make sure to upload your code you used to solve it through the form when you submit the prequalification.
_Keccak256: 0x896c90f019d0aaa7977ce81c7d7299b1b43d302295f2d567509ab7e3060a797f_
_Challenge author: six_

View File

@ -0,0 +1,14 @@
[package]
name = "pmc"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
base64 = "0.13.0"
rand = "0.8"
num-bigint = { version = "0.4", features = ["rand"] }
byte_string = "1.0.0"
num = "0.4.0"
num-primes = "0.3.0"

View File

@ -0,0 +1,26 @@
prog :=pmc
debug ?=
$(info debug is $(debug))
ifdef debug
release :=
target :=debug
extension :=debug
else
release :=--release
target :=release
extension :=
endif
build:
cargo build $(release)
#strip -s ./target/release/$(prog)
#strip --strip-unneeded -R .note -R .comment -R .gnu.version -R .note.ABI-tag ./target/release/$(prog)
cp ./src/flag.txt ./target/release/
cp ./src/p.txt ./target/release/
cp ./src/q.txt ./target/release/
help:
@echo "usage: make $(prog) [debug=1]"

View File

@ -0,0 +1,13 @@
## Cryptography challenge (Rust)
You are given the output of one cryptography system and the code that generates the output, the problem is we do not have access to the 3 files the code uses!
The first one is the flag.txt and the others are two files that have random prime numbers P and Q!
Can you help us decrypting the output and get the flag?
This challenge requires you to have cryptography and coding skills. Any language is accepted to get the solution.
_Keccak256: 0x42ce6fca873fe4dc4ce4d9accdb53e02fdb497ffa6b30f421cea36c81d8ea289_
_Challenge author: Rooney and Factoreal_

View File

@ -0,0 +1,3 @@
n = 149611115935957861847433086030752568567261984621907082786040721407247152663716327519502231379009349403555478392331033952810164148573046688871056752042985601125672198741962270290757469688983708043363147130089304518146209920862956021757294842740478378766019286017585191433945507772906003202456007271670509560001
c1 = 11740426501805700850493692315559578006370589284427206683940757663851146928230684257857117868496707849557168733347824952878380002709870656084949136086910227474133572170435190357845596727976524907841665784086757438386127200855803916010658428188870224409869769764930590879768926281176340935298646735957803036584600929550783080264478281164795674968941326608349176841871873099501077633763111936830560662765218747733834005879942262007725665002064520328109065794417151034621508526996605515243332144564900123239641752620534071998915306976614235709910119552618406674682923068789777245990088973508240448060554699343918041672
c2 = 143776697087614888263290942500784196016072840323599778499088161935967819360208875932978673848883138508459204320371154339262196712020509264705583964011692527986711085787805336007197757175874259405887701369759903484733471121241423255620536627876637530300427365389368282535238625160577144155748657877913834928967

View File

@ -0,0 +1,102 @@
use std::fs;
extern crate num_bigint;
extern crate rand;
extern crate byte_string;
extern crate num_primes;
use num_bigint::{BigInt};
//use num_primes::Generator;
extern crate num;
use num::Integer;
use num::One;
use num::Zero;
use std::convert::TryInto;
fn pow(n: BigInt, exp: BigInt) -> BigInt {
n.pow(exp.try_into().expect("exponent too large for pow()"))
}
fn modinv(n: &BigInt, p: &BigInt) -> BigInt {
if p.is_one() { return BigInt::one() }
let (mut a, mut m, mut x, mut inv) = (n.clone(), p.clone(), BigInt::zero(), BigInt::one());
while a > BigInt::one() {
let (div, rem) = a.div_rem(&m);
inv -= div * &x;
a = rem;
std::mem::swap(&mut a, &mut m);
std::mem::swap(&mut x, &mut inv);
}
if inv < BigInt::zero() { inv += p }
inv
}
fn lcm(first: BigInt, second: BigInt) -> BigInt {
&first * &second / gcd(first, second)
}
fn gcd(first: BigInt, second: BigInt) -> BigInt {
let mut max = first;
let mut min = second;
if min > max {
let val = max;
max = min;
min = val;
}
loop {
let res = &max % &min;
if res == BigInt::parse_bytes(b"0", 2).unwrap(){
return min;
}
max = min;
min = res;
}
}
fn main() -> std::io::Result<()>{
let contents = fs::read_to_string("./flag.txt")
.expect("We lost the flag!");
let contents = contents.to_string();
let contents = contents.trim().to_string();
let mut binary_flag = "".to_string();
for character in contents.clone().bytes() {
binary_flag += &format!("{0:08b}", character);
}
let flag_int = BigInt::parse_bytes(binary_flag.as_bytes(), 2).unwrap();
// let p: BigInt = rng.sample(RandomBits::new(512));
// let q: BigInt = rng.sample(RandomBits::new(512));
let p_ = fs::read_to_string("./p.txt")
.expect("We lost the p number! You can create p.txt with a large prime P");
let p_ = p_.to_string();
let p_ = p_.trim().to_string();
let p = BigInt::parse_bytes(p_.as_bytes(), 10).unwrap();
let q_ = fs::read_to_string("./q.txt")
.expect("We lost the q number! You can create q.txt with a large prime Q");
let q_ = q_.to_string();
let q_ = q_.trim().to_string();
let q = BigInt::parse_bytes(q_.as_bytes(), 10).unwrap();
let n: BigInt = &p * &q;
println!("n = {}", &n);
let one: BigInt = BigInt::parse_bytes(b"1", 2).unwrap();
let one_: BigInt = BigInt::parse_bytes(b"1", 2).unwrap();
let e: BigInt = BigInt::parse_bytes(b"65537", 10).unwrap();
let phi = lcm(&p - &one, &q - &one);
let d: BigInt = modinv(&e, &phi);
let n_1: BigInt = &n + one;
let eight: BigInt = BigInt::parse_bytes(b"1000", 2).unwrap();
let pow_n_2: BigInt = &n * &n;
let d_8: BigInt = &d /&eight;
let c1: BigInt = n_1.modpow(&d_8, &pow_n_2);
let c2: BigInt = flag_int.modpow(&e, &n);
println!("c1 = {}", &c1);
println!("c2 = {}", &c2);
Ok(())
}

View File

@ -0,0 +1,9 @@
## Fibonacci WSS challenge
Connect to the WSS service and solve the challenge presented: 45.77.137.182:3333
This challenge requires you to have basic problem solving and coding skills. Any language is accepted for get the solution. Please make sure to upload your solution through the form when you submit it.
_Keccak256: 0x2f2d4bb11521956c486925241ffcca0cbf7b79bbd9be8eafaeb4fab95713b12d_
_Challenge author: Natoshi Sakamoto_

View File

@ -1,31 +1,74 @@
# Polkadot Metaverse Championship - Challenges # Polkadot Metaverse Championship - Challenges
Details are coming this week. ## How to qualify and get a pass to the physical event?
## Prequalification requirements (rust and js code to be added soon) Solve at least three challenges from the four provided in this repository and submit them in the form linked below.
1. Polkadot address You can find all the four prequalification challenges in the "Prequalification_Challenges" folder. If you played Capture The Flag /CTF/ games before, this process is very similar to you already.
2. Accessing PMC Metaverse
3. Fix borken code (rust or javascript) The flag format: __PMC{This_Could_be_a_Flag.!}__
4. Execute the fixed code and extract the flag
5. Submit the flag to the PMC registration form What you are looking for in each challenge is to generate the data between PMC{......}.
6. Join the event physically!
After you solve at least three challenges, you can submit the form and request your invitation:
__[Prequalify me!](https://www.cognitoforms.com/UnconditionalPeace/PolkadotMetaverseChampionshipPrequalification)__
## How to verify a flag?
You can verify your flag is correct without submitting the form. Install keccak256 with cargo and compare your findings. Example command:
```
echo 'PMC{This_Could_be_a_Flag.!}'|keccak256
```
The output of the example command should be: 0x6104a5489b671452684fee77579df24e6f2441d1f8a832c7366cf2cfc5194935
The flags have the following keccak256 values:
```
kusamaverse - 0x896c90f019d0aaa7977ce81c7d7299b1b43d302295f2d567509ab7e3060a797f
ink - 0x82703a464305aad655e2eb617f31e6e57b7e959bf8528f1d3b5968cc02ed60ac
wss - 0x2f2d4bb11521956c486925241ffcca0cbf7b79bbd9be8eafaeb4fab95713b12d
rust - 0x42ce6fca873fe4dc4ce4d9accdb53e02fdb497ffa6b30f421cea36c81d8ea289
python - 0xf00b792cd63a035c76abe2fca4afe8d8b7eb8527b9b547b672545c71ee4ca77f
```
## Prequalification challenges
__WSS challenge__: you need to play with a websocket connection and get the flag from the service.
__Rust challenge:__ you need to work with cryptography and math. The correct math will return you the flag.
__ink! challenge__: you need to get the flag from an already running Substrate node.
__Kusamaverse challenge__: find the flag in Kusamaverse - this one is very easy, but important for the main event.
We also have an __optional 3D design challenge__ for the Hall of Fame, near the four listed above. If you submit it using the form, we'll add the design to the Hall of Fame, where all the successfully prequalified players get listed.
## Support and feedback for the prequalification
We don't help with the solution. If something is unclear or you need help or think you found a bug, we are always open to hear from you.
You can contact us anytime though our email address contact@metaversechampionship.gg or you can also find six through Matrix (:hexff@matrix.org).
## Challenges for the main event ## Challenges for the main event
The details of these challenges will be shared on 2022 December 6th 10:00 CET. The teams will need to solve at least one from each track. You can already prepare libraries and some code befor the hackathon, but the final ideation and project needs to come out during the main event.
### Track 1 - Collaboration ### Track 1 - Collaboration
Challenge 1 - by Momentum Challenge 1 - by Momentum
Challenge 2 - by Unit Network Challenge 2 - Creator to be disclosed.
### Track 2 - Privacy and Security
### Track 2 - Security and Privacy
Challenge 1 - by CCTF Challenge 1 - by CCTF
Challenge 2 - To be disclosed.
Challenge 2 - Creator to be disclosed.
### Track 3 - GameFi and NFT ### Track 3 - GameFi and NFT
Challenge 1 - RMRK
Challenge 2 - KILT Protocol Challenge 1 - by RMRK
### Bonus challenges Challenge 2 - Creator to be disclosed.
To be disclosed.