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的正确性
很急很急好牛好牛
么么
加油~