首页 > 其他分享 >BUUCTF MISC 61-80

BUUCTF MISC 61-80

时间:2023-03-17 12:34:30浏览次数:54  
标签:10 BUUCTF 字节 编码 61 flag 字符 字符串 80

61、黑客帝国

打开题目给的TXT文件发现很像文件的十六进制,导入010查看一下,发现是一个rar文件
image.png
将文件另存为rar得到一个加密的压缩包,无任何提示,先尝试四位纯数字爆破
image.png
得到一张无法打开的图片,放入010查看
image.png
校验发现不是PNG文件,既然文件头有问题,尝试看一下文件尾FF D9
image.png
明显是JPG文件尾(PNG文件尾:AE 42 60 82),于是修改文件头为FF D8 FF
image.png

62、你能看懂音符吗

题目给出的压缩包无法打开,使用010查看文件
image.png
发现文件头格式顺序错误,RAR的文件头为52 61 72 21 1A 07 00(文件尾一般为C4 3D 7B 00 40 07 00
image.png
正常打开后得到一个Word文档,打开后没有有效信息
image.png
尝试用formost提取,得到很多文件
image.png
在document.xml文件中发现一串奇怪的音符
image.png
使用音符在线解密即可
♭♯♪‖¶♬♭♭♪♭‖‖♭♭♬‖♫♪‖♩♬‖♬♬♭♭♫‖♩♫‖♬♪♭♭♭‖¶∮‖‖‖‖♩♬‖♬♪‖♩♫♭♭♭♭♭§‖♩♩♭♭♫♭♭♭‖♬♭‖¶§♭♭♯‖♫∮‖♬¶‖¶∮‖♬♫‖♫♬‖♫♫§=

63、caesar

题目提示凯撒加密,尝试用大佬的穷举脚本跑一下

def change(c,i):
    num=ord(c)
    if(num>=33 and num<=126):
        num=33+(num+i-33)%(94)#126-33=93
    return chr(num)
 
  
def kaisa_jiAmi(string,i):
    string_new=''
    for s in string:
        string_new+=change(s,i)
    print(string_new)
    return string_new
 
#本题有种暴力解密感觉
def kaisa_jiEmi(string):
    for i in range(0,94):
        print('第'+str(i+1)+'种可能:',end='  ')
        #区别在于 string 是该对象原本就是字符串类型, 而 str()则是将该对象转换成字符串类型。
        kaisa_jiAmi(string,i)
    
#你要知道input输入的数据类型都是string  
def main():
    print('请输入操作,注意不是平常26种:')
    choice=input('1:恺撒加密,2:凯撒穷举解密.请输入1或2:')
    if choice=='1':
        string=input('请输入需要加密字符串: ')
        num=int(input('请输入需要加密的KEY: '))
        kaisa_jiAmi(string,num)
    elif choice=='2':
        string=input('请输入需要解密字符串: ')
        kaisa_jiEmi(string)
    else:
        print('输入错误,请重试')
        main()
    
if __name__=='__main__':
    main()

64、低个头

image.png
哈哈哈低个头,看键盘嘛
image.png

65、single dog

用foremost提取一下图片,得到一个TXT文本
image.png
发现是AAEncode加密
image.png

AAEncode加密

https://www.cnblogs.com/rainforwind/articles/15358505.html
将js代码转换为颜文字的混淆工具(混淆:输出的一段颜文字可以直接执行并且得到与原js相同的结果)
image.png
或者控制台解密:去掉最后一行末尾的('_')
image.png

66、我吃三明治

得到一张图片,用foremost提取分析发现有两张图片
image.png
010单看两张分离的图片没有什么特别之处,再查看原图,因为是两张JPG拼接,于是之前搜索FF D9查看拼接处是否藏有信息
image.png
在拼接处发现可能是base32的字符串,解码即可

Base编码

https://www.cnblogs.com/0yst3r-2046/p/11962942.html
(1)base16
使用16个ASCII可打印字符(数字0-9和字母A-F),对任意字节数据进行编码。
先获取输入字符串每个字节的二进制值(不足8比特在高位补0),然后将其串联进来,再按照4比特一组进行切分,将每组二进制数分别转换成十进制。
download.png
可以看到8比特数据按照4比特切分刚好是两组,所以Base16不可能用到填充符号“=”。
换句话说:Base16使用两个ASCII字符去编码原数据中的一个字节数据。
Base16编码是一个标准的十六进制字符串(注意是字符串而不是数值),更易被人类和计算机使用,因为它并不包含任何控制字符,以及Base64和Base32中的“=”符号。
(2)base32
Base32编码是使用32个可打印字符(字母A-Z和数字2-7)对任意字节数据进行编码的方案,编码后的字符串不用区分大小写并排除了容易混淆的字符,可以方便地由人类使用并由计算机处理。
Base32主要用于编码二进制数据,但是Base32也能够编码诸如ASCII之类的二进制文本。
Base32将任意字符串按照字节进行切分,并将每个字节对应的二进制值(不足8比特高位补0)串联起来,按照5比特一组进行切分,并将每组二进制值转换成十进制来对应32个可打印字符中的一个。
download.png
(3)base64
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。
在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法。
它可用来作为电子邮件的传输编码。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。
download.png
(4)base85
使用五个ASCII字符来表示四个字节的二进制数据,使用四个字符来表示三个字节的数据。
用途是Adobe的PostScript和Portable Document Format文件格式,以及Git使用的二进制文件的补丁编码。
与Base64一样,Base85编码的目标是对二进制数据可打印的ASCII字符进行编码。但是它使用了更大的字符集,因此效率更高一些。具体来说,它可以用5个字符编码4个字节(32位)。
download.png
(5)base36
Base36是一个二进制到文本编码表示方案的二进制数据以ASCII通过将其转化为一个字符串格式基数 -36表示。选择36十分方便,因为可以使用阿拉伯数字 0–9和拉丁字母 A–Z [1](ISO基本拉丁字母)表示数字。
每个base36位需要少于6位的信息来表示。(只支持整数)
(6)base58
Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。
相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号。
设计Base58主要的目的是:

  • 避免混淆。在某些字体下,数字0和字母大写O,以及字母大写I和字母小写l会非常相似。
  • 不使用"+"和"/"的原因是非字母或数字的字符串作为帐号较难被接受。
  • 没有标点符号,通常不会被从中间分行。
  • 大部分的软件支持双击选择整个字符串。

image.png
(7)base91
base91需要91个字符来表示ASCII编码的二进制数据。 从94个可打印ASCII字符(0x21-0x7E)中,以下三个字符被省略以构建base91字母:
-(破折号,0x2D)
\(反斜杠,0x5C)
'(撇号,0x27)
base91是将二进制数据编码为ASCII字符的高级方法。
它类似于UUencode或base64,但效率更高。 base91产生的开销取决于输入数据。 它的数量最多为23%(而base64为33%),范围可以降低到14%,通常发生在0字节块上。
这使得base91对于通过二进制不安全连接(例如电子邮件或终端线)传输较大的文件非常有用。download.png
(8)base92
为了超越base82,尝试创造base92
在编码字符串时,```和与普通引号'太相似,以使其舒适。在区分l / 10 / O时使用的字体好。将用作特殊符号(空字符串)。有94个可打印的ascii字符,因此最终得到91个字符,或每个字符6.5位。一旦包含,则将有92个字符。
一旦每个字符有6.5位,则可以一次使用13位,并使用类似于base85的除法和取模方案,用它们产生两个输出字符。这可能意味着,与base92编码相比,它更能抵抗损坏,因为任何损坏都更加局限(一位更改仅影响2-3个字节,而不影响4个字节)。
注意:在某些需要某些输出的情况下,可能需要将用作空字符串分号
base64和base85更加优雅,将一个较小的字节整数干净地映射到另一个较小的字节整数。base92将13个字节映射为16个字符,从大小的角度来看,这比base85的4至5个字符更好,但是相当不雅观。
(9)base62
Base62编码将数字转换为ASCII字符串(0-9,az和AZ),反之亦然,这通常会导致字符串较短。
26个小写字母+26个大写字母+10个数字=62

  • 62进制与10进制的互相转化

62进制转10进制与2进制转10进制相似。
2进制转10进制过程为: 从右到左用二进制的每个数去乘以2的相应次方,次方要从0开始。
62进制转10进制也类似,从右往左每个数*62的N次方,N从0开始。
那么,10进制转62进制也与10进制转2进制类似。 即:不断除以62取余数,然后倒序。

  • 关于短Url的转换

主要思路,维护一个全局自增的id,每来一个长url,将其与一个自增id绑定,然后利用base62将该自增id转换为base62字符串,即完成转换。
image.png

67、sqltest

https://www.cnblogs.com/yunqian2017/p/15124198.html
题目为SQLtest,猜测可能和SQL注入有关,打开流量包先追踪一波HTTP流
image.png
盲注那就应该有很多注入语句,直接导出HTTP对象
image.png
导出后确实发现了很多盲注语句,但是阅读起来很困难
image.png
于是尝试用tshark提取
tshark -r sqltest.pcapng -Y"http.request" -T fields -e http.request.full_uri > data.txt
:::info
-r 读取文件
-Y 过滤语句
-T pdml|ps|text|fields|psml,设置解码结果输出的格式
-e 输出特定字段
http.request.uri http请求的uri部分
:::
分析提取出的注入语句:

  • 获取数据库库名

第九行获取information_schema.SCHEMATA中数据行数的长度(为1)
image.png
第18行获取information_schema.SCHEMATA中数据行数,chr(53) = '5',即infomation_schema.SCHEMATA有5行数据
image.png
(第19行-第61行+第65,66行)获取每一个数据库的长度
image.png
(62,63,64,第67-417行)获取每一个数据库库名
image.png
418行已经获取到了库名
image.png

第426行表名个数的长度(为1)
image.png
第435行表名个数
image.png
第444行表名长度
image.png
445-510行表名
image.png
第511行已经得到表名了
image.png

  • 字段

第519行字段个数长度
image.png
第527行字段个数
image.png
第545行每个字段长度
image.png
546-601行获取每个字段字段名
image.png

第610行获取值个数的长度
image.png
第619行值的个数
image.png
第627行值的长度
image.png
628-972行获取我们需要的flag
这位大佬的python脚本
注入语句为:
id=1 and ascii(substr(((select concat_ws(char(94), flag) from db_flag.tb_flag limit 0,1)), {第i个字符}, 1))>{字符的ascii值}
把第i个字符和ascii值提取出来,取i变化时的值:

import urllib.parse
f = open("data.txt","r").readlines()

s = []
for i in range(627,972):
    data = urllib.parse.unquote(f[i]).strip()
    payload = data.split("and")[1]
    positions = payload.find("from db_flag.tb_flag  limit 0,1)), ")
    data1 = payload[positions+35:].split(",")[0]
    data2 = payload[positions+35:].split(">")[1]
    s.append([data1,data2])

for i in range(1,len(s)):
    if s[i][0]!=s[i-1][0]:
        print(chr(int(s[i-1][1])),end="")
print(chr(int(s[-1][1])))

或者提取出数据放入一个文本

with open('2.txt','r') as f:
	data = f.readlines()
	for i in data:
		print(chr(int(i)),end="")

68、你有没有好好看网课?

下载压缩包得到两个加密的压缩包,flag2没有密码提示也不是伪加密先不管,flag3提示六位纯数字密码,直接爆破得到一个Word文档和视频
image.png
打开文档发现有两串数字520和711可能和视频相关
image.png
RV打开视频也只有13s于是着重看一下5.20s和7.11s处,得到两处提示
image.png
image.png
第一处为敲击码
基于5×5方格波利比奥斯方阵来实现的,不同点是是用K字母被整合到C中,因此密文的特征为1-5的两位一组的数字,编码的范围是A-Z字母字符集,字母不区分大小写。
..... ../... ./... ./... ../
vta8io4tvs.png
解码得到w l l m
第二处为base64解码即可:dXBfdXBfdXA=
image.png
结合可得字符串wllmup_up_up尝试打开flag2得到一张图片,010查看,在文件尾得到flag
image.png

69、NTFS数据流

解压题目给出的压缩包得到很多txt文本
image.png
提示NTFS数据流,直接使用NtfsStreamsEditor工具扫描flag文件夹
image.png

70、john-in-the-middle

思路一:

得到一个流量包,先尝试用foremost分离一下,得到一堆图片
image.png
发现第一张图片下面好像缺了什么
image.png
用ste查看图片在green通道1和0处即可得到flag
image.png
image.png

思路二:

发现流量包里都是HTTP数据包,直接导出HTTP对象
image.png
在导出的文件中发现两张特别的图片
image.png
打开scanlines.png,在很多通道中都发现了一条线
image.png
logo.png图片中似乎缺了一块
image.png
将两张图片使用ste的Image Combiner对比,在相减时得到flag
image.png

71、swp

打开题目给的流量包,数据包太多了,先导出HTTP对象看看
image.png
导出文件中发现一个secret.zip加密压缩包
image.png
先尝试看看是不是伪加密
image.png
打开压缩包里的flag文件即可得到flag
image.png

72、喵喵喵

拿到题目给的图片后尝试提取、查看十六进制都没有什么线索,于是再尝试用ste查看是否是LSB隐写
image.png
image.png
image.png
在RGB的0通道中发现不同,于是尝试用Data Extract提取
image.png
由上图可知明显是一张PNG但是文件头多了FF FE,先保存文件用十六进制器处理,得到半张二维码
image.png
得到的图片明显高度有问题,直接十六进制器修改即可
image.png
得到一张二维码,虽然正常需要反色再扫,但是QR可以直接扫不用反色
image.png
访问给出的网址,得到一个压缩包
image.png
没有任何提示只有一个TXT那就尝试一下NTFS数据流,直接使用NtfsStreamsEditor工具扫描flag文件夹
image.png
果然得到一个pyc文件,直接反编译,或者使用uncompyle
uncompyle6 1.pyc > main.py

image.png
得到反汇编出的代码

# uncompyle6 version 3.8.0
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: flag.py
# Compiled at: 2017-12-05 23:42:15
import base64

def encode():
    # 加密函数
    flag = '*************'
    ciphertext = []
    for i in range(len(flag)):
        s = chr(i ^ ord(flag[i]))
        # i与flag中第i个元素的ASCII的十进制异或
        # 再把上述结果转换为ASCII
        if i % 2 == 0:
            s = ord(s) + 10
        else:
            s = ord(s) - 10
            # 如果i能被二整除就叭ASCII转换为十进制再+10,否则-10
        ciphertext.append(str(s))
        # 得到的数加入列表

    return ciphertext[::-1]
    # 倒着输出

    # 根据encode加密得到的列表
ciphertext = [
    '96', '65', '93', '123', '91', '97', '22', '93', '70', '102', '94', '132', '46', '112', '64', '97', '88', '80', '82', '137', '90', '109', '99', '112']
# okay decompiling 1.pyc

解密脚本

# 密文
ciphertext = [
    '96', '65', '93', '123', '91', '97', '22', '93', '70', '102', '94', '132', '46', '112', '64', '97', '88', '80',
    '82', '137', '90', '109', '99', '112']

# 先把密文倒着排序
ciphertext = ciphertext[::-1]
flag = []

for i in range(len(ciphertext)):
    # 如果i能被二整除就给十进制数 - 10,否则 + 10
    if i % 2 == 0:
        s = int(ciphertext[i]) - 10
    else:
        s = int(ciphertext[i]) + 10

    # 异或然后再转换为ascii
    flag.append(chr(int(i ^ s)))

# 打印flag
print("".join(flag))

73、SXMgdGhpcyBiYXNlPw==

题目标题为base64先解密
image.png
打开题目给出的flag.txt
image.png
又是多串base64,直接上大佬的base64隐写脚本

def base64value(c):
    table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    for i in range(64):
        if table[i] == c:
            return i
    return 0    
        
def base64stego():
    f = open("flag.txt","rb")
    lines = f.readlines()
    x = ''
    for line in lines:
        l = str(line, encoding = "utf-8").strip()
        if l[-1] == '=':
            if l[-2] == '=':
                x += bin(base64value(l[-3]))[-4:]
            else:
                x += bin(base64value(l[-2]))[-2:]
    
    flag = ''
    for i in range(0, len(x), 8):
        flag += chr(int(x[i:i+8],2))
    print(flag)
    
if __name__ == '__main__':
    base64stego()

74、间谍启示录

下载得到镜像文件,先尝试用foremost分离
image.png
发现只有压缩包提供了有效信息
image.png
运行flag.exe得到一个机密文件(需要打开文件夹的隐藏显示)
image.pngimage.png

75、docx

得到Word文档内容没什么提示,于是用010查看,发现文件头为50 4B 03 04这不就是压缩包嘛,直接改后缀RAR
image.png
在media文件夹中发现flag
image.png

76、Mysterious

题目提示需要逆向分析,首先用PEiD看看是否加壳
image.png
未加壳,32位程序,用IDA进行分析,打开后用快捷键shift+F12(string window),发现了个很特别的字符串well done(一般过关后会有类似字符串)
image.png
点击进入此字符串在内存中的位置
image.png
点击sub_401090,查看调用这个字符串的函数,跳转到汇编图形界面,按f5反编译查看伪C代码。
image.png
分析这个关键函数:
int __stdcall sub_401090(HWND hWnd, int a2, int a3, int a4)
hwnd是句柄,a2是消息,a3,a4是其他消息。
memset(String, 0, sizeof(String));
Value = 0;
memset:将string中当前位置后面的sizeof(String)个字节用0替换并返回string

GetDlgItemTextA(hWnd, 1002, String, 260); # 获取输入
strlen(String);
if ( strlen(String) > 6 ) # 输入字符串不能大于6
	ExitProcess(0); # 退出程序

atoi(String)=122所以sting的值为122xxx,接下来把3,5,4转化成ascii码看看,
S3=x,S5=z,S4=y

v4 = atoi(String); # atoi函数:将字符串转换成整型
Value = v4 + 1; 
v4 == 122 && String[3] == 120 && String[5] == 122 && String[4] == 121

flag赋值给text,然后是置零操作

strcpy(Text, "flag");
memset(&Text[5], 0, 0xFCu);
v8 = 0;
v9 = 0;

_itoa(Value, Source, 10);
itoa函数的功能是将int转化为char,第一个参数是要转化的值,第二个参数是转化后值的储存地址,第三个数是要转化的值的进制,这里为10进制。

strcat(Text, "{");
strcat(Text, Source);
strcat(Text, "_");
strcat(Text, "Buff3r_0v3rf|0w");
strcat(Text, "}");

第一条代码使Text="flag{",接着第二条指令使Text="flag{123",到最后Text="flag{123_Buff3r_0v3rf|0w}"
MessageBoxA(0, Text, "well done", 0);
messagebox,标题为well done,内容为Text

77、弱口令

78、黄金6年

79、小易的U盘

80、alison_likes_jojo

标签:10,BUUCTF,字节,编码,61,flag,字符,字符串,80
From: https://www.cnblogs.com/zeroEMC/p/17226218.html

相关文章