本文主要是介绍两道逆向CTF题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:https://pan.baidu.com/s/1rToDORyPLcsrlVT3WSWuCA
提取码:2f1m
第一题re1
1、用查壳工具检查程序没加壳,使用IDA64打开,找到main()函数,按F5进行反编译
2、(方法一)把v7转化成字符串,有7个字符以及一个结束符‘\0’,可以注意到v7和v8的地址是连着的,又是小端存储的方式,所以v7实际上"harambe"
sub_4007C0()函数打印不正确,所以flag的长度就等于v8的长度,而v8[i % v6 - 8]实际上就是v7[i % v6]
(方法二)或者直接把v7的类型改成char类型,已经知道v7和v8的地址是连着的,v7的长度是8+v8的长度28=36,所以直接把v7改成char v7[36],后面的代码也会相应的改变
3、编写脚本
//方法一
#include<stdio.h>int main()
{int i;char flag[19]="";char v7[]="harambe";char v8[]=":\"AL_RT^L*.?+6/46";int v6=7;for(i=0;i<18;i++){flag[i] = (char)(v7[i % v6] ^ v8[i]);}printf("%s",flag);return 0;
}//方法二
#include<stdio.h>
#include<string.h>int main()
{int i;char v7[36]="";char flag[19]="";int v6=7;strcpy(&v7[8], ":\"AL_RT^L*.?+6/46");strcpy(v7, "harambe");for(i=0;i<18;i++){flag[i] = (char)(v7[i % v6] ^ v7[i + 8]);}printf("%s",flag);return 0;
}
第二题IgniteMe
1、用查壳工具检查程序没加壳,使用IDA32打开,在start()函数,按F5进行反编译
2、所以sub_401050()函数要返回1,byte_403180就等于byte_403000,而byte_403000和v4已知,所以就知道byte_403078
3、求v4的值
(1)__ROL4__函数是向左移了4位,0x80070000是十六进制,移4位以后的十六进制就是0x00700008,在右移一位,后16位就是0x0004,v4是char类型,就是0x04
(2)使用Ollydbg动态调试,在00401000处按F2下个断点,按F9运行,在命令行里面随便输入字符回车,再按F8单步调试RETN,可以看到EAX值为函数返回的v4的值,v4为char类型,即0x04
(3)在给v4赋值后面一句代码以及sub_401000函数里面返回处下断点按F2下断点,按F9进行调试
点击按钮运行,输入字符串,点击Debugger windows选择Locals
按F8进行单步调试,可以看到v4的值为0x04
4、已经知道byte_403078,它等于v5,flag又等于v5,倒推回去就可以得到flag
5、编写脚本
#include<stdio.h>int main()
{int flag[40] = {0};int v4 = 4;int i;int v1=39; //byte_403180的长度int byte_403180[40]={0x0D,0x26,0x49,0x45,0x2A,0x17,0x78,0x44,0x2B,0x6C,0x5D,0x5E,0x45,0x12,0x2F,0x17,0x2B,0x44,0x6F,0x6E,0x56,0x09,0x5F,0x45,0x47,0x73,0x26,0x0A,0x0D,0x13,0x17,0x48,0x42,0x01,0x40,0x4D,0x0C,0x02,0x69};for ( i = v1 - 1; i >= 0; --i ){flag[i] = v4 ^ byte_403180[i];v4 = flag[i];}for(i=0; i<39; i++){printf("%c", flag[i]);}return 0;
}
这篇关于两道逆向CTF题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!