好友
阅读权限10
听众
最后登录1970-1-1
|
一.ex2的分析
1.运行一下程序,发现需要输入密码
2.查看一下文件类型,发现是64位的linux程序
3.放进IDA进行分析,首先查看一下main函数,在main函数中,调用了check1,check2,check3函数
4.分析一下check1函数,该函数的作用是检查传入的字符串是否只包含数字字符。如果字符串中包含非数字字符,则返回0,否则返回1。
5.分析一下check2函数,该函数的作用是将传入的字符串中除了最后一个字符以外的所有字符相加,然后判断它们的和是否为偶数。如果和为偶数,则返回1,否则返回0xFFFFFFFF。
6.分析一下check3函数,这个函数的作用是检查输入的字符串是否符合一定的规则。如果符合规则,返回1;否则返回0。具体来说,如果输入字符串长度为奇数或小于等于4,则返回0。否则,将输入字符串分成两半,分别为前半部分和后半部分。对于前半部分的每个字符,如果它不等于后半部分对应位置的字符加上4,则返回0。否则,返回1。
7.分析完成各个函数以后,程序已然明朗,我们只需要输入长度大于4且长度为偶数的一串数字,满足后半部分对应位置+4等于前半部分对应位置即可。我们输入一个86864242进行测试
二.ex3的分析
1.首先运行一下程序,是个输入密码的程序
2.查看一下文件类型,是一个64位的linux程序
3.放入IDA进行分析,首先看一下main函数,其中调用了check函数
4.查看check函数
5.这其中调用了check1,check2,check3,check4四个函数,我们分别看一下各个函数
6.对各部分代码做一个分析
main():程序首先打印出"What's the password:",然后等待用户输入密码。用户输入的密码存储在v4数组中。程序调用check函数检查输入的密码是否正确,如果正确则输出"Correct!",否则输出"Nope, try again."。
check():该函数接受一个指向字符的指针作为参数a1。函数体内部定义了5个整型变量v2、v3、v4、v5和i,其中v2、v3、v4、v5的初始值都为0,i的初始值为0。然后使用for循环遍历字符串a1中的每个字符,对于每个字符,分别调用check1、check2、check3和check4函数进行检查,如果返回值为1,则对应的整型变量加1。最后判断v5、v4、v3和v2是否都大于1,如果是,则返回true,否则返回false。
check1():判断a1是否大于64且小于等于90,如果是,则返回true,否则返回false。
这个函数的作用是检查字符a1是否为大写字母。
check2():该函数接受一个整型变量a1作为参数。函数体内部只有一行代码,判断a1是否大于96且小于等于122,如果是,则返回true,否则返回false。这个函数的作用是检查字符a1是否为小写字母。
check3():该函数接受一个整型变量a1作为参数。函数体内部只有一行代码,判断a1是否大于47且小于等于57,如果是,则返回true,否则返回false。这个函数的作用是检查字符a1是否为数字。
check4():该函数接受一个整型变量a1作为参数。函数体内部有一行代码,判断a1是否在以下四个区间中的任意一个:(32, 47]、(57, 64]、(90, 96]、(122, 126]。如果是,则返回true,否则返回false。这个函数的作用是检查字符a1是否为标点符号或空格。
7.做完各部分代码的分析之后,程序也比较明朗了,这个程序会检查输入的密码是否包含至少两个大写字母、两个小写字母、两个数字和两个特殊字符。我们只需要输入满足这些条件就可以了。
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|