[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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值