题目链接: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;
}