程序破解
查看
运行
反汇编,查看汇编码
对反汇编代码进行分析:
在main函数的汇编代码中可以看出程序在调用“scanf”函数请求输入之后,对 [esp+0x1c] 和 [esp+0x18] 两个内存单元的内容进行了比较,其作用应该是对比用户输入和预设口令。即预设口令被存放与局部变量 [esp+0x1c]中。
动态调试
运行目标程序,查看进程信息
将gdb依附到目标进程:attach
输入bt查看进程的运行栈情况,输入frame 7 进入main函数的栈帧:
查看[esp+0x1c] 和 [esp+0x18] 两个内存单元的内容:x/ 查看内存信息
测试密码:
Vi打开login文件:修改目标文件的二进制代码
输入 :%!xxd进入16进制编辑模式
jne 8048466 对应的16进制数为75 0e,,搜索75 0e : 将75 0e 修改为eb 0c(即jmp 8048472(对应leave指令) )
输入:%!xxd –r.:wq 保存二进制文件
查看修改处(jne【750e】是不相等时转移,jmp【eb0c】无条件转移指令)
再次启动本程序,任意输入口令都leave。
注
需注意的是,在动态调试第一步运行完login后,需要另开一个终端,使login的相关进程能持续停留在内存中再进行相关修改。