015-Brad Soblesky.1 的 write up
乙太编辑,请勿转载,谢谢配合
1. 程序执行
2. 查壳
3. 分析
C51是大端存储;socket编程中网络字节序一般是大端存储
首先我们拖入32位IDA进行分析,根据运行的错误信息的关键提示字符,可以知道下面标黄的可能一个是错误提示,一个是正确提示。双击跟踪即可,如下图:
跟踪后以text view形式阅读,如下图:
解释:其实这题和简单,可以看的出来主要做的就会用户输入的string2和内置的string对比。而string只是从内存中三个双字拼接出来的,如下图:
选中标黄字符串,右键选择以十六进制转换成ASCII形式即可显示出字符串来
这里只是需要注意一个大端存储的问题:
大端存储(Big-Endian)
数据的高字节存储在低地址中,数据的低字节存储在高地址中 如:
int a = 1; // int在内存中占 4Byte; // a在内存中的分布为 0x1 0x0 0x0 0x0; // 从左到右内存地址降低,也就是高字节地址存放的是a的低字节数据
应用:C51是大端存储;socket编程中网络字节序一般是大端存储
小端存储(Little-Endian)
数据的高字节存储在高地址中,数据的低字节存储在低地址中 如:
int a = 1; // int在内存中占 4Byte; // a在内存中的分布为 0x0 0x0 0x0 0x1; // 从左到右内存地址降低,也就是低字节地址存放的是a的低字节数据
应用:x86结构、ARM和DSP都是小端存储
4. 结果
所以最后拼接出来的正确结果是: