我需要为一个软件安全课程制作一个简单的回归libc攻击。我成功地编写了一个perl脚本,只要给出正确的system()、exit()和/bin/sh字符串指针,就能完成攻击。我使用gdb "p system"等命令找到这些指针。现在,我想通过编写一个C程序,在运行时查找system()和exit()的地址,使攻击变得更加"动态"。我该如何做?我尝试了"&system",但它似乎并没有给我正确的地址。
编辑: 系统没有启用ASLR。
您可以使用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>
现在你有了地址:0x402910
是exit()
函数的跳转地址(如果你尝试printf("%x\n", exit);
,你将得到它打印出来的值)。
关于system
,ls
没有使用这个符号,所以你不能通过这种方式访问它,因为它没有链接。
如果我没理解错的话,你正在尝试用C语言编写一个程序,来执行和利用一个有漏洞的用户空间程序?在这种情况下,如果你的C语言程序使用了execve()函数,那么它将会启动一个带有自己进程空间的有漏洞的进程。这将包括重新加载的libc库。可以这样想:
pwner
`-[libc]
`-./vuln
`-[libc]
一些流行的Linux发行版默认启用了ASCII Armoring。它通常将重要库的地址映射到包含NULL字节的内存范围中。您可以在此处了解有关如何绕过ASCII Armoring的更多信息。