2021DASCTF八月挑战赛Writeup

代码 代码 1416 人阅读 | 0 人回复

<
文章目次

MISC
签到
热王&#39;sblog
stealer
CRYPTO 
easymath
let&#39;s play with rsa~
ezRSA
REVERSE
py

看年夜佬们皆没有念写那个wp那我写一个吧Orz
MISC

签到

看看通告
  flag{welcome_to_dasctf_aug}
热王&#39;sblog

好家伙,没有明白gitee是甚么底子找没有到。间接正在url前面减上/flag.jpg会见堆栈:
  1. https://hanwang2333.gitee.io/2020/03/12/outguess/flag.jpg
复造代码
拿到flag.jpg,然后按照热王专客里的outguess解稀拿到flag
stealer

翻开流量包,过滤DNS,发明有许多反复的数据,过滤ip
  1. dns and ip.src==172.27.221.13
复造代码
将info掏出,察看发明是图片的base64编码,将字符串停止编纂便利转码。
  1. 字符串的变革以下:
  2. 本字符串:
  3. Standard query 0x6a7a A iVBORw0KGgoAAAANSUhEUgAABMoAAAMxCAIAAACVY8g6AAAAAXNSR0IAr-.s4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAP-.lSURBVHhe7P1HlBzZmd6NUxtqjrShdtzoHB6ttMROswlNp/U9OiGKwd-.f8KbRDtXw3hdQMGWBgjcF1432aDZN04MUySGHMxqvgUajGWg*6fsoffpL-.ctf.com.cn OPT
  4. 操纵:
  5. 1、来除过剩字符串”Standard query 0x6a7a A”、”ctf.com.cn OPT”、”-.”
  6. 2、将“*”交换为“+”
  7. 转化后字符串:iVBORw0KGgoAAAANSUhEUgAABMoAAAMxCAIAAACVY8g6AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAPlSURBVHhe7P1HlBzZmd6NUxtqjrShdtzoHB6ttMROswlNp/U9OiGKwdf8KbRDtXw3hdQMGWBgjcF1432aDZN04MUySGHMxqvgUajGWg+6fsoffpL
复造代码
拿到图片
110630fwodh2howy9dsfws.jpg


 
   1d3f729ac02bbc15f00adccd79207ab0
CRYPTO 

easymath

标题问题:
  1. assert(len(open(&#39;flag.txt&#39;, &#39;rb&#39;).read()) < 50)
  2. assert(str(int.from_bytes(open(&#39;flag.txt&#39;, &#39;rb&#39;).read(), byteorder=&#39;big&#39;) << 10000).endswith(
  3.     &#39;1862790884563160582365888530869690397667546628710795031544304378154769559410473276482265448754388655981091313419549689169381115573539422545933044902527020209259938095466283008&#39;))
复造代码
思绪:给您5个coin,相称于四次挑选疑息2、3的时机,当然是均匀分派啦。获得四组f、c,两组同q解n,两组差别q解p。
  计较n:
  
110630kze1hyew2miz1zw1.jpg

  计较q:
  
 
110631lmtltrzxtyb5zgl2.jpg

p、q、n、c皆明白了,常规RSA解稀。
REVERSE

py

标题问题简朴粗鲁,间接给py.exe,ida翻开shift+F12搜刮检察到pyinstaller字样(也可经由过程图标判定)认定为pyinstaller挨包,间接exe转pyc。
  1. from sympy import isprime,nextprime
  2. from Crypto.Util.number import getPrime as getprime ,long_to_bytes,bytes_to_long,inverse
  3. flag=&#39;flag{***************}&#39;
  4. def play():
  5.     p=getprime(1024)
  6.     q=getprime(1024)
  7.     n=p*q
  8.     e=65537
  9.     print "Hello,let&#39;s play rsa~\n"
  10.     print &#39;Now,I make some numbers,wait a second\n&#39;
  11.     n1=getprime(200)
  12.     n2=getprime(200)
  13.     number=n1*n2
  14.     print "Ok,i will send two numbers to you,one of them was encoded.\n"
  15.     print "Encode n1:%d,\n"%(pow(n1,e,n))
  16.     print "And n2:%d.\n"%n2
  17.     print "Information that can now be made public:the public key (n,e):(%d,%d)\n"%(n,e)
  18.     while True:
  19.         try:
  20.             c=int(raw_input("ok,now,tell me the value of the number (encode it for safe):"))
  21.         except:
  22.             print "Sorry,the input is illeagal, and the integer is accept~"
  23.         else:
  24.             break
  25.     d=inverse(e,(p-1)*(q-1))
  26.     m=pow(c,d,n)
  27.     if m==number:
  28.         print "It&#39;s easy and interesting,didn&#39;t it?\n"
  29.         print "This is the gift for you :"+flag
  30.     else:
  31.         print "Emmmmm,there is something wrong, bye~\n"
  32. if __name__ == &#39;__main__&#39;:
  33.     play()
复造代码
拿到py.pyc,上uncompyle6反编译。
  1. #n =
  2. #n2 =
  3. #e = 65537
  4. a = pow(n1,e,n) #标题问题给出
  5. c = (a * pow(n2,e,n)) % n
  6. print(c)
  7. #提交c及返回flag
复造代码
拿到py代码,简朴的同或操纵,写剧本停止顺运算输出flag。
  1. from secret import flag
  2. from Crypto.Util.number import *
  3. from random import getrandbits
  4. from hashlib import sha256
  5. class EzRsa:
  6.     def __init__(self):
  7.         self.E = 0x10001
  8.         self.P = getPrime(1024)
  9.         self.Q = getPrime(1024)
  10.         while GCD((self.P-1)*(self.Q-1), self.E) != 1:
  11.             self.Q = getPrime(1024)
  12.         self.N = self.P*self.Q
  13.     def encrypt(self):
  14.         f = getrandbits(32)
  15.         c = pow(f, self.E, self.N)
  16.         return (f, c)
  17.     def encrypt_flag(self, flag):
  18.         f = bytes_to_long(flag)
  19.         c = pow(f, self.E, self.N)
  20.         return c
  21. def proof():
  22.     seed = getrandbits(32)
  23.     print(seed)
  24.     sha = sha256(str(seed).encode()).hexdigest()
  25.     print(f"sha256({seed>>18}...).hexdigest() = {sha}")
  26.     sha_i = input("plz enter seed: ")
  27.     if sha256(sha_i.encode()).hexdigest() != sha:
  28.         exit(0)
  29. if __name__ == "__main__":
  30.     proof()
  31.     print("welcome to EzRsa")
  32.     print("""
  33.     1. Get flag
  34.     2. Encrypt
  35.     3. Insert
  36.     4. Exit
  37.     """)
  38.     A = EzRsa()
  39.     coin = 5
  40.     while coin > 0:
  41.         choose = input("> ")
  42.         if choose == "1":
  43.             print(
  44.                 f"pow(flag,e,n) = {A.encrypt_flag(flag)}\ne = 0x10001")
  45.             exit(0)
  46.         elif choose == "2":
  47.             f, c = A.encrypt()
  48.             print(f"plain = {f}\ncipher = {c}")
  49.             coin -= 1
  50.         elif choose == "3":
  51.             q = getrandbits(1024)
  52.             n = A.P*q
  53.             f = getrandbits(32)
  54.             c = pow(f, 0x10001, n)
  55.             print(f"plain = {f}\ncipher = {c}")
  56.             coin -= 1
  57.         elif choose == "4":
  58.             print("bye~")
  59.         else:
  60.             print("wrong input")
  61.     print("Now you get the flag right?")
复造代码
免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则