对于软件安全中的类,我必须简单地返回libc攻击。我设法制作了一个perl脚本,在给出正确的指向system(),exit()和/ bin/sh字符串的指针后完成攻击。我发现这些指针使用gdb“p系统”等。现在我想通过编写一个c程序,使其在运行时找到system()和exit()的地址,从而使漏洞更加“动态”。我该怎么做呢?我试过“&系统”,但这似乎并没有给我正确的地址。编号: 系统没有启用ASLR。返回libc查找指针
回答
你可以很容易发现利用binutils
地址 - objdump
或readelf
,但只有二进制实际使用符号的地址。未使用的符号未与libc库链接。
说你想破解的ls
命令:
objdump -d `which ls` | less
你会发现这节:
0000000000402910 <[email protected]>:
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>
所以,现在你有地址:0x402910
是exit()
功能的跳转地址(如果您尝试使用printf("%x\n", exit);
即可获得印刷品
关于system
,ls
未使用此符号,因此您无法以此方式访问它,因为它未链接。
我认为&system
将在编译时解析。你有没有试过dlopen()
和dlsym()
?只是建议,我不知道他们是否会工作。
编辑他们的
没有将目标进程上下文之外的工作,如果某种Address space layout randomization到位。
默认情况下,在某些流行的Linux发行版中启用ASCII Armoring。它通常将重要库的地址映射到包含NULL字节的内存范围。你可以阅读更多关于如何绕过ASCII铠装here.
一篇有趣的文章。感谢分享。 +1 –
如果我没有弄错,你试图用C编写一个程序来执行和利用易受攻击的用户空间程序?在这种情况下,如果你使用execve()编写的程序使用execve(),那么这将启动具有它自己的进程空间的易受攻击的进程。这将包括重新加载的libc。想想看这样的:
pwner
`-[libc]
`-./vuln
`-[libc]
在这种情况下,您的动态程序,“pwner”将需要使用类似的ptrace()系统调用跟踪漏洞程序,并获得libc的指针。这是GDB在调试二进制文件时的有效工具。您的程序应该使用ELF规范来查找E_ENTRY的地址。从这里使用ptrace()。首先使用PTRACE_TRACEME,然后使用PTRACE_PEEKTEXT。
- 1. 返回到libc - 非法指令
- 2. 查找指针
- 3. 返回指针C
- 4. 返回指针Ç
- 5. 返回alloca指针
- 6. C++返回指针
- 7. 返回类指针
- 8. 指针与返回
- 9. 返回指针数组的指针
- 10. 返回指针数组(CvSeq指针)
- 11. 返回指针数组的指针
- 12. 解析 - JavaScript指针查询,从指针返回解析对象
- 13. 有关libc指针加密的问题
- 14. C++:返回子类指针
- 15. ListCellRenderer返回空指针
- 16. wxBufferedPaintDC GetGraphicsContext返回NULL指针
- 17. 返回指针阵列
- 18. dynamic_cast返回空指针
- 19. Golang:返回指针和derefrencing
- 20. 在java中返回指针
- 21. 伪流指针返回
- 22. 函数返回指针C
- 23. Redux state.subscribe返回指针
- 24. 指针错误返回值
- 25. 返回一个指针
- 26. 函数指针返回
- 27. MediaStore.Images.Media.INTERNAL_CONTENT_URI返回空指针
- 28. 从函数返回指针
- 29. 返回指针数组?
- 30. 返回C++指针到perl
如果它不是库入口点,那么它必须在某处定义。 C标准要求它被定义为一个函数,所以它必须存在某个地方。尝试找到它。 – randomusername
@randomusername我更新了我的答案 - 现在我确切知道如何找到函数的地址。但是,**您要调用的符号/函数必须已被您要破解的二进制文件使用。**否则,它不会被链接。 – TMS
@randomusername一个进程也将结束,如果main返回...没有特殊的功能...你刚用完程序。如果一个符号没有被使用,它不需要在任何地方的目标文件中。如果它没有被编译,你将不得不在运行时动态链接......这是有限的实用工具,因为该程序没有使用它,并且你已经在那个时候执行了任意代码。 –