首页 > 其他分享 >[复现]2021VNCTF-RE

[复现]2021VNCTF-RE

时间:2022-11-15 21:12:20浏览次数:52  
标签:self flag sys RE range 2021VNCTF exit 复现 def

notsudoku

一看图标就知道是python写的exe

image

先查壳,有upx壳

image

脱壳

image

正常的py逆向过程

image

恢复

image

pyc ->py

image

得到源码:

# uncompyle6 version 3.8.0
# Python bytecode 3.7.0 (3394)
# Decompiled from: Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: 2.py
# Compiled at: 1995-09-28 00:18:56
# Size of source mod 2**32: 272 bytes
import time, sys, hashlib

class あ:

    def __init__(self):
        self.う = {}
        self.な = []
        self.に = ''
        self.ぬ = []
        self.ね = 65

    def え(self, えひ):

        def の(f):
            self.う[えひ] = f
            return f

        return の

    def お(self, は):
        return self.う.get(は)

    def か(self):
        き = 0
        while True:
            く = self.な[き][0]
            け = self.な[き][1]
            こ = self.な[き][2]
            さ = self.お(く)
            さ(け, こ)
            き += 1


い = あ()

@い.え('し')
def f(a, b):
    if a == 1:
        い.ぬ += b


@い.え('す')
def f(a, b):
    if a == 1:
        print(い.に)
    else:
        if a == 2:
            print(い.ぬ)
        else:
            if a == 3:
                print((い.flag), end='')
            else:
                print(a, end='')


@い.え('せ')
def f(a, b):
    sys.exit()


@い.え('そ')
def f(a, b):
    い.に = input()


@い.え('た')
def f(a, b):
    time.sleep(a)


@い.え('ち')
def f(a, b):
    if len(い.に) % 2 != 0:
        sys.exit()
    for i in い.に:
        if ord(i) > 52 or ord(i) < 48:
            sys.exit()

    x = str(hashlib.new('md5', bytes((い.に), encoding='utf8')).hexdigest())
    if x[:6] != 'e3a912':
        sys.exit()
    い.flag = x


@い.え('と')
def f(a, b):
    ふ = 0
    for i in range(0, len(い.に), 2):
        ふ += 1
        a = int(い.に[i])
        b = int(い.に[(i + 1)])
        い.ぬ[a][b] = ふ


@い.え('つ')
def f(a, b):
    if い.ぬ[0][1] != 24 or い.ぬ[4][3] != 2:
        sys.exit()
    if い.ぬ[0][2] != 1 or い.ぬ[2][3] != 20:
        sys.exit()
    if い.ぬ[1][0] != 23 or い.ぬ[3][4] != 3:
        sys.exit()


@い.え('て')
def f(a, b):
    ね = 0
    if b == -1:
        for i in range(5):
            ね += い.ぬ[a][i]

        if ね != い.ね:
            sys.exit()
    else:
        for i in range(5):
            ね += い.ぬ[i][b]

        if ね != い.ね:
            sys.exit()


い.な = [
 [
  'す', 'welcome baby~ ', 0],
 [
  'す', 'input your flag~:', 0],
 [
  'そ', 0, 0],
 [
  'す', 'your input is:', 0],
 [
  'す', 1, 0],
 [
  'す', "let's check......", 0],
 [
  'た', 0.5, 0],
 [
  'し', 1, [[0 for i in range(5)]]],
 [
  'し', 1, [[0 for i in range(5)]]],
 [
  'し', 1, [[0 for i in range(5)]]],
 [
  'し', 1, [[0 for i in range(5)]]],
 [
  'し', 1, [[0 for i in range(5)]]],
 [
  'ち', 0, 0],
 [
  'と', 0, 0],
 [
  'つ', 0, 0],
 [
  'て', 0, -1],
 [
  'て', 1, -1],
 [
  'て', 2, -1],
 [
  'て', 3, -1],
 [
  'て', 4, -1],
 [
  'て', 0, 0],
 [
  'て', 0, 1],
 [
  'て', 0, 2],
 [
  'て', 0, 3],
 [
  'て', 0, 4],
 [
  'す', 'Goodjob!', 0],
 [
  'す', 'The flag is vnctf{', 0],
 [
  'す', 3, 0],
 [
  'す', '}', 0],
 [
  'せ', 0, 0]]
