NewStarCTF 2023 Endian
这题... 出个flag都这么离谱的吗?老早就解出flag了但是...
今天玩了玩花吻再来做这道题...(我还特地换成用C写...)
IDA打开一个简单的Xor
python c 都可以解
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
signed main(){
__int32 array[6]={0x75553A1E, 0x7B583A03, 0x4D58220C, 0x7B50383D, 0x736B3819, 0x0};
int i; // [rsp+4h] [rbp-3Ch]
char *v5; // [rsp+8h] [rbp-38h]
char v6[40]; // [rsp+10h] [rbp-30h] BYREF
unsigned __int64 v7; // [rsp+38h] [rbp-8h]
// v7 = __readfsqword(0x28u);
puts("please input your flag");
scanf("%s", v6);
v5 = v6;
cout<<(*(DWORD *)v5)<<"\n\n";
// cout<<atoi("flag")<<"\n";
// cout<<(int)('f')*pow(16,3)+(int)('l')*pow(16,2)+(int)('a')*pow(16,1)+(int)('g')*pow(16,0)<<"\n";
for ( i = 0; i <= 5; ++i )
{
// if ( *(DWORD *)v5 != (array[i] ^ 0x12345678) )
// {
// printf("wrong!");
// exit(0);
// }
cout<<(array[i] ^ 0x12345678)<<"\n";
v5 += 4;
}
printf("you are right");
return 0;
}
/*
aaaa
1633771873
aaab
1650549089
*/
由于搞不清楚C是怎么将四个字母的字符串转成整数的 我用枚举的方法爆破
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
signed main(){
long long num[] = {1768713339,1600943220,1768189509,1633644129,1734437990,305419896};
char dict[]="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_{}@!#$%^&*()";
int t=1;
int n=num[t];
char s[4];
for(int i=0;i<strlen(dict);i++)
for(int j=0;j<strlen(dict);j++)
for(int k=0;k<strlen(dict);k++)
for(int l=0;l<strlen(dict);l++)
{
s[0]=dict[i],s[1]=dict[j];
s[2]=dict[k],s[3]=dict[l];
char *v5;
v5 = s;
if((*(DWORD *)v5)==n){
cout<<s;
t++;
return 0;
}
}
}
/*
flag{llittl_Endian_a
*/
结果解出flag这个P样
flag{llittl_Endian_a
我以为没解全 但是本地运行 task
这就离谱好吧... 出题人不能闭合个括号吗? 而且也毫无语义...
所以flag:
flag{llittl_Endian_a}
...
本题唯一的作用就是让我知道了 _ DWORD(4byte指针) 和 DWORD(4byte)的区别