BUUMisc通关9

【INSHack2019】Crunchy

知识点:Pisano周期问题(斐波拉契数列)

Pisano 周期

公式:$u_{n+2} = b∗u_{n+1} + c∗u_n$

定义:

image-20210726153610996

题目分析

根据题目我们可以知道返回值:return 6 * crunchy(n - 1) + crunchy(n - 2)

计算斐波拉契数列,其中系数为 6,模为 100000007

通过 sagemath 可以快速计算递归结果:

sage计算Pisano 周期问题相关模块

1
2
3
4
5
6
7
8
9
#sage
g = 17665922529512695488143524113273224470194093921285273353477875204196603230641896039854934719468650093602325707751568
mod = 100000007
R = BinaryRecurrenceSequence(6,1)
#计算序列的周期
cycle = R.period(mod)
print(R(g%cycle)%mod)

#output :41322239

flag{41322239}

【羊城杯 2020】signin

知识点:toy Cipher

toy Cipher.pdf

题目分析

题目

BCEHACEIBDEIBDEHBDEHADEIACEGACFIBDFHACEGBCEHBCFIBDEGBDEGADFGBDEHBDEGBDFHBCEGACFIBCFGADEIADEIADFH

image-20211011154904593

根据 Toy Cipher的加密规则,将密文每四个一组,对照加密表解密。

根据题目提示,将加密表逆序,再次对照解密

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
cipherList = {'M':'ACEG','R':'ADEG','K':'BCEG','S':'BDEG','A':'ACEH','B':'ADEH','L':'BCEH','U':'BDEH','D':'ACEI','C':'ADEI','N':'BCEI','V':'BDEI','H':'ACFG','F':'ADFG','O':'BCFG','W':'BDFG','T':'ACFH','G':'ADFH','P':'BCFH','X':'BDFH','E':'ACFI','I':'ADFI','Q':'BCFI','Y':'BDFI'}
flag1 = ""
# s = 'BCEHACEIBDEIBDEHBDEHADEIACEGACFIBDFHACEGBCEHBCFIBDEGBDEGADFGBDEHBDEGBDFHBCEGACFIBCFGADEIADEIADFH'
# for i in range(0,len(s),4):
#     block = s[i:i+4]
#     for j in cipherList:
#         if block==cipherList[j]:
#             flag1 += j
# print(flag1)

s2 = "LDVUUCMEXMLQSSFUSXKEOCCG"
cipherList2 = ['M', 'R', 'K', 'S', 'A', 'B', 'L', 'U', 'D', 'C', 'N', 'V', 'H', 'F', 'O', 'W', 'T', 'G', 'P', 'X', 'E', 'I', 'Q', 'Y']
# cipherList2.reverse()
cipherList3 = ['Y', 'Q', 'I', 'E', 'X', 'P', 'G', 'T', 'W', 'O', 'F', 'H', 'V', 'N', 'C', 'D', 'U', 'L', 'B', 'A', 'S', 'K', 'R', 'M']
flag2 = ''
for i in s2:
    for j in cipherList2:
        if i==j:
            rank = cipherList2.index(j)
            flag2 += cipherList3[rank]

print(flag2)

GWHT{TOYSAYGREENTEAISCOOL}

【羊城杯 2020】TCP_IP

知识点:TCP/IP隐写、tshark抓包

Wireshark—— Identification

ip.id

在网络链路中,一个数据包的发送经常会经过多个节点,那么在不同节点抓到报文后,如何确定目前查看的这个报文是否是从源端发过来,问题复现的那段报文; 或者数据流量比较大,同时刻的报文数量很多,已经无法根据时间来确认具体的报文是哪一条时,又需要确定具体的报文情况时,就需要用到这个字段:Identification(该字段可以理解成报文的唯一标识符,用来标记报文的唯一性,尤其是在该报文经过了各种NAT转发后,该值是不会发生改变的。) 在wireshark中,该字段被书定义为ip.id

image-20211011191447844

tshark抓包

参数:

-r 设置tshark分析的输入文件

-T 设置解码结果输出的格式 -e 指定打印参数

如:

-T fields -e http.host -e http.request.uri :打印http.host和http.request.uri

题目分析

kali tshark抓包提取TCP流量中的Identification数据

ip.id

1
tshark -r attachment.pcap -T fields -e ip.id > data.txt

