程序破解

程序破解

源代码: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;

}

  1. 使用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

 

如果我们输入错误则程序退出:

 

  1. 我们采用直接修改hello文件来直接执行函数

 

我们可以看到在test之后的两句jne跳向的地址是0x4006ac+0x11 

0x4006ea+0x11

我在第一个jne指令直接修改为jmpprintf这条指令的位置。

第一条jne的位置是4006aa,此时的eip4006ac。

我需要跳转到4006fb,那么就是要增加0x4f个位置,那么就是将

 74 11 改为 eb 4f

(1) 先打开hello,然后输入:%!xxd

 

(2) 输入/75 11搜索到位置

(3) 对比objdump查看到的机器指令和这里的机器指令前后相同,则就是要找的位置。修改为eb4f

 

(4) 修改后输入:%!xxd -r并保存,再重新执行程序,结果如下,破解成功。

 

(5) 还可修改密码,即查找/32303335333132132 ,改为3030303030303030

(6) 运行破解成功。

 

 

posted @ 2016-05-26 19:36  20135302魏静静  阅读(296)  评论(0编辑  收藏  举报