攻防世界密码学做题记录

sherlock

附件是一本书的内容,发现其中有些字母莫名地大写
在这里插入图片描述
利用命令cat 文件名 | grep -Eo ‘[A-Z]’ |tr -d '\n’将大写字母提取出来

cat 29.txt | grep -Eo '[A-Z]' |tr -d '\n'

(语言为Linux的bash)
在这里插入图片描述
或者用脚本:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    fstream infile;
    infile.open("29.txt");

    char ch;
    while (!infile.eof())
    {
        infile.get(ch);
        if (ch >= 'A' && ch < 'Z')
            cout << ch;
    }
    infile.close();    
    return 0;        
}

得:
ZEROONEZEROZEROZEROZEROONEZEROZEROONEZEROZEROONEZEROZEROONEZEROONEZEROONEZEROONEZEROZEROZEROONEZEROONEZEROZEROONEONEZEROONEZEROZEROZEROZEROONEONEZEROONEZEROONEZEROONEZEROZEROZEROONEZEROZEROZEROONEONEZEROZEROONEONEONEONEZEROONEONEZEROONEONEZEROONEZEROZEROZEROZEROZEROONEONEZEROZEROZEROONEZEROONEONEZEROZEROONEZEROZEROZEROZEROONEONEZEROZEROONEONEZEROONEZEROONEONEONEONEONEZEROZEROONEONEZEROZEROZEROONEZEROONEONEZEROONEONEONEZEROZEROONEZEROONEONEONEONEONEZEROONEONEONEZEROZEROZEROZEROZEROONEONEZEROONEONEZEROZEROZEROZEROONEONEZEROONEZEROZEROZEROZEROONEONEZEROZEROZEROONEZEROONEONEZEROONEONEONEZEROZEROONEZEROONEONEONEONEONEZEROZEROONEONEZEROONEZEROONEZEROZEROONEONEZEROZEROZEROONEZEROZEROONEONEZEROONEONEONEZEROZEROONEONEZEROZEROONEONEZEROONEONEONEONEONEZEROONE
是英文的0和1,哈哈哈。将ZERO用0替代,ONE用1替代(在虚拟机用^C命令即可替换)
得:
010000100100100101010100010100110100001101010100010001100111101101101000001100010110010000110011010111110011000101101110010111110111000001101100001101000011000101101110010111110011010100110001001101110011001101111101
然后再转换:
在这里插入图片描述
补充知识:
用法: grep [选项]… 模式 [文件]…
-E, --extended-regexp <模式> 是扩展正则表达式
-o, --only-matching 只显示行中非空匹配部分
[] #匹配一个指定范围内的字符,如’[Gg]rep’匹配Grep和grep。

用法:tr [选项]… SET1 [SET2]
-d, --delete delete characters in SET1, do not translate
#删除SET1中的字符,不进行翻译
\n 换行

cr3-what-is-this-encryption

在这里插入图片描述
看到题目中的p,q,e,就想到了RSA加密
大致思路:
先把p,q,e转成十进制,再根据公式求出n,d,m
n=p*q
φ(N) = (p-1)(q-1)
e * d % φ(N) = 1(d是私钥,e是公钥)
m=c^ d mod n (m是明文)

import libnum
from Crypto.Util.number import long_to_bytes

q = int("0xa6055ec186de51800ddd6fcbf0192384ff42d707a55f57af4fcfb0d1dc7bd97055e8275cd4b78ec63c5d592f567c66393a061324aa2e6a8d8fc2a910cbee1ed9",16)
p = int("0xfa0f9463ea0a93b929c099320d31c277e0b0dbc65b189ed76124f5a1218f5d91fd0102a4c8de11f28be5e4d0ae91ab319f4537e97ed74bc663e972a4a9119307",16)

