rctf2019-babyre2

介绍

rctf2019的一道逆向题,上一题的进阶版,但感觉还更简单了。

分析程序

  1. 输入account,长度为7-16
  2. 输入password,长度为7-16,每个字符为10-99
  3. 将account作为key,对一个定值执行转换操作(操作几乎和上一题一样)
  4. 输入data,长度为0-1024,只允许输入[0-9a-fA-F]
  5. 对password进行转换操作,数据为data(其中要求date的长度为一个较大的值)
  6. 将步骤3的结果进行解密,key为步骤5的结果
  7. 要求解密的结果最后一位小于4

解答方法

由于最后的要求很简单,只要最后一位小于4即可,所以随机一些数,进行爆破即可。

我们的做法是,固定data和password,随机account的值。

脚本

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
#!/usr/bin/env python2
# -*- coding: utf-8 -*-

from pwn import *
import random

for x in range(100000):

p = process(./babyre2)

seed = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+=-"
sa = []
for i in range(15):
sa.append(random.choice(seed))
salt = ''.join(sa)

account = salt
password = '123123123'
data = '1' * 500

p.recvuntil('input the account:')
p.send(account)

p.recvuntil('input the password:')
p.send(password)

p.recvuntil('input the data:')
p.send(data)

ret = p.recvline()
if 'capture the flag failed, try again!' not in ret:
print(account,ret)

p.close()

后记

分析基本正确,但是有其他比较优雅的解法。步骤3对定值进行转换的时候,定值的最后一位已经小于4,所以我们只需前后加解密构造一样的密钥即可。也就是构造步骤5的结果和account^0xcc相等即可。