zoukankan      html  css  js  c++  java
  • [BUUCTF]REVERSE——Youngter-drive

    Youngter-drive

    附件

    步骤:

    1. 例行查壳儿,32位程序,upx壳儿
      在这里插入图片描述
    2. 利用网上找的upx脱壳儿工具脱完壳扔进ida,首先检索程序里的字符串,发现了有关flag的字样,跟进,当source=TOiZiZtOrYaToUwPnToBsOaOapsyS的时候才会输出flag
      在这里插入图片描述
    3. 从main函数开始看程序
      在这里插入图片描述

    在这里插入图片描述
    函数创建了两个进程,一个startaddress,一个sub_41119F
    4. 先看startaddress
    在这里插入图片描述
    到sub_411940这里报错了
    在这里插入图片描述
    转汇编看一下,这边由于堆栈不平衡所以报错了
    在这里插入图片描述
    这边将411a03处修改一下,前面加个符号即可,在按f5
    在这里插入图片描述
    找到了加密函数,这是将字符串进行了替换,当字符是大写字母时,替换为off_418000处-38,小写则替换为-96
    在这里插入图片描述
    用来加密的字符串QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm
    5. 再看第二个线程sub_41119F
    在这里插入图片描述
    这个进程,好像没什么用,但它运行了–dword_418008,让计数器又减了1,并且可以看出是hObject、v1地交替运行,从而导致加密函数变成隔一个加密
    6. 然后是 sub_411190()函数
    在这里插入图片描述
    加密后的字符串是TOiZiZtOrYaToUwPnToBsOaOapsyS

    逆向解密一下我们输入的字符串

    off_418000 = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"
    
    off_418004 = "TOiZiZtOrYaToUwPnToBsOaOapsyS"
    
    flag=''
    
    for i in range(len(off_418004)):
        if i %2 == 0:
            flag += off_418004[i]
            continue
        for j,k in enumerate(off_418000):
            if off_418004[i] == k:
                if chr(j+38).isupper():
                    flag += chr(j+38)
                else:
                    flag += chr(j+96)
    
    print flag
    

    在这里插入图片描述
    然后这边有一个坑,doword_418008的初始值是0x1D(29),下标是29,也就说数据长度是30
    在这里插入图片描述
    我们需要再得到的字符串后面在加一位,buu上需要加E
    flag{ThisisthreadofwindowshahaIsESE}

  • 相关阅读:
    静态检查lua语法工具luacheck
    centos7系列:
    git submodule 教程
    CENTOS 7 安装redis
    python基本语法:
    彻底理解lib和dll
    C++语言的设计与演化(空白):
    《Effective C++》 目录:
    C++进阶书籍(转)
    学习的心态(转)
  • 原文地址:https://www.cnblogs.com/xlrp/p/14273654.html
Copyright © 2011-2022 走看看