首先checksec 一下,发现是一个32位的ELF文件,打开了canary保护和栈不可执行保护。
file一下,发现是动态链接的程序
用32位IDA打开
main函数很干净,shift+f12查看有没有/bin/sh ,是没有的,同时也没有后门函数。
子函数init里打印出了一句话
vuln函数首先printf一条语句,问我们想让程序读取几个字节的数据,然后调用了get_n函数,这个函数是程序员自己写的,我们进入此函数。
get_n函数就是读取4个字节大小的数据,当超过4个时for循环会停止,并在下一位添加"/0"。存放到nptr里。
下一个atoi函数是将字符串转为整数的标准库函数,如果字符串的开头不是数字或字符,atoi函数将停止转换并返回已解析的整数,如果字符串是空的或者无法转换,将返回0。所以它就是将我们在get_n函数里输入的字符串转化为整数。也就是nptr里的字符串转换为整数放到v1里。
如果转换的整数大于32也就是超过4个字节会printf一个语句告诉我们这个大小太大了,并结束程序运行。
然后通过puts函数告诉我给我们准备了一个gift。
只读取6个非空白字符(不包括换行符,制表符和空格),如果输入的少于6个字符,他会全部读取,如果大于6个字符,他会只读取前6个字符并丢弃剩余字符。然后将读取到的字符打印出来,这里可以进行printf的泄露。
然后再告诉我们输入v1个字节大小的数据。然后将此数据存放到nptr数组里,最后打印出来。
执行发现通过get_n输入的nptr转换为整数最大为32,所以第二个get_n函数最多接收32个字节大小的数据。gift函数里的scanf函数接收了6个字符的数据,剩下的字符还在缓冲区里,然后通过getchar可以接受一个字符(也可以是换行符,制表符和空格),剩下的字符则传输到第二个get_n函数里了。