首页 > 其他分享 >BJDCTF2020[encode]

BJDCTF2020[encode]

时间:2024-03-14 22:32:53浏览次数:30  
标签:ciphertext sbox Flag key 密文 encode BJDCTF2020 256

题目:encode,地址:encode

  1. 查壳发现时upx壳,使用工具脱壳命令"upx -d ",如果遇到工具脱不了的壳就手动脱壳,手动脱壳请帅哥美女*们看这篇手动脱壳
  2. 使用ida打开,观察逻辑后重命名函数:
  3. 逻辑为一个换表base64 + 异或 + RC4。其中RC4可以根据函数传入key,进而生成Box盒子来判断:
  4. 知道逻辑后,先用RC4脚本解密,key=“Flag{This_a_Flag}”,密文为“E8D8BD91871A1E56F53F4889682F96142AF2AB8FED7ACFD5E”,但是仔细观察这里的密文长度为49,完全不对,翻阅网上的答案后,应该时ida将01/0E/0*这类16进制变成字符串时,其中的0去掉了,导致密文的长度变小。根据题目要求输入的flag为21位,base64后位(21/3)*4=28位,长度完全对不上。这里想要调出相应的密文,可以用远程调试,观察寄存器的值来一位一位的取出加密后的正确密文,这里我直接给出正确的密文[0xE8,0xD8,0xBD,0x91,0x87,0x1A,0x01,0x0E,0x56,0x0F
    ,0x53,0xF4,0x88,0x96,0x82,0xF9,0x61,0x42,0x0A,0xF2,0xAB
    ,0x08,0xFE,0xD7,0xAC,0xFD,0x5E,0x00]
  5. RC4的解密脚本如下:
#RC4加密
def rc4(key, ciphertext):
    # 初始化S盒
    sbox = list(range(256))
    j = 0
    for i in range(256):
        j = (j + sbox[i] + key[i % len(key)]) % 256
        sbox[i], sbox[j] = sbox[j], sbox[i]
 
    # 生成密钥流
    i = 0
    j = 0
    keystream = []
    for _ in range(len(ciphertext)):
        i = (i + 1) % 256
        j = (j + sbox[i]) % 256
        sbox[i], sbox[j] = sbox[j], sbox[i]
        k = sbox[(sbox[i] + sbox[j]) % 256]
        keystream.append(k)
    # print(keystream)
 
    # 解密密文
    plaintext = []
    for i in range(len(ciphertext)):
        m = ciphertext[i] ^ keystream[i]
        plaintext.append(m)
    print(plaintext)
 
    # 将明文转换为字符串
    return ''.join([chr(p) for p in plaintext])

# 测试
key = b"Flag{This_a_Flag}"
ciphertext =[0xE8,0xD8,0xBD,0x91,0x87,0x1A,0x01,0x0E,0x56,0x0F
	,0x53,0xF4,0x88,0x96,0x82,0xF9,0x61,0x42,0x0A,0xF2,0xAB
	,0x08,0xFE,0xD7,0xAC,0xFD,0x5E,0x00]
# for i in ciphertext:
#     print(chr(i),end="")
plaintext = rc4(key, ciphertext)
  1. 得到结果[35, 21, 37, 83, 8, 26, 89, 56, 18, 106, 57, 49, 39, 91, 11, 19, 19, 8, 92, 51, 11, 53, 97, 1, 81, 31, 16, 92]后异或还原:
flag=[35, 21, 37, 83, 8, 26, 89, 56, 18, 106, 57, 49, 39, 91, 11, 19, 19, 8, 92, 51, 11, 53, 97, 1, 81, 31, 16, 92]
key='''Flag{This_a_Flag}'''
res=[]
for i in range(len(flag)):
    res+=[flag[i]^ord(key[i%len(key)])]
print(res)
for i in res:
    print(chr(i),end="")
  1. 得到**eyD4sN1Qa5Xna7jtnN0RlN5i8lO=**看,最后换表base64解密,网站解密网站是这个在这里插入图片描述
  2. 最后flag=BJD{0v0_Y0u_g07_1T!}

