程序破解
源代码:hello.c
#include<stdio.h>
#include<string.h>
int main()
{
char name[10];
char a[10]="wjj";
char passwod[10];
char b[10]="20135302";
scanf("%s",name);
if(strcmp(name,a)!=0)
{
printf("user error\n");
return 0;
}
scanf("%s",passwod);
if(strcmp(passwod,b)!=0)
{
printf("passwod error\n");
return 0;
}
printf("hello!20135302...\n");
return 0;
}
- 使用objdump –d hello打开文件,找到main函数:
(1) 这里的截图是刚好在scanf函数之后的,因为我们是要比较输入的和提前设置好的变量相比较
(2) 我又找到strcmp这个函数之前的几句有两个lea语句,也就是找了两个地址
(3) 那么strcmp比较的应该就是这两个为首地址的两个字符串
(4) 先看rbp-0x40这里在前面有没有定义
(5) 那么可以看到:
Rbp-0x40为首地址被定义为:0x6a6a77,将ASCII,转换为字符为jjw
Rbp-0x20为首地址被定义为rax:0x32303335333132132
如果从低地址往高地址连续的就是32 30 31 33 35 33 30 32
转换为字符表示为:20135302
(6) 那么我们运行程序,可以看到用户名就是wjj,密码是20135302
如果我们输入错误则程序退出:
- 我们采用直接修改hello文件来直接执行函数
我们可以看到在test之后的两句jne跳向的地址是0x4006ac+0x11
0x4006ea+0x11
我在第一个jne指令直接修改为jmp到printf这条指令的位置。
第一条jne的位置是4006aa,此时的eip是4006ac。
我需要跳转到4006fb,那么就是要增加0x4f个位置,那么就是将
74 11 改为 eb 4f
(1) 先打开hello,然后输入:%!xxd
(2) 输入/75 11搜索到位置
(3) 对比objdump查看到的机器指令和这里的机器指令前后相同,则就是要找的位置。修改为eb4f
(4) 修改后输入:%!xxd -r并保存,再重新执行程序,结果如下,破解成功。
(5) 还可修改密码,即查找/32303335333132132 ,改为3030303030303030
(6) 运行破解成功。