RE学习日记(二)-- 按小组做好
RE学习日记(二)-- 按小组做好
Moonbeaut题目名称:按小组做好
一、题目描述
二、解题过程
题目中说找到序列号为5B134977135E7D13
的名字,然后下载文件,用PEiD
查看文件是win 32
位应用
用idea
打开文件,按F5
查看反编译代码
分析主函数
函数一开始声明了很多变量,其中特别的是
char v8; // [sp+Ch] [bp-130h]@1 |
sp
是栈顶指针,可以看出这三个变量的地址sp+Ch
,sp+Dh
,sp+Eh
是连续的。
然后程序由scanf(aS, &v11);
接受一个输入并赋值给v11
v3 = 0; |
由v3
作为索引,循环遍历 v11
中的每个字符。
其中sprintf()
函数是一个关键,它用于将格式化的数据输出到一个字符串中。用在需要将多种数据类型格式化为字符串或者将多个字符串拼接在一起的场合。其中aS02x
是将字符串格式化为两个一组的16
进制数。
*(&v11 + v3++)
:取 v11
的当前字符,v3++
是后置递增操作,表示以v3
作为v11
的下标依次取v11
中的值。
*(&v8 + i)
:从v8
的地址开始往后取三个值(i>=3)
,从上面声明变量处已经发现v8
,v9
,v10
是三个地址连续的值,所以这里就是取 v8
, v9
, v10
中的值。
*(&v11 + v3++) ^ *(&v8 + i)
:用v11
中取的值与v8
,v9
,v10
进行异或运算,将结果存储在 v15
中。
最后根据aS02x
的格式进行字符串格式化储存在v15
中。
memset(&v11, 0, 0x64u); |
使用 scanf
读取另一个字符串(Serial
)到 v11
。
字符串比较使用strcmp
比较v11
和v15
。如果相同,显示正确信息。如果不同,显示错误信息。
我们结合程序运行的逻辑可以发现整个程序就是对Name
的值进行异或操作然后格式化为两个一组的16
进制数,然后与Serial
进行比较。
按照这个逻辑我们对Serial
进行反向操作就可以得到Name
的值,由于Name
最后是被格式化为两个一组的16进制数存储的。
所以我们也要将Serial
分为两个一组的16进制格式,然后与v8
,v9
,v10
的值进行异或运算。
得到Name
后运行程序验证一下
Correct!说明我们得到的Name是正确的。
三、解题脚本
Serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13] |
四、提交结果
五、flag
flag{K3yg3nm3}