白袍的小行星

网鼎杯的一道逆向题

字数统计: 503阅读时长: 1 min
2020/05/15 Share

昨天做了网鼎杯的一道逆向,属于很简单那种,记录一下过程。

题目是一道Linux逆向,设置好IDA的远程调试后开始看题目。

大致逻辑为,你需要打败恶龙,当你的攻击力大于恶龙血量时才能打败,想要加攻击力要靠金币买,但初始只有5个金币,攻击力100,2个金币可以买1点攻击力,恶龙的初始血量是10000.

起初我以为是那种Web题的思路,需要你想办法刷金币然后买攻击力,最后朋友告诉我完全不用,这就是逆向的魅力吧。

找到主函数,反编译后在打恶龙的boss()函数处下好断点,我这个图下的比较多==

开始执行程序,主界面直接选择打恶龙,命中断点:

接下来要执行到关键的jle跳转处,它是一个条件跳转,即小于等于时跳到相应位置,否则执行下一条指令。

注意并非上图所执行到的那个jle,是下面那个,需要单步步过,不然直接call到游戏结束处了。

第二个jle会因为你的攻击力小于巨龙血量,所以将跳转到游戏结束,我们要做的就是不让它跳转,继续执行,下面就是打败之后的结果。

jle跳转与否取决于标志寄存器的值,在它之前,比较两个值大小的工作交给了cmp指令。

cmp ax,bx ;即ax - bx,将结果送入标志寄存器

在这题里ax是我们攻击力,bx是恶龙血量,所以肯定得到的是负数。

标志符号的是SF,SF=1代表负数,SF=0代表正数。

可以看到执行到此处时SF是等于1的,修改为0即可。

连续这样修改三次即可成功拿到flag


有时间学一学二进制,还挺有意思的。

CATALOG