DDCTF2019——reverse1_final

(DDCTF 19)reverse1_final

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

百度下载脱壳机,脱壳。

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

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

将其拉入ida分析
很明显,该函数便是加密函数;进入内部查看DDCTF2019——reverse1_final_第1张图片
很明显,该函数便是加密函数;进入内部查看

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

#include
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<

你可能感兴趣的:(CTF)