HUST|逆向工程 实验一

逆向·网安 · 2023-03-23 · 867 人浏览
HUST|逆向工程 实验一

exe文件:逆向工程实验一.zip

※步骤一:运行程序,查看特征字符串"Please Input:"通过IDA Pro找到该字符串所在位置,即定位main函数

image-20230322211440304

※步骤二: 在main函数中尝试反汇编,IDA报错,错误信息显示栈sp不平衡.打开IDA Optionals中的Stack pointer,分析程序中哪些位置栈不平衡.发现两处位置不平衡,将两处的push 0注释为nop

一般来说不平衡发生在调用函数前后,调用函数前push参数,那么在函数返回时应该观察SP是否调整去,比如 被调用函数返回时使用带参数返回指令ret N 或 调用者在调用函数后通过add esp,N

image-20230322211424962

image-20230322211536545

image-20230322212114842

image-20230322212144610

image-20230322212242184

※步骤三:至此main函数可以反汇编,得到以下结果.观察各个函数,不难猜测:

  • sub_48CD46printf函数,因为参数中带有输出字符串"Please Input"
  • sub_48C0EEscanf函数,因为参数中带有模式字符串%s,第二个参数是一个地址,可能指向缓冲区,且带有一个常数30,一般是指缓冲区长度.那么unk_5F3068就是用户输入字符串的地址
  • sub_48A9A6strlen函数,参数是用户输入的字符串地址.因为v5由该函数赋值,且v5在之后的判断中与数字进行比较,那么有可能是对输入字符串的长度进行判断.
  • sub_48E5BFstrcopy函数,因为参数有用户输入的字符串首地址/常数30/另外一个地址off_5F3088.且之后都使用off_5F3088进行判断
  • 当v5(输入字符串长度)在10~30范围内,会进入第一个if语句.随后调用了strcopy将输入字符串赋值给了off_5F3088.接着判断off_5F3088+7位置的字符是65('A'),如果不是将会执行sub_48A6DBsub_48C274.这两个函数在下面的else语句中也出现了,应该是程序终止语句.
  • 至此已经发现用户第8个字符输入(从0开始)应该是'A',随后分析sub_48D3A4函数.

屏幕截图 2023-03-22 212952

※步骤三:分析sub_48D3A4,发现它调用了sub_49DBD0.在这个函数中,首先将输入字符串偏移+7处的字符改为35('#'),随后对每个字符都异或0x2E.得到处理后的字符串a2.但是在这个函数内没有发现字符串比较逻辑,说明验证逻辑在其他地方,这个时候可以通过输入字符串的地址off_5F3088入手分析.

image-20230322213214580

※步骤四:右键变量off_5F3088查看哪些位置引用了它(jump to xref),发现sub_49DC80有重大嫌疑.进入函数并反汇编发现'111'和'107'这两个魔数,查ascii表发现正好是ok,说明这里应该是正确逻辑.向上观察发现该函数首先对字符串a2每个字符都异或上0x2D,随后拿a2跟off_5F3088比对,如果相等就会打印ok.(因为字符串比对函数中如strcmp,如果字符串相等会返回0,与这里的sub_48DB42前的!一致)那么接下来找到a2的位置即可

image-20230323093038072

image-20230323093059902

※步骤五:查看函数的调用者,来获取a2的信息.经过两次跳转后发现a2就是变量a1234IsAnExa567,查看值为"1234 is an exa5678"

image-20230323093336129

image-20230323093349066

※步骤六:根据上述流程,编写python脚本获取正确的flag,程序如下.得到答案2107#jpAbm#f{b654;.通过执行程序,可以验证flag的正确性

image-20230323095836757

image-20230323095342035

HUST 逆向工程分析
  1. 嗯嗯🤔 2023-03-23

    很急很急好牛好牛

    1. Axuanz (作者)  2023-03-23
      @嗯嗯🤔

      么么

  2. 匿名 2023-03-23

    加油~

Theme Jasmine by Kent Liao