攻防世界 逆向 Reversing-x64Elf-100分析

在这里插入图片描述
这里是通过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', 'pGimos’, ‘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()转字符。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值