静态逆向简单的ELF

来源:互联网 发布:python popen pipe 编辑:程序博客网 时间:2024/06/05 11:20

看到csdn中一篇文章:http://blog.csdn.net/fisher_jiang/article/details/6783922,该文章使用动态调试进行破解找到密码。由于自己对linux不熟悉需要学习段时间,就使用ida静态反汇编进行逆向。

要破解的文件链接:hackme

1、运行该程序,查看运行效果:


运行之后屏幕打印出:Password,Please?

随便输入字符串:123、111

可以确认错误提示为:Oops..

2、根据以上执行逻辑,我们可以判断输入密码前面的逻辑为显示字符串“Password,Please?”,通过快捷键"Alt + T" 搜索字符串"please",如下图:



搜索结果如下图:



3、查找对变量aPasswordPlease的引用,使用快捷键"Ctrl + x",如下图:


如上图只有一处引用,双击改行跳转调用处,如下图:


为了方便查看代码逻辑,光标放到该行之后按空格键跳转到ida调用逻辑图,如下图所示:




查看这个调用图可以分析函数sub_8048591()就是判断密码是否正确。

4、为了能够更方便分析代码,点击tab键切换到伪代码窗口,如下图所示。


通过以上伪代码可以分析代码逻辑:

(1) v10保存输入字符数组;

(2) byte_804869c为校验字符串,如下图:


(3) 随机10次选取一个位置index,进行index+1次的1828812941 * v4 + 12345运算,元算结果与输入数组中的index位进行异或运算,运算结果与byte_804869c中index对应元素对比,不同则失败。


5、通过的逻辑分析,写一个程序计算出密码。逻辑如下:

#include <stdlib.h>#include <stdio.h>void test(){char check_array[] = {0x6A, 0xFB, 0x4C, 0x8D,0x58, 0x0F, 0xD4, 0xE8,0x94, 0x98, 0xEE, 0x6B,0x18, 0x30, 0xE0, 0x55,0xC5, 0x28, 0x0E, 0x90};char input[124] = { 0 };__int32 index = 0;int count = 19;char v5;int v9;int v7;do {int v4 = 0;v5 = check_array[index];v7 = 0;while (v7 < index + 1){++v7;v4 = 1828812941 * v4 + 12345;}printf("%c", ((unsigned __int8)v5 ^ (unsigned __int8)v4));} while (index++ < 19);}int main(){test();    return 0;}


运行结果如下图所示:



6、校验密码是否为"SesameOpenYourself!",结果如下图所示:



总结:破解密码用的关键思想是:

a = b^c

b = a^c

c = a^b

原创粉丝点击