e = int("0x6d1fdab4ce3217b3fc32c9ed480a31d067fd57d93a9ab52b472dc393ab7852fbcb11abbebfd6aaae8032db1316dc22d3f7c3d631e24df13ef23d3b381a1c3e04abcc745d402ee3a031ac2718fae63b240837b4f657f29ca4702da9af22a3a019d68904a969ddb01bcf941df70af042f4fae5cbeb9c2151b324f387e525094c41",16)

c = 0x7fe1a4f743675d1987d25d38111fae0f78bbea6852cba5beda47db76d119a3efe24cb04b9449f53becd43b0b46e269826a983f832abb53b7a7e24a43ad15378344ed5c20f51e268186d24c76050c1e73647523bd5f91d9b6ad3e86bbf9126588b1dee21e6997372e36c3e74284734748891829665086e0dc523ed23c386bb520

n = q*p
 
d = libnum.invmod(e, (p - 1) * (q - 1))
m = pow(c, d, n)   # m 的十进制形式
string = long_to_bytes(m)  # m明文
print(string)  # 结果为 b‘ m ’ 的形式

flag_in_your_hand

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数组a 尝试用ASCII码转换解出
115 101 99 117 114 105 116 121 45 120 98 117
security

告诉你个秘密

在这里插入图片描述
一看是十六进制,先转成ASCII码

cjV5RyBscDlJIEJqTSB0RmhCVDZ1aCB5N2lKIFFzWiBiaE0g

看样子像base64加密。我们试着base64解密。

r5yG lp9I BjM tFhBT6uh y7iJ QsZ bhM 

得到七段字符,在键盘上发现每段字符包围着一个字母,这些字母就是flag了

TONGYUAN

Broadcast

在这里插入图片描述
在这里插入图片描述
直接把flag写在代码里了

工业协议分析2

在这里插入图片描述
用wireshark打开pcapng文件,发现存在大量UDP流量包,大部分UDP流量包的长度相同,只有一些长度的UDP流量包仅出现过一次,猜测它们可能有异常。
查看这些流量包,发现在这里插入图片描述
将该字符串提取出来:

666c61677b37466f4d3253746b6865507a7d

发现最大不超过F,猜测是16进制,将其转成字符串,得到flag:
在这里插入图片描述

你猜猜

在这里插入图片描述
拿到文件后,发现是504B0304开头的。这是zip文件头,打开winhex,将那段16进制复制进去,选择ASCⅠⅠ HEX
在这里插入图片描述

保存该文件得到一个压缩包flag.zip。打开后发现有密码。
在这里插入图片描述

用Ziperello破解,得到密码为123456

在这里插入图片描述

在这里插入图片描述

banana-princess

得到一个pdf
但是打不开

扔进winhex
发现开头是%CQS-1.5
而我拿一个正常的pdf是%PDF-1.7
形式完全一样啊,数字可以理解为版本号。那就思路来了,估计是进行了位移?尝试后发现:在这里插入图片描述

cat 1.pdf | tr 'A-Za-z' 'N-ZA-Mn-za-m' > 2.pdf

得到一个2.pdf
在这里插入图片描述
flag被遮掩了
用在线工具将pdf转成html 在线工具下载压缩包,解压
发现有两张照片,其中一张就含有flag

在这里插入图片描述

safer-than-rot13

解压得到 cry100文件,复制文件内容尝试进行 rot13解密,没发现什么

在尝试 词频分析,利用在线工具:https://quipqiup.com/
在这里插入图片描述
得到flag:no this is not crypto my dear
但格式搞了一会儿
要把空格改为下划线no_this_is_not_crypto_my_dear

easychallenge

下载附件,得到一个pyc文件
有关pyc文件的介绍
那么我们反编译一下看看它的源码是什么
在线反编译

得到以下代码:

#! /usr/bin/env python 2.7 (62211)
#coding=utf-8
# Compiled at: 2018-08-08 22:29:44
#Powered by BugScaner
#http://tools.bugscaner.com/
#如果觉得不错,请分享给你朋友使用吧!
import base64
 
