这里是通过fgets函数读取字符串
库函数 char *fgets(char *str, int n, FILE *stream) 从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
fgets(char *str, int n, FILE *stream)
参数
str – 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
n – 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
然后我们再看sub_4006FD((__int64)&s) ),上面读取的字符流存入到&s中,调用了sub_4006FD这个子函数。查看具体子函数的代码如下:
这里我们可以看到for循环了12次,就能知道flag字符串长度为12。
然后看到(&v3)[i % 3][2 * (i / 3)] 很明显表示是一个二维数组。
在IDA中的伪代码显示:
v3 = “Dufhbmf”;
v4 = “pG`imos”;
v5 = “ewUglpt”;
可以理解为 chr a[2][6]={“Dufhbmf”, "pGimos","ewUglpt"} python中表示即 array2 = ['Dufhbmf', 'pG
imos’, ‘ewUglpt’]
*(char *)(i + a1) 是你输入的字符串,是个指针字符串(每次位数要加1取下一位的字符)和V3,V4,V5组成的二维数组里的字符串比较。
return 0代表函数正常终止
ruturn 1代表函数非正常终止
if ( (&v3)[i % 3][2 * (i / 3)] - (char )(i + a1) != 1 )
return 1LL;
如果字符串中的字符 减 输入的字符串中的字符 的ASCII值不等于1则终止,等于1则继续。
那么我们就知道 :
array2[i%3][2(int(i/3))]) - 【输入的字符串中的字符 的ASCII】= 1 成立就能得到flag
【输入的字符串中的字符 的ASCII】=array2[i%3][2(int(i/3))]) - 1代码如下:
array2 = ['Dufhbmf', 'pG`imos', 'ewUglpt']
result = ''
for i in range(12):
result += chr(ord(array2[i%3][2*(int(i/3))]) - 1)
print(result)
ord()是将字符转asiic,减去1后,通过chr()转字符。