BJDCTF2020[encode]

2024-03-15 01:36
文章标签 encode bjdctf2020

本文主要是介绍BJDCTF2020[encode],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目: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 = 0for i in range(256):j = (j + sbox[i] + key[i % len(key)]) % 256sbox[i], sbox[j] = sbox[j], sbox[i]# 生成密钥流i = 0j = 0keystream = []for _ in range(len(ciphertext)):i = (i + 1) % 256j = (j + sbox[i]) % 256sbox[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去掉,导致长度不对等,此时需要手动调试还原。

这篇关于BJDCTF2020[encode]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/810397

相关文章

php中json_decode()和json_encode()

1.json_decode() json_decode (PHP 5 >= 5.2.0, PECL json >= 1.2.0) json_decode — 对 JSON 格式的字符串进行编码 说明 mixed json_decode ( string $json [, bool $assoc ] ) 接受一个 JSON 格式的字符串并且把它转换为 PHP 变量 参数 json

【python 编码问题】UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not

插入oracle 数据发生 错误:UnicodeEncodeError: 'ascii' codec can't encode characters in position 131-136: ordinal not in range(128) 先说解决办法: python2.7版本,在开头加入下面语句 import sysreload(sys)sys.setdefaultencoding

thinkphp将结果集json_encode后渲染到textarea,然后控制器接收,进行转换数组

thinkphp将结果集json_encode后渲染到textarea,然后控制器接收,进行转换数组

python2.7 的中文编码处理,解决UnicodeEncodeError: 'ascii' codec can't encode character 问题

python2.7 的中文编码处理 最近业务中需要用 Python 写一些脚本。尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。 很快,我就遇到了异常: UnicodeEncodeError: 'ascii' codec can't encode characters in p

JavaScript处理HTML的Encode(转码)和Decode(解码)

转载:http://www.cnblogs.com/xdp-gacl/p/3722642.html HTML的Encode(转码)和解码(Decode)在平时的开发中也是经常要处理的,在这里总结了使用javascript处理HTML的Encode(转码)和解码(Decode)的常用方式 一、用浏览器内部转换器实现转换 1.1.用浏览器内部转换器实现html转码   首先动态创建一个容

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

问题背景 在python2中安装了labelme,可以正常运行,然后又再python3中安装了labelme。后来python2中的labelme不能运行,python3中的labelme可以运行。 具体问题 UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-3: ordinal not in ra

ORACLE接口http传输时中文转义 url_encode

url_encode。 CREATE OR REPLACE FUNCTION url_encode(urlEncode IN VARCHAR2)RETURN VARCHAR2 ASBEGIN--utl_url.escape()该方法只能在函数中调用RETURN utl_url.escape(urlEncode, TRUE, 'utf-8');END; DECLAREl_url VARCH

x264源码分析一:main函数和encode函数

首先从main还是开始,该函数在x264.c文件中。 int main( int argc, char **argv ){x264_param_t param;cli_opt_t opt = {0};int ret = 0;FAIL_IF_ERROR( x264_threading_init(), "unable to initialize threading\n" )#ifdef _WI

json_encode()    AND  json_decode()

string json_encode ( mixed $value [, int $options = 0 ] ):该函数主要用来将数组和对象,转换为json格式。$value为要转换的数据,除了resource 类型之外,可以为任何数据类型。 PHP支持关联和索引数组,但由于javascript不支持关联数组,所以json_encode()只将索引数组(indexed ar

php json_encode 大括号中括号

当array是一个从0开始的连续数组时,json_encode出来的结果是一个由[]括起来的字符串。 而当array是不从0开始或者不连续的数组时,json_encode出来的结果是一个由{}括起来的key-value模式的字符串。 当字符串为[1,1,1] 这种模式时,json_decode默认解析出来的结果是一个数组。 当字符串为{"1":1,"2":1} 这种模式时,json_