def encode1(ans):
    s = ''
    for i in ans:
        x = ord(i) ^ 36
        x = x + 25
        s += chr(x)
 
    return s
 
 
def encode2(ans):
    s = ''
    for i in ans:
        x = ord(i) + 36
        x = x ^ 36
        s += chr(x)
 
    return s
 
 
def encode3(ans):
    return base64.b32encode(ans)
 
 
flag = ' '
print 'Please Input your flag:'
flag = raw_input()
final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
if encode3(encode2(encode1(flag))) == final:
    print 'correct'
else:
    print 'wrong'

发现flag经过encode1、encode2、encode3,后,只要与final相等,则会输出correct,所以只需将整个函数过程逆向进行一遍,就能得到flag,代码如下。

import base64
def decode1(ans):
    s=''
    for i in ans:
        x=ord(i)-25
        x=chr(x^36)
        s+=x
    return s

def decode2(ans):
    s=''
    for i in ans:
        x=i  //在这里不用再使用ord()了,因为base32decode输出的是int
        x=x ^ 36
        x=chr(x-36)
        s+=x
    return s

def decode3(ans):
    return base64.b32decode(ans)
    
final='UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
flag=decode1(decode2(decode3(final)))
print(flag)

转轮机加密

在这里插入图片描述
打开附件,内容为:
在这里插入图片描述
根据密钥提示,将第二行换到第一行,以此类推,第六行换到第十三行。
在这里插入图片描述
然后按照密文,将每一行进行循环移位,使得其首位字母与对应的密文相同
在这里插入图片描述
为了方便,可以把每一列的内容单独拿出来。
在这里插入图片描述
根据题目提示“二战”,只有第18列字符串“FIREINTHEHOLE”(fire in the hole–小心手雷)比较符合。

所以最终flag为: fireinthehole

easy_ECC

附件:
已知椭圆曲线加密Ep(a,b)参数为
p = 15424654874903
a = 16546484
b = 4548674875
G(6478678675,5636379357093)
私钥为
k = 546768
求公钥K(x,y)
ECC公钥的加密原理

贴一个大佬脚本


Gx = 6478678675
Gy = 5636379357093
a = 16546484 
b = 4548674875
p = 15424654874903
k = 546768
x = Gx
y = Gy
for i in range(k-1):
    if (x==Gx and y==Gy):
        inv = pow(2*Gy, p-2,p)
        temp = (3*Gx*Gx+a)*inv%p
    else:
        inv = pow((x-Gx), p-2,p)
        temp = (y-Gy)*inv%p

    xr = (temp*temp-Gx-x)%p
    yr = (temp*(x-xr)-y)%p
 #print(i,xr,yr)
    x = xr
    y = yr
print(x+y)

在这里插入图片描述

enc

在这里插入图片描述
将ZERO替换为0,ONE替换为1,得:

0100110001101001001100000110011101001100011010010011000001110101010011000110100101000001011101010100100101000011001100000111010101001100011010010011000001100111010011000101001100110100011101000100110001101001010000010111010001001001010000110011010001110101010011000101001100110100011001110100110001010011010000010111010101001100011010010011010001110101010010010100001100110100011101000100110001010011001100000111010001001001010000110011010001110101010011000110100100110100011101010100100101000011001100000111010001001100010100110100000101110101010011000101001100110000011101000100110001010011010000010111010101001100011010010011010001100111010011000101001100110000011101000100100101000011001101000111010101001100011010010011010001110101010010010100001100110100011101010100110001010011010000010111010101001100010100110011000001110101010010010100001100110100011101010100110001101001001100000111010001001001010000110011010001110100010011000110100101000001011101000100110001010011001100000110011101001100011010010011010001110101010011000110100100110100011001110100110001101001010000010111010001001100011010010011000001110101010010010100001100110100011101000100110001101001010000010111010101001100011010010011010001110100010011000101001101000001011101000100100101000011001100000111010001001100010100110100000101110100010010010100001100110000011101010100110001101001001100000110011101001100010100010011110100111101