い.か()
# okay decompiling 2.pyc

上面怎么还会有日语emmm,,晦气换成拼音叭

从这里差不多能够看出这个矩阵有5*5幻方的特征

image

l=[[17,24,1,8,15],
   [23,5,7,14,16],
   [4,6,13,20,22],
   [10,12,19,21,3],
   [11,18,25,2,9]]

幻方就是这样的幻方,那就把其转化成合适的形式

l=[[17,24,1,8,15],
   [23,5,7,14,16],
   [4,6,13,20,22],
   [10,12,19,21,3],
   [11,18,25,2,9]]
flag=""
for i in range(1,26):
    for row in range(5):
        try:
            flag+=str(row)+str(l[row].index(i))
        except:
            pass
print(flag)

image

就去原始的exe验证

image

标签:self,flag,sys,RE,range,2021VNCTF,exit,复现,def
From: https://www.cnblogs.com/bpcat/p/16893936.html

相关文章

  • 070_读写锁 ReadWriteLock
    目录简介演示代码不加锁演示读写锁演示简介:::info读可以被多线程同时读,写的时候只能有一个线程去写读-读,可以共存读-写,不能共存写-写,不能共存读锁是共享锁,多个线程可......
  • 【题解】[模拟赛20221115] Tree
    模拟赛20221115Tree|CQNK\(O(m*n*2^n)\)很好做,但是本题有更优秀的做法:在此记录复杂度\(O(n*2^n)\)的做法。考虑从后往前dp,设dp状态\(f_{s,0/1}\)分别表示在填......
  • Ocotpress集成多说评论
    Octopress默认自带了DISQUS,但是对于国内不是很好用。于是一开始替换了国内的友言。但是后来发现用友言的人不多,而且感觉友言加载速度比较慢。然后就是到了今天的多说了。官......
  • 今日内容,redis数据类型操作和celery介绍
    redis的使用一.redis字符串操作redis五大数据类型:字符串,hash,列表,集合,有序集合操作字符串的方法importredisconn=redis.Redis()#1set(name,value,ex=No......
  • VMware中虚拟机仅主机和nat双网卡之后上不了网
    VMware-workstation中的一个双网卡虚拟机,第一张网卡为仅主机模式,第二张网卡为nat模式。在网络配置都正确的情况下虚拟机依然访问不了互联网。经过多方面查证之后,是VMware......
  • 【Azure 事件中心】Event Hubs中存在非常多的错误数据,是否能提前删除这些数据呢?
    问题描述因为一些特殊原因,EventHub 里面堆积了很多不需要的数据事件,正常要等事件中的过期时间到后才有EventHub自动删除掉,但希望能够尽快马上删除,有没有什么手动的方法......
  • luffy之redis操作和celery介绍
    一、redis字符串的操作#redis的vlaue有五大数据类型:字符串,列表,hash,集合,有序集合#关于字符串的操作有17种importredisconn=redis=Redis()1set(name,valu......
  • @PreDestroy与@PostConstruct关键源码实现
    CommonAnnotationBeanPostProcessor(继承InitDestroyAnnotationBeanPostProcessor)在InitDestroyAnnotationBeanPostProcessor中,buildLifecycleMetadata方法会将目标类中......
  • redis底层都有哪些数据结构?带你了解redis是如何存储数据的
    文章目录​​写在前面​​​​键值对的存储——哈希​​​​哈希冲突​​​​redis解决哈希冲突过多的方式——rehash​​​​双向链表​​​​数组​​​​压缩链表​​​......
  • python 线程池 ThreadPoolExecutor
    从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor(线程池)和ProcessPoolExecutor(进程池)两个类。相比threading等模块,该模......