是一个ELF 文件 ,这里可以先打开看看是啥
其实我猜测,这里有一个算法,输入的东西然后进行匹配吧。
上面知道了是64位的,我们这里就用IDA打开看看
很明显这个patch_me这个函数是关键
传入的值放入 al 中,然后对他进行了if判断,这里看get_flag这个函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| unsigned __int64 get_flag() { unsigned int v0; int i; int j; __int64 s; char v5; unsigned __int64 v6;
v6 = __readfsqword(0x28u); v0 = time(0LL); srand(v0); for ( i = 0; i <= 4; ++i ) { switch ( rand() % 200 ) { case 1: puts("OK, it's flag:"); memset(&s, 0, 0x28uLL); strcat((char *)&s, f1); strcat((char *)&s, &f2); printf("%s", (const char *)&s); break; case 2: printf("Solar not like you"); break; case 3: printf("Solar want a girlfriend"); break; case 4: s = 0x7F666F6067756369LL; v5 = 0; strcat(&f2, (const char *)&s); break; case 5: for ( j = 0; j <= 7; ++j ) { if ( j % 2 == 1 ) *(&f2 + j) -= 2; else --*(&f2 + j); } break; default: puts("emmm,you can't find flag 23333"); break; } } return __readfsqword(0x28u) ^ v6; }
|
最开始的
1 2 3 4
| v0 = time(0LL); srand(v0); for ( i = 0; i <= 4; ++i ) {
|
这里用了随机数,但是用随机数不太可能
然后,下面有5个case 语句 case 2和case 3 实际没有啥作用
现在分开看case 1 4 5
case 1
1 2 3 4 5 6 7 8
| case 1: puts("OK, it's flag:"); memset(&s, 0, 0x28uLL); strcat((char *)&s, f1); strcat((char *)&s, &f2); printf("%s", (const char *)&s); break;
|
case 4
1 2 3 4 5 6
| case 4: s = 0x7F666F6067756369LL; v5 = 0; strcat(&f2, (const char *)&s); break;
|
case 5
1 2 3 4 5 6 7 8 9
| case 5: for ( j = 0; j <= 7; ++j ) { if ( j % 2 == 1 ) *(&f2 + j) -= 2; else --*(&f2 + j); } break;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <stdio.h>
int main() { char f2[] = { 0x69 ,0x63 ,0x75 ,0x67 ,0x60 ,0x6F ,0x66 ,0x7F }; char w[8]; for (int i = 0; i < 8; ++i) { if (i % 2 == 1) { w[i] = f2[i] - 2; } else { w[i] = f2[i] - 1; }
}
printf("%s", w);
return 0; }
|
然后和前面的f1链接起来
GXY{do_not_hate_me}
flag{do_not_hate_me}