用ASCII编码得:

Li0gLi0uLiAuIC0uLi0gLS4tLiAtIC4uLS4gLSAuLi4uIC4tLS0tIC4uLi4uIC0tLSAuLS0tLSAuLi4gLS0tIC4uLi4uIC4uLSAuLS0uIC4uLi0tIC4tLiAtLS0gLi4uLi4gLiAtLi0uIC4tLiAuLi4tLSAtIC0tLSAtIC0uLi0gLQ==

看着是base64编码,解码得:

.- .-.. . -..- -.-. - ..-. - .... .---- ..... --- .---- ... --- ..... ..- .--. ...-- .-. --- ..... . -.-. .-. ...-- - --- - -..- -

进行Morse Code解码得:
ALEXCTFTH15O1SO5UP3RO5ECR3TOTXT

这里最坑的就是要自己加’{}'还有把某个字符替换成 ‘_’,尝试后获得:ALEXCTF{TH15_1S_5UP3R_5ECR3T_TXT}

fanfie

下载附件,得到如下的字符串。 长度不长,大写字母和数字组成。 很容易让人想到 Base64/32 解密。

MZYVMIWLGBL7CIJOGJQVOA3IN5BLYC3NHI

Base64 : 由 0-9、a-z、A-Z、+、/ 及后缀 “=” 组成 将任意字节序列数据编码成ASCII字符串
Base32 : 用32个可打印字符 A-Z、2-7 对任意字节数据进行编码

然而通过Base64解码并没有发现什么.

进行base32加密后得到的是:

IJEVIU2DKRDA====

与密文前面几位进行对应,发现:

MZYVMIWLGBL7CIJOGJQVOA3IN5BLYC3NHI
IJEVIU2DKRDA====

发现上面相同的字母对应的下面的字母也一致。(如 M - I 、L - D)既然如此,那便有迹可循。
因为是Base32编码。那么对A-Z、2-7 进行编码:
在这里插入图片描述
由此更直观可见,字母对应关系

3 ->11 4 ->24 8 ->12 20 ->8 21->21 25->9 26->22
这种一个字母替换一个字母的替换密码就是 仿射密码
仿射密码的a = 13和b = 4,对应表如下:
在这里插入图片描述

则密文进行仿射解密得:

MZYVMIWLGBL7CIJOGJQVOA3IN5BLYC3NHI -> IJEVIU2DKRDHWUZSKZ4VSMTUN5RDEWTNPU

对 IJEVIU2DKRDHWUZSKZ4VSMTUN5RDEWTNPU进行base32解密得:

BITSCTF{S2VyY2tob2Zm}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 对于攻防世界pwn新手,其中一个关键是要修改全局变量pwnme的内容。通过格式化字符串的方法,可以实现这个目标。格式化字符串的原理是利用输入的格式化字符串,修改内存中的指定位置的值。具体的方法可以参考CTF-wiki上对格式化字符串的总结。另外,还可以利用栈溢出漏洞来实现攻击。栈溢出漏洞的原理是当输入的数据超过了栈的缓冲区大小时,会覆盖到相邻的内存区域,包括函数返回地址等重要信息。通过溢出覆盖system函数的参数为"/bin/sh",就可以获取到shell权限。在IDA32中,可以通过查看字符串窗口,找到可以直接利用的字符串,比如system和/bin/sh。这样就可以猜测需要溢出覆盖system函数的参数,实现获取shell的目的。123 #### 引用[.reference_title] - *1* *2* [xctf攻防世界pwn基础解(新手食用)](https://blog.csdn.net/lplp9822/article/details/89735167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *3* [攻防世界 pwn 二进制漏洞简单练习区 答(1-10解)](https://blog.csdn.net/qq_33957603/article/details/122450397)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值