在没有输出函数下,在norelro/partial relro情况下通常会考虑ret2dlresolve来实现”无中生有”的攻击。
norelro 挟持str表 → no relro版本
partial relro(leak) 伪造整个linkmap → partial_relero
partial relro(no leak) 伪造整个linkmap → onlyread
而在full relro情况下,没法使用LD的攻击(找不到入口了),这种情况也有一种比较极端的解法
通过爆破bss段下与libc有关的指针为ORW函数/SYSCALL来完成利用,但是需要爆破2.5bytes
…
ret2libc_start_main
方法相对上述方法来说利用更加稳定,而且利用链比较清晰,利用需要具备栈迁移能力,同时需要从main函数到漏洞点处rbx
指向可控内存
libc_start_main
函数里实际上有两个地方会调用_dl_debug
函数向stderr打印log字符串,默认情况下是走不到那里的,而当我们能跳转到那里之后,如果栈帧合适(libc_start_main
会从栈里面取main
函数指针并调用call_main
函数),则有可能实现leak + ret2main
先来看程序是如何一步步走到main函数的
start
→libc_start_main
→call_main
→main
所以在main
函数里你能看到之前遗留的多个栈帧
可以看到这里有很多main函数指针,这些指针是这些函数用来调用main的,最后跑到main函数里执行