总结:ida在阿济格0x01/0x02/0x0*等16进制的数据转化位字符串时会将0去掉,导致长度不对等,此时需要手动调试还原。

标签:ciphertext,sbox,Flag,key,密文,encode,BJDCTF2020,256
From: https://blog.csdn.net/yjh_fnu_ltn/article/details/136722240

相关文章

  • 关于java.net.URLEncoder.encode()将空格转成+问题
    1.情景展示如上图所示,当我们使用jdk自带的类对数据进行URL编码时,空格会被转成+。这其实是不对的,我们知道:空格对应url编码是:%20,所以,jdk自带的URLEncoder将空格转成+是不对的。如何解决?2.解决方案既然jdk自带的URLEncoder有问题,我们就有两种解决办法。一种是仍然使用它,然......
  • [BJDCTF2020]Easy MD5 1
    [BJDCTF2020]EasyMD51审题看到一个登录框,并且题目为ezMD5,猜测使用md5绕过SQL知识点md5的绕过解题使用ffifdyop绕过SQL查看源代码弱比较绕过输入?a[]=1&b[]=2发现为===强比较,由于md5对数组不敏感也可以使用数组绕过,这是md5的另一个特性,就是md5无法对数组进行......
  • x-www-form-urlencoded 方式
    转载:https://blog.csdn.net/Wu7z_/article/details/108224944?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-2-108224944-blog-78784787.pc_relevant_recovery_v2&depth_1-utm_source=distribute.pc_relevant.......
  • [BJDCTF2020]Easy MD5
    打开题目后就是一个没有任何回显的查询页面 查看源码无果,在f12中的网络功能中发现了其中一个数据包中的响应头中有提示 提示为:hint:select*from'admin'wherepassword=md5($pass,true)可见这里最主要的是要绕过sql语句中的password=md5($pass,true),这里的话就需要绕过M......
  • encodeURI和encodeURIComponent的区别?
    在JavaScript中,encodeURI()和encodeURIComponent()是用于对URI进行编码的两个方法,它们可以将URI中的特殊字符进行转义,以便在URL中安全地传输和显示。encodeURI()方法用于对整个URI进行编码,除了常见的字符(字母、数字、-、_、.、!、~、*、'、(、))外,不会对其他字符......
  • [BJDCTF2020]Cookie is so stable
    [BJDCTF2020]Cookieissostable打开环境,在页面源代码中发现提示查看cookiescookie里的user的值会显示到页面中在user处尝试注入{{7*'7'}}回显7777777==>Jinja2{{7*'7'}}回显49==>Twig回显49所以是Twigpayload:{{_self.env.registerUndefinedFilterCallback("e......
  • 爬虫_058_urllib get请求的urlencode方法
    目录urllib.parse.urlencode()quote方法使用的不是很经常的。因为quote的作用是将汉字转为百分号编码后的ASCII字符串。如果你的路径当中只有一个参数,你这样使用quote拼接一下url,这是没有问题的。如果你的路径当中有多个参数,并且参数都是中文的,你还使用quote,就TMD懵逼了。......
  • [BJDCTF2020]Mark loves cat
    [BJDCTF2020]Marklovescat打开环境,在网页端没发现什么提示,通过dirsearch发现有git源码泄露通过githack下载下来flag.php里的内容是读取flag文件内容并赋值给$flag<?php$flag=file_get_contents('/flag');index.php的内容多一些,贴出来做代码审计<?phpinclude'fla......
  • 前端开发时,什么时候url需要使用encodeURIComponent?
    在前端开发时,当需要将用户输入或者动态生成的字符串作为URL的一部分(特别是查询参数或路径片段)发送到服务器时,应当使用encodeURIComponent函数对字符串进行编码。以下是一些具体场景:查询参数:当你在URL中添加查询参数(queryparameters),例如通过?key=value的形式附加到URL末......
  • form-data、x-www-form-urlencoded的区别
    我们在平时的postman请求调试,以及web的http请求开发时,常常能看到以下几种传参的形式form-data、x-www-form-urlencoded、raw、binary,那么这些请求方式的区别是什么呢?1)form-data就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔......