re刷题第二天

#re刷题第二天

0x00 python-trade

题目给了一个pyc文件,很明显是pyc逆向,这里给出一个网站,或者可以使用uncompyle进行反编译

反编译网站

correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
flag = ''
print 'Input flag:'
flag = raw_input()
if encode(flag) == correct:
    print 'correct'
else:
    print 'wrong'
import base64

def encode(message):
    s = ''
    for i in message:
        x = ord(i) ^ 32
        x = x + 16
        s += chr(x)
    
    return base64.b64encode(s)

correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
flag = ''
print 'Input flag:'
flag = raw_input()
if encode(flag) == correct:
    print 'correct'
else:
    print 'wrong'

直接拿到python源码,写出解密脚本即可

import base64

correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
flag = ''
de_cor = base64.b64decode(correct)

for i in range(len(de_cor)):
	flag += chr((ord(de_cor[i])-16)^32)

print flag

0x01 getit

载入IDA,分析下算法
在这里插入图片描述

发现会将s奇数位减1,偶数位加1填充到SharifCTF{%s}中并写入文件,但是在最后文件会被删除,直接写脚本解码出来
在这里插入图片描述

str1 = 'c61b68366edeb7bdce3c6820314b7498'
flag = ''
for i in range(len(str1)):
	if i%2 == 0:
		flag += chr(ord(str1[i])-1)
	else:
		flag += chr(ord(str1[i])+1)
print flag

0x02 csaw2013reversing2

载入IDA分析
在这里插入图片描述

可以看到这里直接将409b10处的字符输出
在这里插入图片描述

所以会导致乱码的问题
在这里插入图片描述

401000里边可以看到有将409b10异或的过程,409b38处所为密钥

写出脚本,得到flag

cipher = [0xbb, 0xcc, 0xa0, 0xbc, 0xdc, 0xd1, 0xbe, 0xb8, 0xcd, 0xcf, 0xbe, 0xae, 0xd2, 0xc4, 0xab, 0x82, 0xd2, 0xd9, 0x93, 0xb3, 0xd4, 0xde, 0x93, 0xa9, 0xd3, 0xcb, 0xb8, 0x82, 0xd3, 0xcb, 0xbe, 0xb9, 0x9a, 0xd7, 0xcc, 0xdd]
key = [0xbb,0xaa,0xcc,0xdd]

flag = ''
for i in range(len(cipher)):
	flag += chr(cipher[i]^key[i%4])

print flag

0x03 maze

载入IDA,查看main函数分析

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  __int64 v3; // rbx
  int v4; // eax
  bool v5; // bp
  bool v6; // al
  const char *v7; // rdi
  int v9; // [rsp+0h] [rbp-28h]
  int v10; // [rsp+4h] [rbp-24h]

  v10 = 0;
  v9 = 0;
  puts("Input flag:");
  scanf("%s", &s1);
  if ( strlen(&s1) != 24 || strncmp(&s1, "nctf{", 5uLL) || *(&byte_6010BF + 24) != '}' )
  {
LABEL_22:
    puts("Wrong flag!");
    exit(-1);
  }
  v3 = 5LL;
  if ( strlen(&s1) - 1 > 5 )
  {
    while ( 1 )
    {
      v4 = *(&s1 + v3);
      v5 = 0;
      if ( v4 > 78 )
      {
        if ( (unsigned __int8)v4 == 'O' )
        {
          v6 = sub_400650(&v10);
          goto LABEL_14;
        }
        if ( (unsigned __int8)v4 == 'o' )
        {
          v6 = sub_400660(&v10);
          goto LABEL_14;
        }
      }
      else
      {
        if ( (unsigned __int8)v4 == '.' )
        {
          v6 = sub_400670(&v9);
          goto LABEL_14;
        }
        if ( (unsigned __int8)v4 == '0' )
        {
          v6 = sub_400680(&v9);
LABEL_14:
          v5 = v6;
          goto LABEL_15;
        }
      }
LABEL_15:
      if ( !(unsigned __int8)sub_400690((__int64)map, v10, v9) )
        goto LABEL_22;
      if ( ++v3 >= strlen(&s1) - 1 )
      {
        if ( v5 )
          break;
LABEL_20:
        v7 = "Wrong flag!";
        goto LABEL_21;
      }
    }
  }
  if ( map[8 * v9 + v10] != '#' )
    goto LABEL_20;
  v7 = "Congratulations!";
LABEL_21:
  puts(v7);
  return 0LL;
}

可以发现是走迷宫,迷宫是8x8的,大致是这个样子

  ******
*   *  *
*** * **
**  * **
*  *#  *
** *** *
**     *
********

O,o,.,0四个键代表上下左右,0.代表下和上,Oo代表左和右,最后和nctf{%s}做拼接就可以得到flag。

nctf{o0oo00O000oooo…OO}

0x04 dmd-50

载入IDA在这里插入图片描述

可以看到v41这块儿是按位进行比较的,v41v40,而v40是md5加密过后的,直接查下md5就会得到flag

0x05 Shuffle

载入IDA,发现flag
在这里插入图片描述

0x06 re2-cpp-is-awesome

载入IDA,可以看到这处比较
在这里插入图片描述

分析得出将6020c0处的数值作为字符串下标,从字符串中取值拼接就是flag,写出脚本