修改后的text:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
0x40
0x69
0x48
0x3c
0x2c
0x7b
0x2a
0x3b
0x6f
0x55
0x70
0x2f
0x69
0x6d
0x22
0x51
0x50
0x6c
0x60
0x79
0x52
0x2a
0x69
0x65
0x7d
0x4e
0x4b
0x3b
0x2e
0x44
0x21
0x58
0x75
0x29
0x62
0x3a
0x4a
0x5b
0x52
0x6a
0x2b
0x36
0x4b
0x4b
0x4d
0x37
0x50
0x40
0x69
0x48
0x3c
0x2c
0x7b
0x2a
0x3b
0x6f
0x55
0x70
0x2f
0x69
0x6d
0x22
0x51
0x50
0x6c
0x60
0x79
0x52

16进制解码,去除重复的部分得到:

1
@iH<,{*;oUp/im"QPl`yR*ie}NK;.D!Xu)b:J[Rj+6KKM7P

base91解码

1
flag{wMt84iS06mCbbfuOfuVXCZ8MSsAFN1GA}

【CFI-CTF 2018】Kadyrov's Cat

知识点:EXIF信息、PDF查看作者

EXIF中存储着坐标信息

PDF用WPS工具打开,查看文件属性有 作者信息

题目分析

缺失的题目描述: A man from the soviet union has sent you two strange documents. Find the identity of the man as well as his location. Flag format is : CFI{Firstname_Lastname_of_City}

打开图片得到坐标信息

image-20211014202456424

用Google地球输入坐标得到: image-20211014202623253

城市信息得到:Riga

用WPS查看PDF的作者:

image-20211014202832148

Kotik Kadyrov

flag{Kotik_Kadyrov_of_Riga}

【GKCTF 2021】0.03

知识点:NTFS 文件隐写、VeraCrypt磁盘挂载

磁盘挂载工具 VeraCrypt

题目分析

1.先用NTFS 扫描文件目录下的隐藏文件

image-20211011162521426

2.手机键盘密码解密,得到:

311:3行1列 UBMMASJJMU

311:3列1行 EBCCAFDDCE

image-20211011163211959

3.磁盘挂载

磁盘挂载工具 VeraCrypt

挂载密码 EBCCAFDDCE

挂载成功拿到 flag

flag{85ec0e23-ebbe-4fa7-9c8c-e8b743d0d85c}

【NPUCTF2020】HappyCheckInVerification

知识点:

题目分析

用 kali 中的 binwalk -e 解压文件,得到一张残缺的二维码,手动修复一下。去掉窗口阴影

image-20211014212710207

扫描得到:

1
2
flag{this_is_not_flag}三曳所諳陀怯耶南夜缽得醯怯勝數不知喝盧瑟侄盡遠故隸怯薩不娑羯涅冥伊盧耶諳提度奢道盧冥以朋罰所即栗諳蒙集皤夷夜集諳利顛呐寫無怯依奢竟
#¥#%E68BBFE4BD9BE68B89E6A0BCE79A84E5A7BFE58ABFE59CA8E69C80E5908E32333333||254333254242254338254342254231254338254345254432254238254643254236254145254239254441254437254234254232254131254236254245253244253244254343254438254330254341254336254435...sadwq#asdsadasf faf$use$dasdasdafafa_$ba##se64$

解与佛论禅

image-20211014214246218

解 base16

image-20211014214554240

做不会了....

【GWCTF2019】math

知识点:pwntools交互、recvuntil()函数

CTF常用 pwntools参数

1
2
3
4
5
6
7
8
9
send(data):                        发送数据
sendline(data) :                   发送一行数据相当于在末尾加\n      
recv(numb=4096, timeout=default) : 给出接收字节数,timeout指定超时
recvuntil(delims, drop=False) :    接收到delims的pattern
以下可以看作until的特例
recvline(keepends=True) :          接收到\nkeepends指定保留\n
recvall() : 接收到EOF
recvrepeat(timeout=default) :      接收到EOF或timeout
interactive() :                    与shell交互

题目分析

IDA分析获取核心源码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
int __cdecl main(int argc, const char **argv, const char **envp)
{
  unsigned int seed; // ST14_4
  unsigned int v4; // ST18_4
  unsigned int v5; // ST1C_4
  unsigned int v6; // ST20_4
  unsigned int v7; // ST24_4
  signed int v9; // [rsp+10h] [rbp-130h]
  char buf; // [rsp+30h] [rbp-110h]
  unsigned __int64 v11; // [rsp+138h] [rbp-8h]

  v11 = __readfsqword(0x28u);
  setvbuf(stdin, 0LL, 2, 0LL);
  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stderr, 0LL, 2, 0LL);
  v9 = 0;
  seed = time(0LL);
  srand(seed);
  do
  {
    alarm(5u);
    v4 = rand() % 200;
    v5 = rand() % 200;
    v6 = rand() % 200;
    v7 = rand() % 200;
    puts("Pass 150 levels and i will give you the flag~");
    puts("====================================================");
    printf("Now level %d\n", (unsigned int)v9);
    printf("Math problem: %d * %d - %d + %d = ??? ", v4, v5, v6, v7);
    puts("Give me your answer:");
    read(0, &buf, 0x80uLL);
    if ( (unsigned int)strtol(&buf, 0LL, 10) != v5 * v4 - v6 + v7 )
    {
      puts("Try again?");
      exit(0);
    }
    puts("Right! Continue~");
    ++v9;
    sleep((unsigned __int64)"Right! Continue~");
  }
  while ( v9 <= 149 );
  if ( v9 != 150 )
  {
    puts("Wrong!");
    exit(0);
  }
  puts("Congratulation!");
  system("/bin/sh");
  return 0;
}

