![](https://i-blog.csdnimg.cn/blog_migrate/19936816c92d4f5cc85bea3de8ce9ff4.png)
老样子,查信息
![](https://i-blog.csdnimg.cn/blog_migrate/3b5e6fe59b97f201254e470b48b4d52e.png)
无壳,64位
在ida(x64)中打开
![](https://i-blog.csdnimg.cn/blog_migrate/362a09caab52ba87087167c182b2c4e7.png)
没有找到线索,继续跟进函数
![](https://i-blog.csdnimg.cn/blog_migrate/6771dcfe6861d6a208fe8be9b6d9a060.png)
从下往上分析
1.从第1位到第v5位比对Str1和Str2的值,若相等则执行函数,反之执行其他函数
2.v5 = j_srelen(Str2)
3.for()内:v10 = j
若 j > j_strlen(Str2) ,跳出循环。反之,则判断Str2[j]是否等于111,若相等,则让这个元素等于48,反之,继续执行
4.for()语句:让v3等于一串数字,然后每循环依次v3加4
5.v3指向v7的地址
其中:如果出现从20到128的数字或一串不明意义的数字,可能是字母的ascii码,我们按R键转换成字母
那个sub_1400111D1函数使用格式神似c语言的printf函数
sub_14001128F与c语言的scanf对应,其实这两个函数就是printf和scanf,我们右键,选择rename改名
![](https://i-blog.csdnimg.cn/blog_migrate/c7ea348c62f16bae5ef330baf7270a8e.png)
我们跟进j_strlen函数
![](https://i-blog.csdnimg.cn/blog_migrate/b2be2117103b7998400913ed731a5a7e.png)
发现就是strlen函数
还有第一个for()语句中不明意义的加法和v3指向v7,之前写这篇文章有过一段印象就是在执行主程序前预留一点加载时间,虽然不知道有什么用处。
strncmp函数
![](https://i-blog.csdnimg.cn/blog_migrate/f1d9061ffa0e79777843212fec8ca965.png)
大致流程就是:将Str2中的字符串中的字母o转化为数字0,然后读取输入的字符串进行比对,若相等则成功反之失败,所以flag就是转换后的Str2
跟进Str2
![](https://i-blog.csdnimg.cn/blog_migrate/fd4fbca9359981ad2449268057b14cf9.png)
所以把o换为0就是flag
flag{hell0_w0rld}
笔记:
*(_DWORD *) 强制类型转换并提领指针(懵逼)
![](https://i-blog.csdnimg.cn/blog_migrate/b2c0cdb41fad735d8a5e5be9ebe26dc0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d2237d3bcdd3db973c1320292dba4736.png)
今晚挑战写5个wp,哈哈哈
![](https://i-blog.csdnimg.cn/blog_migrate/bf40ea571454dc68ac60eea4afab79c1.jpeg)