25号鸽了,今天补两题
第一题,elrond32。丢进exeinfope看了一下又是Ubuntu文件,1分题懒得开虚拟机,直接扔进IDA。
找到main函数,翻译成C。
int __cdecl main(int a1, char **a2) { if ( a1 > 1 && sub_8048414(a2[1], 0) ) { puts("Access granted"); sub_8048538((int)a2[1]); } else { puts("Access denied"); } return 0; }
可以判断出是:如果sub_8048414的返回结果为1,就可以输出flag。这题的主要内容在于求出a2的内容。
进入sub_8048414:
signed int __cdecl sub_8048414(_BYTE *a1, int a2) { signed int result; // eax switch ( a2 ) { case 0: if ( *a1 == 105 ) goto LABEL_19; result = 0; break; case 1: if ( *a1 == 101 ) goto LABEL_19; result = 0; break; case 3: if ( *a1 == 110 ) goto LABEL_19; result = 0; break; case 4: if ( *a1 == 100 ) goto LABEL_19; result = 0; break; case 5: if ( *a1 == 97 ) goto LABEL_19; result = 0; break; case 6: if ( *a1 == 103 ) goto LABEL_19; result = 0; break; case 7: if ( *a1 == 115 ) goto LABEL_19; result = 0; break; case 9: if ( *a1 == 114 ) LABEL_19: result = sub_8048414(a1 + 1, 7 * (a2 + 1) % 11); else result = 0; break; default: result = 1; break; } return result; }
注意,此函数中的a2[1]变成了a1,a2初始值为0。防止混淆可以改一下变量名。
这段代码逻辑很简单,switch判断a2内容,然后判断a1指向的内容,若符合条件则递归进下一轮,直到a2的内容不在switch中,循环结束,返回值result变为default中的1。
所以a2的值必然是if语句中的数字,不然无法进入递归。
a2的可能值只有01345679这八个数字,递归中传递的方式为 (a2+1)%11 ,用python看一下能取到的数字和顺序
a2 = 0 for i in range(9): a2 = 7 * (a2+1) % 11 print(a2)
7 1 3 6 5 9 4 2 10
2和10都不在可选数中,取前八位即可。按顺序取if中的值,即main中a2的内容。
进入输出flag的函数sub_8048538中。
int __cdecl sub_8048538(int a1) { int v2[33]; // [esp+18h] [ebp-A0h] int i; // [esp+9Ch] [ebp-1Ch] qmemcpy(v2, &unk_8048760, sizeof(v2)); for ( i = 0; i <= 32; ++i ) putchar(v2[i] ^ *(char *)(a1 + i % 8)); return putchar(10); }
百度一下memcpy函数的作用,是将unk_8048760这块地址中的内容复制到v2中,复制的大小为sizeof(v2)。
双击进入View-A界面,将地址中数组的内容抄下来,用万能的python把flag输出算法重新实现一遍输出即可
key = [105, 115, 101, 110, 103, 97, 114, 100] v2 = [0x0F, 0x1F, 0x04, 0x09, 0x1C, 0x12, 0x42, 0x09, 0x0C, 0x44, 0x0D, 0x07, 0x09, 0x06, 0x2D, 0x37, 0x59, 0x1E, 0x00, 0x59, 0x0F, 0x08, 0x1C, 0x23, 0x36, 0x07, 0x55, 0x02, 0x0C, 0x08, 0x41, 0x0A, 0x14] flag = '' for i in range(33): flag += chr(v2[i] ^ key[(i % 8)]) print(flag)
flag{s0me7hing_S0me7hinG_t0lki3n}
浙公网安备 33010602011771号