Pragyan CTF 2019

Cryptography

1.Spoiler

将pdf文件下载后发现pdf文件中有遗传字符串“3a2c3a35152538272c2d213e332e3c25383030373a15”,使用winhex打开pdf文件观察pdf文件二进制发现

将00去掉剩下字符串“6a6f6e736e6f776973647261676f6e62796269727468”,我们发现两个字符串长度相同,尝试异或,即可得到字符串PCTF{JON_IS_TARGARYEN}

Forensics

1.Save Earth

我们下载到一个数据包,使用的是usb协议,使用命令“tshark -r SaveEarth.pcap -T fields -e usb.capdata > usbdata.txt”将数据包中的数据提取出来,但是其中传输的数据并没有什么含义。但我们发现其中第二个字节的数字只为01,02,04,那么我们将其取出得到“0204020401020104040204010404040104040404020104040402010404040202”,我们将02视为“-”,04视为“.”,01视为“ ”,我们获得摩斯码“-.-. - ..-. ... ....- ...- ...--”,解码为ctfs4v3

2.Slow Realization

下载的文件中是一个压缩包,解压,获得一张图片和一个加密的pdf文件,在图片文件内有一个音频文件,但里面没有任何信息,于是对pdf文件爆破,pdfcrack -f flag.pdf --wordlist=rockyou.txt。可获得密码“congratulations"

3.Late PR

打开链接下载文件,直接使用winhex打开文件,搜索pctf即可找到答案

binary

1.feed_me

打开文件,使用IDA打开文件,发现

程序要求我们的输入为v9+v10+v11,满足v6==v9+v10 ,v7==v10+v11 ,v8==v11+v9。当我们获得v6,v7,v8后 ,可以接触v9,v10,v11,由于输入只可以是数字和’-',而v9,v10,v11长度为10,那么对于长度不足10的使用’-‘补足10,输入即可得到flag:

from pwn import *
p=remote("159.89.166.12",9800)
p.recvline()
line=p.recvline()
list1=line.split(";")
sum=(int(list1[0],10)+int(list1[1],10)+int(list1[2],10))/2
v9=str(sum-int(list1[1],10))
v10=str(sum-int(list1[2],10))
v11=str(sum-int(list1[0],10))
while len(v9)<10:
	v9=v9+'-'
while len(v10)<10:
	v10=v10+'-'
while len(v11)<10:
	v11=v11+'-'
s=v9+v10+v11
p.sendline(s)
print p.interactive()

3.Super Secure Vault

使用winhex打开二进制文件,进入主函数,可以看到要输入一个数满足一些条件,打开getNum可知是从”27644437104591489104652716127“中的第二个参数开始截取第三个参数长度的字符串并转为数字,mod函数是求余这样我们就可以得到5个式子:

x%27644437=213;
x%10459=229;
x%1489=25;
x%1046527=83;
x%16127=135

这里我们使用中国剩余定理求解 

import math
import gmpy2
n1=27644437
n2=10459
n3=1489
n4=1046527
n5=16127
sum=n1*n2*n3*n4*n5
M1=sum/n1
M1ni=int(gmpy2.invert(M1,n1))
M2=sum/n2
M2ni=int(gmpy2.invert(M2,n2))
M3=sum/n3
M3ni=int(gmpy2.invert(M3,n3))
M4=sum/n4
M4ni=int(gmpy2.invert(M4,n4))
M5=sum/n5
M5ni=int(gmpy2.invert(M5,n5))
x=M1*M1ni*213+M2*M2ni*229+M3*M3ni*25+M4*M4ni*83+M5*M5ni*135
print x%sum

我们可以获得key,接下来我们要获得password,我们随机输入字符,使用gdb调试发现在0x555555554a8c的cmp cl, al,在此时rcx里放的是我们输入的字符串,而rax里放的是目标字符串,那么我们可以获得部分flag,而在0x555555554bea的cmp  dil, al,rdi里放着我们输入的字符串,在rax中放着目标字符串,将两者连接就可以获得目标字符串,最后获得flag:pctf{R3v3rS1Ng_#s_h311_L0t_Of_Fun}

猜你喜欢

转载自blog.csdn.net/zhang14916/article/details/88388884
ctf