2013-12-21 35 views
12

对于软件安全中的类,我必须简单地返回libc攻击。我设法制作了一个perl脚本,在给出正确的指向system(),exit()和/ bin/sh字符串的指针后完成攻击。我发现这些指针使用gdb“p系统”等。现在我想通过编写一个c程序,使其在运行时找到system()和exit()的地址,从而使漏洞更加“动态”。我该怎么做呢?我试过“&系统”,但这似乎并没有给我正确的地址。编号: 系统没有启用ASLR。返回libc查找指针

回答

6

你可以很容易发现利用binutils地址 - objdumpreadelf,但只有二进制实际使用符号的地址。未使用的符号未与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> 

所以,现在你有地址:0x402910exit()功能的跳转地址(如果您尝试使用printf("%x\n", exit);即可获得印刷品

关于systemls未使用此符号,因此您无法以此方式访问它,因为它未链接。

+0

如果它不是库入口点,那么它必须在某处定义。 C标准要求它被定义为一个函数,所以它必须存在某个地方。尝试找到它。 – randomusername

+0

@randomusername我更新了我的答案 - 现在我确切知道如何找到函数的地址。但是,**您要调用的符号/函数必须已被您要破解的二进制文件使用。**否则,它不会被链接。 – TMS

+0

@randomusername一个进程也将结束,如果main返回...没有特殊的功能...你刚用完程序。如果一个符号没有被使用,它不需要在任何地方的目标文件中。如果它没有被编译,你将不得不在运行时动态链接......这是有限的实用工具,因为该程序没有使用它,并且你已经在那个时候执行了任意代码。 –

0

我认为&system将在编译时解析。你有没有试过dlopen()dlsym()?只是建议,我不知道他们是否会工作。

编辑他们的

没有将目标进程上下文之外的工作,如果某种Address space layout randomization到位。

2

默认情况下,在某些流行的Linux发行版中启用ASCII Armoring。它通常将重要库的地址映射到包含NULL字节的内存范围。你可以阅读更多关于如何绕过ASCII铠装here.

+0

一篇有趣的文章。感谢分享。 +1 –

2

如果我没有弄错,你试图用C编写一个程序来执行和利用易受攻击的用户空间程序?在这种情况下,如果你使用execve()编写的程序使用execve(),那么这将启动具有它自己的进程空间的易受攻击的进程。这将包括重新加载的libc。想想看这样的:

pwner 
`-[libc] 
`-./vuln 
    `-[libc] 

在这种情况下,您的动态程序,“pwner”将需要使用类似的ptrace()系统调用跟踪漏洞程序,并获得libc的指针。这是GDB在调试二进制文件时的有效工具。您的程序应该使用ELF规范来查找E_ENTRY的地址。从这里使用ptrace()。首先使用PTRACE_TRACEME,然后使用PTRACE_PEEKTEXT。