附:gcc -O0 -fno-stack-protector lab2B.c -o lab2B
编译的时候开启栈保护,即栈不可执行(NX)
./lab2C:
查看源码,可以发现是一个很简单的堆栈溢出,我们在进行调试的时候可以发现set_me与buf的局部变量地址时连续的,由于在strcpy函数复制的时候没有进行边界分析,导致可以通过给buf赋值的时候,覆盖set_me的值。
由于是一个需要设置程序运行参数,所以需要在gdb中设置参数:
set args 可指定运行时参数。(如:set args 10 20 30 40 50) show args 命令可以查看设置好的运行参数。
其中注意在字符填充时候是小端的方式,在内存之中set_me的位置在buf的位置之上,将buf覆盖之后将吧set_me的值给覆盖。
有一个小技巧:可以使用linux下的xargs命令,使用前一个命令的输出作为参数:
./lab2B:
查看源码,发现一个没有使用的system与字符串“/bin/sh”,观察源码分析后得到思路:我们可以使用覆盖的方式,将strcpy的返回地址给覆盖,也就是返回时到达system的函数中,并且调用字符串:
为了确定使用正确的对策,需要分析一下程序的安全防护情况(使用工具checksec),在栈执行保护(NX)或地址随机化(canary)时,采用的方式是不一样的,可以发现程序开启了栈不可执行的保护:
查看合适的字符串(searchmem /bin/sh):
./lab2A的安全防护设置与B一致
进行比较源码与汇编指令可以发现[ebp-0x18]里存的是locals.cat_pointer(也就是cat_buf的起始位置),[ebp-0x28]里存的是输入的字符的首地址,对于buf的大小为12,但是读入的时候可以读取0x10(即16个字节),刚好可以覆盖到locals.cat_pointer
网友评论