由源码可知,需要进行150次 math计算,才能继续下一关

从这里可以看出,计算的格式是固定的

1
printf("Math problem: %d * %d - %d + %d = ??? ", v4, v5, v6, v7);

exp:

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

remote=remote('node4.buuoj.cn','28832')
for i in range(0,150):
      rec=remote.recvuntil('problem: ')#定位到问题
      print(rec)
      a=int(remote.recvuntil('*')[:-1])#获取乘法的第一个值
      # print(a)
      b=int(remote.recvuntil('-')[:-1])#获取乘法的第二个值
      c=int(remote.recvuntil('+')[:-1])#获取加法的第一个值
      d=int(remote.recvuntil('=')[:-1])#获取加法的第二个值
      # print(a,b,c,d)
      remote.sendline(str(a*b-c+d)) #反弹计算结果
remote.interactive()               #与远端交互,这样才能远程命令去找flag。

image-20211015213220749

cat flag.txt flag{dc2217bc-6a9d-45f5-8403-24fbabd0c087}

【羊城杯 2020】逃离东南亚

知识点:CRC修复图片,Silenteye(wav音频隐写)、Beyond Compare 4文件对比分析

题目分析

三份日记文件。解压第一份,其余两份加密了的

第一份打开,给了一份 img.png 图片,用 010editor 打开,有CRC报错,说明图片的宽高不对

CRC恢复图片宽高.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import os,sys
os.chdir(sys.path[0])
import zlib
import struct
 
filename = 'img.png'
with open(filename, 'rb') as f:
    all_b = f.read()
    crc32key = int(all_b[29:33].hex(),16)
    data = bytearray(all_b[12:29])
    n = 4095            #理论上0xffffffff,但考虑到屏幕实际/cpu,0x0fff就差不多了
    for w in range(n):          #高和宽一起爆破
        width = bytearray(struct.pack('>i', w))     #q为8字节,i为4字节,h为2字节
        for h in range(n):
            height = bytearray(struct.pack('>i', h))
            for x in range(4):
                data[x+4] = width[x]
                data[x+8] = height[x]
            crc32result = zlib.crc32(data)
            if crc32result == crc32key:
                print("宽为:",end="")
                print(width)
                print("高为:",end="")
                print(height)
                exit(0)

# 宽为:bytearray(b'\x00\x00\x00\xf9')
# 高为:bytearray(b'\x00\x00\x01,') 

得到:

image-20210726161115043

wdnmd,成功解压第二份日记文件

wav文件,很容易想到silenteye隐写,直接把音频拖进silenteye,得到第三个压缩包密码

image-20210726162118791

This1sThe3rdZIPpwd,成功解压第三份日记

根据日记的提示,应该是在代码中进行了文字的隐写

Ga1@xy大佬的博客 中直接找到了 Github 上的源码,这信息搜索能力tql

把源码下载下来,直接Beyond Compare 4一把梭,对比文件夹,调整规则,可以直接看到三个被修改的文件

image-20210726173243061

继续分析文本,在每个} 后面都跟了8个 tab 键 和空格。将其都转换为 二进制数据

image-20210726174500049

把 elf 文件下的 rtld.c、malloc文件夹下的malloc.c 、arena.c 三个文件都放在同一文件夹下。脚本提取数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
line=''
f=open("malloc.c","r")
line=f.readline()
while line:
    line=f.readline()
    if '}' in line:
        flag=0
        ans=''
        for i in line:
            if i == '}':
                flag=1
                continue
            if flag:
                if i== '\t':
                    ans+='1'
                    #print(1,sep='',end='')
                if i== ' ':
                    ans+='0'
                    #print(0,sep='',end='')
            if len(ans) == 8 and flag == 1:
                #print(ans,end=' ')
                break
        #for i in ans:
        #print(ans)
        if len(ans) == 8:
            #print(ans)
            #print(int(ans,2))
            print(chr(int(ans,2)),sep='',end='')

脚本后面再补吧,网上随便找了个

flag{code_steganography_1s_funny!}

updatedupdated2022-06-032022-06-03