2018中原工CTF校赛 re2
第二题的re很容易看懂,但是写起来。。。
一开始没有写出来鸭
当然经过acm室友和大佬的指点
我成功get了新技巧
分组爆破2333333
先将程序拖入ida,很明显的就是爆破
和susctf那道用c#写的题很像啊
但是爆破一开始爆不出,所以只能一个一个爆了
逐个确定最高位
上代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <string.h>
int main()
{
char byte_408040[32]={0};
unsigned char byte[32]={0xA4, 0x19, 0x04, 0x82, 0x7E, 0x85, 0x50, 0xA8, 0xD1, 0xEA,
0xE3, 0xF9, 0xE8, 0xE1, 0x60, 0x3A, 0x1A, 0x0A, 0x87, 0xDD,
0xE1, 0x61, 0xA0, 0xC0, 0x60, 0xA4, 0x48, 0x28, 0x16, 0x0B,
0x05, 0x20};
unsigned int input,la;
char v5=0;
unsigned int8_t ,v4;
int i;
for(la=0;la<0xff;la++)
{
input = la;
input = input << 28;//左移的位数要看确定了多少位
input |= 0xa0ab3e2;//确保低位不变,求高位
v5 = 0;
for ( i = 0; i <= 31; ++i )//这边i <= 31,一开始可以写成i <= 5,然后逐步变多
{
v4 = v5 ^ (input&0xff) ^ byte[i];
byte_408040[i] = v4;
if ( (byte_408040[i]<'A'||byte_408040[i]>'Z')&&byte_408040[i]!='}'&&byte_408040[i]!='{'&&byte_408040[i]!='_' )
{
break;
}
v5 ^= byte[i];
input >>= 1;
}
if(i == 32) //后面的位数,由上面循环中i <= 多少而定
//if(!strncmp("FLAG{",byte_408040,5)) //确定前五位时用这个
{
for(i=0;i<32;i++)
printf("%c",byte_408040[i]);
printf("\n%x",la); //打出16进制确定爆破出的高位
printf("\n");
}
}
return 0;
}
flag跑完就有了,当然也能调试。