DDCTF2019——reverse1_final

(DDCTF 19)reverse1_final

直接拉进od,发现进去之后不像是在正常的程序领空,PEiD查一下,发现是一个UPX类型的壳。

百度下载脱壳机,脱壳。

然后拉入od分析,发现我们输入的字符串被程序加密后与“DDCTF{reverseME}”作比较;

也就是flag输入进去之后会被程序加密为“DDCTF{reverseME}”;

将其拉入ida分析
很明显,该函数便是加密函数;进入内部查看在这里插入图片描述
很明显,该函数便是加密函数;进入内部查看

在这里插入图片描述
老实讲,第一次做的时候看到这个*v1 = byte_402FF8[(char)v1[v4]]我没看懂是什么操作,先是v4= a1-v1然后反手取从402FF8开始往后的402FF8+(v1[v4])地址的字符,我确实懵了,完全不知道什么鬼,v1是什么都不知道,只能先去查一下402FF8这个地址附近的内容,然后无奈去od里面看了这个步骤是怎么在搞。
在这里插入图片描述
在这里插入图片描述
搜索字符串找到关键输入处,跟踪进去,下断点,调试在这里插入图片描述
在输入提示语附近就是输入命令(2)和关键函数(3)的所在地
进入3所指的call内部,进一步观察
在这里插入图片描述
发现两处汇编循环,观察寄存器和堆栈数据得知上面的是“strlen”函数对应的操作
下面的便是do...While循环
加密算法为:将所输入的字符串的每个字符分别与0x402FF8相加,在此处所对应的字符即为加密后的新字符
写一个小脚本,如下:

#include<iostream>
using namespace std;
int main()
{
    char a[]="1~}|{zyxwvutsrqponmlkjihgfedcba`_^]1[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(";
    char b[16];
    int i;
    char c[]="DDCTF{reverseME}";
    for(i=0;i<16;i++)
    {
        for(char n='!';n<126;n++)
        {
            b[i]=a[(int)n-31];
            if(b[i]==c[i])
             {
                 cout<<n;
                 break;
             }
        }
    }
    cout<<endl;
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值