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}

  • 相关阅读:
    Hive 导入、导出数据
    mysql 命令行参数说明
    mysql 查看表信息
    python之冒泡排序
    python之选择排序
    python之快速排序
    光荣之路测试开发面试linux考题之四:性能命令
    测试开发linux面试之三:后台进程之操作
    测试开发面试的Linux面试题总结之二:常用命令
    测试开发面试的Linux面试题总结之一:vim使用方法
  • 原文地址:https://www.cnblogs.com/xlrp/p/14273654.html
Copyright © 2011-2022 走看看