exe文件：逆向工程实验一.zip※步骤一：运行程序，查看特征字符串"Please Input:"通过IDA Pro找到该字符串所在位置,即定位main函数※步骤二: 在main函数中尝试反汇编,IDA报错,错误信息显示栈sp不平衡.打开IDA Optionals中的Stack pointer,分析程序中哪些位置栈不平衡.发现两处位置不平衡,将两处的push 0注释为nop一般来说不平衡发生在调用函数前后,调用函数前push参数,那么在函数返回时应该观察SP是否调整去,比如 被调用函数返回时使用带参数返回指令ret N 或 调用者在调用函数后通过add esp,N※步骤三:至此main函数可以反汇编,得到以下结果.观察各个函数,不难猜测:sub_48CD46是printf函数,因为参数中带有输出字符串"Please Input"sub_48C0EE是scanf函数,因为参数中带有模式字符串%s,第二个参数是一个地址,可能指向缓冲区,且带有一个常数30,一般是指缓冲区长度.那么unk_5F3068就是用户输入字符串的地址sub_48A9A6是strlen函数,参数是用户输入的字符串地址.因为v5由该函数赋值,且v5在之后的判断中与数字进行比较,那么有可能是对输入字符串的长度进行判断.sub_48E5BF是strcopy函数,因为参数有用户输入的字符串首地址/常数30/另外一个地址off_5F3088.且之后都使用off_5F3088进行判断当v5(输入字符串长度)在10~30范围内,会进入第一个if语句.随后调用了strcopy将输入字符串赋值给了off_5F3088.接着判断off_5F3088+7位置的字符是65('A'),如果不是将会执行sub_48A6DB和sub_48C274.这两个函数在下面的else语句中也出现了,应该是程序终止语句.至此已经发现用户第8个字符输入(从0开始)应该是'A',随后分析sub_48D3A4函数.※步骤三:分析sub_48D3A4,发现它调用了sub_49DBD0.在这个函数中,首先将输入字符串偏移+7处的字符改为35('#'),随后对每个字符都异或0x2E.得到处理后的字符串a2.但是在这个函数内没有发现字符串比较逻辑,说明验证逻辑在其他地方,这个时候可以通过输入字符串的地址off_5F3088入手分析.※步骤四:右键变量off_5F3088查看哪些位置引用了它(jump to xref),发现sub_49DC80有重大嫌疑.进入函数并反汇编发现'111'和'107'这两个魔数,查ascii表发现正好是ok,说明这里应该是正确逻辑.向上观察发现该函数首先对字符串a2每个字符都异或上0x2D,随后拿a2跟off_5F3088比对,如果相等就会打印ok.(因为字符串比对函数中如strcmp,如果字符串相等会返回0,与这里的sub_48DB42前的!一致)那么接下来找到a2的位置即可※步骤五:查看函数的调用者,来获取a2的信息.经过两次跳转后发现a2就是变量a1234IsAnExa567,查看值为"1234 is an exa5678"※步骤六:根据上述流程,编写python脚本获取正确的flag,程序如下.得到答案2107#jpAbm#f{b654;.通过执行程序,可以验证flag的正确性