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 反汇编或者反编译出来会有偏差的体现;但是这里,整个代码的逻辑并没有改变;
接下来,简单分析代码逻辑:
第一个 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)
# 得到 aaa@qq.com@XYBVM