拿到exe文件先查下信息,是一个64位程序,没有加壳 (壳是对代码的加密,起混淆保护的作用,一般用来阻止逆向)。
然后拖进IDA(64位)进行反汇编
一般来说,先查看一下字符串,简单的题目会有flag或者敏感数据字符等信息,方便我们定位函数查看字符串的方法为shift+F12
找到了关于flag的信息,双击点进去找到这段字符串的位置
ctrl+x(交叉引用)查看是哪段函数调用了该字符串
汇编代码对于初学者来说读懂比较困难,可以按“F5”查看伪C代码
分析代码段
strncmp(str1,str2,v3)是把str1与str2两字符串的前v3位数做一个比较,若str1=str2,返回0;大于返回正数,小于返回负数
if(!strncmp(str1,str2,v3))是一个判断语句,if()括号里面的内容如果为真,则输出
"this is the right flag",这时我们只需要知道什么情况为真。
然后看括号里面的内容 !( strncmp(str1,str2,v3) )为真的情况
!为非,所以只要( strncmp(str1,str2,v3) )为0, !( strncmp(str1,str2,v3) )即为真;为0的情况已经在上面对strncmp函数的讲解说过了,str1,str2两个字符串相等返回值即为0。
选中数字按"R"键可以将数字转换为字符。即str2中所有的"o"都被转换成了"0" 。
"sub_1400111D1"是printf之类的输出函数。
"sub_14001128F"是scanf函数,所以字符串str1为我们输入的内容。
双击str2进去之后就找到了str2 '{hello_world}',因为str2中所有的"o"都被转换成了"0"。
flag为 flag{hell0_w0rld}