返回到libc查找指针
对于软件安全类,我必须简单地返回到libc攻击。我成功地制作了一个perl脚本,在给定正确的system()、exit()和/bin/sh字符串指针的情况下完成了攻击。我使用gdb“p system”等找到了这些指针。现在,我想通过编写一个c程序,在运行时查找system()和exit()的地址,使利用漏洞的行为更加“动态”。我该怎么做?我尝试了“&系统”,但似乎根本没有给我正确的地址 编辑:返回到libc查找指针,c,gdb,C,Gdb,对于软件安全类,我必须简单地返回到libc攻击。我成功地制作了一个perl脚本,在给定正确的system()、exit()和/bin/sh字符串指针的情况下完成了攻击。我使用gdb“p system”等找到了这些指针。现在,我想通过编写一个c程序,在运行时查找system()和exit()的地址,使利用漏洞的行为更加“动态”。我该怎么做?我尝试了“&系统”,但似乎根本没有给我正确的地址 编辑: 系统没有启用ASLR。我认为&system将在编译时解决。您是否尝试过dlopen()和dlsym()
系统没有启用ASLR。我认为
&system
将在编译时解决。您是否尝试过dlopen()
和dlsym()
?只是一些建议,我不知道它们是否有效
编辑
如果存在某种类型的保护,它们都不会在目标进程上下文之外工作。在一些流行的Linux发行版上默认启用ASCII铠装。它通常将重要库的地址映射到包含空字节的内存范围。您可以阅读有关如何绕过ASCII铠装的更多信息您可以使用
binutils
-objdump
或readelf
轻松找到地址,但仅查找二进制实际使用的符号的地址。未使用的符号不与libc库链接
假设您想要破解ls
命令:
objdump -d `which ls` | less
您将在本节中找到:
0000000000402910 <exit@plt>:
402910: ff 25 da 89 21 00 jmpq *0x2189da(%rip) # 61b2f0 <_fini+0x208704>
402916: 68 5e 00 00 00 pushq $0x5e
40291b: e9 00 fa ff ff jmpq 402320 <_init+0x10>
0000000000 402910:
402910:ff 25 da 89 21 00 jmpq*0x2189da(%rip)#61b2f0
402916:68 5e 00 pushq$0x5e
40291b:e9 00 fa ff ff jmpq 402320
现在您有了地址:0x402910
是exit()
函数的跳转地址(如果尝试printf(“%x\n”,exit),您将得到打印的地址);
关于
system
,ls
没有使用此符号,因此您无法以这种方式访问它,因为它没有链接。如果我没有弄错的话,您正在尝试用C编写一个程序,该程序将执行并利用易受攻击的用户空间程序?在这种情况下,如果您用C编写的程序使用的是execve(),则将使用自己的进程空间启动易受攻击的进程。这将包括重新加载的libc。请这样想:
pwner
`-[libc]
`-./vuln
`-[libc]
在本例中,您的动态程序“pwner”将需要使用类似ptrace()的系统调用来跟踪易受攻击的程序并获取libc指针。GDB在调试二进制文件时也会这样做。您的程序应该使用ELF规范来查找E_条目的地址。从这里开始使用ptrace()。首先使用PTRACE\u TRACEME,然后使用PTRACE\u peek text。如果它不是库入口点,则必须在某个地方定义它。C标准要求它定义为函数,因此它必须存在于某个地方。尝试查找它。@randomusername我更新了答案-现在我确切知道如何查找函数的地址。但是,符号/函数你想要调用的二进制文件必须已经被你想要破解的二进制文件使用。否则,它不会被链接。@randomusername如果main返回,进程也会结束……没有特殊的函数……你只是用完了程序。如果没有使用符号,它就不需要在目标文件的任何地方。如果它没有被编译,你就必须使用dynam在运行时进行链接…这是一个有限的实用程序,因为程序没有使用它,而此时您已经在执行任意代码..一篇有趣的文章。感谢分享。+1