reverse学习IDA工具的简单使用_实战

  • IDA简介
    IDA Pro (Interactive Disassembler Professional) ,是一款很火的交互式反汇编工具,是目前最棒的一个静态反编译软件,逆向工程利器之一;

  • 使用 IDA 演示分析简单的程序

1,通过 C 编写一个简单的加密程序:

#include<stdio.h>
#include<string.h>

int main()
{
    
    
	int i;
	int len;
	char key[20];
	char res[20];
	char *num = "eastmount";	//设置密钥
	char *right = "123456789";	//设置明文
	
	// please input the right key
	printf("please input the key");
	scanf("%s",&key);

	// 判断
	len = strlen(key);
	if(len < 6 || len > 10){
    
    
		printf("Error, The length of the key is 6~10\n");
	}else{
    
    
		//加密
		for(i = 0;i < len;i ++){
    
    
			res[i] = (key[i] ^ num[i]);
		}
		//做比较
		if(strcmp(res,right) == 0){
    
    
			printf("You are right, Success. \n");
		}else{
    
    
			printf("Error, please input the right key. \n");
		}
	}
	return 0;
}

这里我使用 kali 对 C源文件进行编译,使它成为linux可执行文件:

# gcc ida.c -o ida
# ./ida

在这里插入图片描述
至此,一个简单的加密程序就制作好了,接下来,便是利用 IDA 来破解这个加密程序;

2,首先,将可执行文件拖入吾爱破解,使用 exeinfoPE 对文件进行查壳以及基本信息查看:

在这里插入图片描述可以看到:ELF linux 可执行文件,64bits ,GCC编译;所以,我们使用 ida_x64版本打开它:
第一步,导入文件,选择装载 ELF文件:
在这里插入图片描述
第二步:然后一直选择 默认(OK)即可来到代码窗口,代码窗口有两种模式,一种为 text view, 以文本的形式显示; Graph view 以图形的形式显示;二者之间可以使用右键相互切换;
text view:
在这里插入图片描述Graph view:

在这里插入图片描述
接下来使用 shift + F12 (也可以在工具栏 View --> Open subviews --> strings)进行查看程序中所有可见字符串 strings:

在这里插入图片描述
这里可以看见我们之前在程序中设置的常量 123456789,以及输入key 的提示信息,接下来,双击其中的一个常量,跳转到 汇编代码窗口,这里我们可以看见这个常量调用的主函数:

在这里插入图片描述
双击主函数,跳转到主函数的汇编代码窗口:
在这里插入图片描述
然后按下 F5 快捷键,进行反汇编,得到通过 C 写的代码:

int __cdecl main(int argc, const char **argv, const char **envp)
{
    
    
  char s1[32]; // [sp+0h] [bp-50h]@5
  char s[20]; // [sp+20h] [bp-30h]@1
  int v6; // [sp+34h] [bp-1Ch]@1
  char *s2; // [sp+38h] [bp-18h]@1
  const char *v8; // [sp+40h] [bp-10h]@1
  int i; // [sp+4Ch] [bp-4h]@4

  v8 = "eastmount";
  s2 = "123456789";
  printf("please input the key : ", argv, envp);
  __isoc99_scanf("%s", s);
  v6 = strlen(s);
  if ( v6 > 5 && v6 <= 10 )
  {
    
    
    for ( i = 0; i < v6; ++i )
      s1[i] = v8[i] ^ s[i];
    if ( !strcmp(s1, s2) )
      puts("You are right ,Success ");
    else
      puts("Error, please input the right key.");
  }
  else
  {
    
    
    puts("Error,The length of th key is 6~10 ");
  }
  return 0;
}

注意观察通过反汇编得到的代码,首先最直观的变化是变量名的变化;其次,两个 if 判断中条件的变化,以及执行次序,这就是 IDA 反汇编或者反编译出来会有偏差的体现;但是这里,整个代码的逻辑并没有改变;

扫描二维码关注公众号,回复: 13615761 查看本文章

接下来,简单分析代码逻辑:

第一个 if :将用户输入做一个长度要求,要求用户输入的长度在 6~10之间;

for : 做 strlen(s) 次循环,将用户输入的字符逐个的与 v8 常量进行异或运算,放到 s1中去;(加密)

第二个 if :将 s1 与 s2 = "123456789"做比较,如果相同 ,strcmp() 函数返回 0,!0 即为真,执行输出 You are right ,Success;

整个代码思路明确,只要用户输入的长度为 6~10,并且与 eastmount 异或后等于 123456789 就可以Success ,因此我们需要通过这个加密程序反推一个解密程序,来得到用户正确的输入结果;

3,逆向解密

v8 = "eastmount";
s2 = "123456789";

str1 = "";

for i in range(len(v8)):
    str1 += chr(ord(s2[i]) ^ ord(v8[i]));  #将正确的key 与密钥 v8再次异或即可得到用户需要输入的值

print(str1)
# 得到 TS@@XYBVM

猜你喜欢

转载自blog.csdn.net/qq_46635165/article/details/109302087