破译实践
objdump -d login
从call指令的那句scanf后面的mov判断出,将输入的值存放在esp+0x18的位置上。
通过cmp比较指令,发现与esp+0x1c所存储的值进行比较。
并通过jne指令跳转。因此推测esp+0x1c出所存放的应该就是口令。
查找esp+0x1c所存放的值,0x7fe即为口令,转换为十六进制为2046。
.\login
想要修改认证过程,即不管什么口令,都能通过验证。
分析一下:
jne指令的偏移地址为0e,当前所指向的位置为jne的下一条指令,地址为8048458。不符合jump条件将跳转至:8048458+0e=8048466。
为了不实现报错跳转,将偏移量更改为00,因此将继续执行下一条指令(movl指令)。
先vi login 打开login文本。发现是二进制乱码。
输入:%!xxd 指令后
将二进制文件转换为16进制模式。
输入 /750e ,搜索到750e所在位置后,
进入编辑模式,将750e改为7500.
输入:%!xxd -r 回到原来的二进制文本模式
输入::wq 保存退出
再次输入任意口令,均可通过验证!破解程序成功!