GFSJ0134-【re1-100】
签到
int __fastcall __noreturn main(int argc, const char **argv, const char **envp)
{
__pid_t v3; // eax
size_t v4; // rax
ssize_t v5; // rbx
bool v6; // al
bool bCheckPtrace; // [rsp+13h] [rbp-1BDh]
ssize_t numRead; // [rsp+18h] [rbp-1B8h]
ssize_t numReada; // [rsp+18h] [rbp-1B8h]
char bufWrite[208]; // [rsp+20h] [rbp-1B0h] BYREF
char bufParentRead[200]; // [rsp+F0h] [rbp-E0h] BYREF
unsigned __int64 v12; // [rsp+1B8h] [rbp-18h]
v12 = __readfsqword(0x28u);
bCheckPtrace = detectDebugging();
if ( pipe(pParentWrite) == -1 )
exit(1);
if ( pipe(pParentRead) == -1 )
exit(1);
v3 = fork();
if ( v3 != -1 )
{
if ( v3 )
{
close(pParentWrite[0]);
close(pParentRead[1]);
while ( 1 )
{
printf("Input key : ");
memset(bufWrite, 0, 0xC8u);
gets(bufWrite);
v4 = strlen(bufWrite);
v5 = write(pParentWrite[1], bufWrite, v4);
if ( v5 != strlen(bufWrite) )
printf("parent - partial/failed write");
do
{
memset(bufParentRead, 0, sizeof(bufParentRead));
numReada = read(pParentRead[0], bufParentRead, 0xC8u);
v6 = bCheckPtrace || checkDebuggerProcessRunning();
if ( !v6 && checkStringIsNumber(bufParentRead) && atoi(bufParentRead) )
{
puts("True");
if ( close(pParentWrite[1]) == -1 )
exit(1);
exit(0);
}
puts("Wrong !!!\n");
}
while ( numReada == -1 );
}
}
close(pParentWrite[1]);
close(pParentRead[0]);
while ( 1 )
{
memset(bufParentRead, 0, sizeof(bufParentRead));
numRead = read(pParentWrite[0], bufParentRead, 0xC8u);
if ( numRead == -1 )
break;
if ( numRead )
{
if ( !childCheckDebugResult()
&& bufParentRead[0] == 123
&& strlen(bufParentRead) == 42
&& !strncmp(&bufParentRead[1], "53fc275d81", 0xAu)
&& bufParentRead[strlen(bufParentRead) - 1] == '}'
&& !strncmp(&bufParentRead[31], "4938ae4efd", 0xAu)
&& confuseKey(bufParentRead, 42)
&& !strncmp(bufParentRead, "{daf29f59034938ae4efd53fc275d81053ed5be8c}", 0x2Au) )
{
responseTrue();
}
else
{
responseFalse();
}
}
}
exit(1);
}
exit(1);
}
能发现下面就是一个判断 第一个判断是否为{开头
第二 判断第一段是否为 53fc275d81
第三 判断最后是否为 }结尾
第四 判断最后一段是否为 4938ae4efd
第五进行一个操作之后 进行比对是否为 {daf29f59034938ae4efd53fc275d81053ed5be8c}
那么好 我们知道第一段 最后一段 与比对查看 发现就是比对的flag 只是换了一段
那么我们看
bool __cdecl confuseKey(char *szKey, int iKeyLength)
{
char szPart1[16]; // [rsp+10h] [rbp-50h] BYREF
char szPart2[16]; // [rsp+20h] [rbp-40h] BYREF
char szPart3[16]; // [rsp+30h] [rbp-30h] BYREF
char szPart4[24]; // [rsp+40h] [rbp-20h] BYREF
unsigned __int64 v7; // [rsp+58h] [rbp-8h]
v7 = __readfsqword(0x28u);
memset(szPart1, 0, 15);
memset(szPart2, 0, 15);
memset(szPart3, 0, 15);
memset(szPart4, 0, 15);
if ( iKeyLength != 42 )
return 0;
if ( !szKey )
return 0;
if ( strlen(szKey) != 42 )
return 0;
if ( *szKey != 123 )
return 0;
strncpy(szPart1, szKey + 1, 0xAu);
strncpy(szPart2, szKey + 11, 0xAu);
strncpy(szPart3, szKey + 21, 0xAu);
strncpy(szPart4, szKey + 31, 0xAu);
memset(szKey, 0, 0x2Au);
*szKey = 123;
strcat(szKey, szPart3);
strcat(szKey, szPart4);
strcat(szKey, szPart1);
strcat(szKey, szPart2);
szKey[41] = 125;
return 1;
}
能看到确实是切换位置了
是这样的 confuseKey 会把输入的四个 10 字节分组
{A B C D}
重排成
{C D A B}
目标重排结果是
{daf29f5903 4938ae4efd 53fc275d81 053ed5be8c}
所以原始输入为
{53fc275d81 053ed5be8c daf29f5903 4938ae4efd}
最终 flag
{53fc275d81053ed5be8cdaf29f59034938ae4efd}
然后交
53fc275d81053ed5be8cdaf29f59034938ae4efd
评论