cipher = [36, 0, 5, 54, 101, 7, 39, 38, 45, 1, 3, 0, 13, 86, 1, 3, 101, 3, 45, 22, 2, 21, 3, 101, 0, 41, 68, 68, 1, 68, 43]
key = 'L3t_ME_T3ll_Y0u_S0m3th1ng_1mp0rtant_A_{FL4G}_W0nt_b3_3X4ctly_th4t_345y_t0_c4ptur3_H0wev3r_1T_w1ll_b3_C00l_1F_Y0u_g0t_1t'
flag = ''
print key[0]
for x in cipher:
	flag += key[x]
print flag

0x07 crackme

载入PEiD,发现NsPack壳,这里我懒得脱壳,直接带壳调了
在这里插入图片描述

这里是计算长度,要求长度为42
在这里插入图片描述

取输入和402130处的key进行异或,然后与402150处进行比较,key循环使用
在这里插入图片描述

写脚本,得到flag

cipher = [0x12,0x04,0x08,0x14,0x24,0x5C,0x4A,0x3D,0x56,0x0A,0x10,0x67,0x00,0x41,0x00,0x01,0x46,0x5A,0x44,0x42,0x6E,0x0C,0x44,0x72,0x0C,0x0D,0x40,0x3E,0x4B,0x5F,0x02,0x01,0x4C,0x5E,0x5B,0x17,0x6E,0x0C,0x16,0x68,0x5B,0x12]
key = 'this_is_not_flag'
flag = ''

for i in range(len(cipher)):
	flag += chr(cipher[i]^ord(key[i%len(key)]))

print flag

0x08 re-for-50-plz-50

载入IDA,发现是MIPS的程序,简单读一下
在这里插入图片描述

发现是密文和0x37进行异或,写出脚本,得到flag

cipher = 'cbtcqLUBChERV[[Nh@_X^D]X_YPV[CJ'
flag = ''
for i in range(len(cipher)):
	flag += chr(ord(cipher[i])^0x37)

print flag
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: re 模块中常用的功能函数(二)包括: 1. sub() 函数:用于替换字符串中的匹配项。 2. split() 函数:用于将字符串按照正则表达式匹配的模式进行分割。 3. findall() 函数:用于查找字符串中所有匹配正则表达式的子串,并返回一个列表。 4. finditer() 函数:与 findall() 函数类似,但返回的是一个迭代器。 5. compile() 函数:用于将正则表达式编译成一个正则对象,提高匹配效率。 6. match() 函数:用于从字符串的开头开始匹配正则表达式。 7. search() 函数:用于在字符串中查找第一个匹配正则表达式的子串。 8. fullmatch() 函数:用于匹配整个字符串是否符合正则表达式的模式。 9. escape() 函数:用于对字符串中的特殊字符进行转义,使其可以被正则表达式识别。 ### 回答2: 第3关:re 模块中常用的功能函数(二) 在 re 模块中,除了基本的正则表达式匹配外,还有一些常用的功能函数。 1. re.split(pattern, string, maxsplit=0, flags=0) 这个函数根据正则表达式的匹配拆分字符串。它会在字符串中指定的模式出现的地方进行拆分,并返回一个拆分后的列表。maxsplit 参数用于限制拆分的次数。 2. re.findall(pattern, string, flags=0) 这个函数会在字符串中查找所有匹配指定模式的子字符串,并返回一个列表。它可以用来提取出字符串中符合某种模式的所有子字符串。 3. re.sub(pattern, repl, string, count=0, flags=0) 这个函数会在字符串中查找指定模式的部分,并替换成指定的字符串 repl。count 参数用于限制替换的次数。 4. re.escape(pattern) 这个函数可以用来对字符串进行转义,将其中的正则表达式元字符转义成普通字符。这在需要对用户输入的字符串进行匹配时很有用,以避免正则表达式中的特殊字符影响匹配结果。 5. re.compile(pattern, flags=0) 这个函数可以将正则表达式字符串编译成一个正则表达式对象,以提高正则表达式匹配的效率。compile 函数返回的对象可以用于后续对字符串进行匹配、搜索等操作。 以上是 re 模块中常用的部分函数。根据实际需求,我们可以选择适合的函数来对字符串进行处理和操作。 ### 回答3: re模块中常用的功能函数(二)有以下几个: 1. re.findall(pattern, string, flags=0):在字符串中找到所有匹配正则表达式的子串,并返回一个列表。其中pattern为正则表达式,string为要搜索的字符串,flags为匹配模式。 2. re.finditer(pattern, string, flags=0):与findall函数类似,只是返回的是一个迭代器,用于遍历搜索结果。每个迭代对象都是一个匹配对象,可以通过group()方法获取匹配的子串。 3. re.split(pattern, string, maxsplit=0, flags=0):根据正则表达式的模式对字符串进行分割,并返回一个列表。其中pattern为正则表达式,string为要分割的字符串,maxsplit为最大分割次数,默认为0,表示所有匹配项都进行分割。 4. re.sub(pattern, repl, string, count=0, flags=0):使用指定的替换字符串对匹配的子串进行替换,并返回替换后的字符串。其中pattern为正则表达式,repl为替换的字符串,string为要搜索的字符串,count为最大替换次数,默认为0,表示所有匹配项都进行替换。 5. re.subn(pattern, repl, string, count=0, flags=0):与sub函数类似,只是返回的是替换后的字符串和替换次数的元组。 以上就是re模块中常用的功能函数。使用这些函数,可以方便地在字符串中进行正则表达式的匹配、搜索、替换和分割等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值