Intro

在没有输出函数下,在norelro/partial relro情况下通常会考虑ret2dlresolve来实现”无中生有”的攻击。

norelro 挟持str表 → no relro版本

partial relro(leak) 伪造整个linkmap → partial_relero

partial relro(no leak) 伪造整个linkmap → onlyread

而在full relro情况下,没法使用LD的攻击(找不到入口了),这种情况也有一种比较极端的解法

stack_overflow爆破利用

通过爆破bss段下与libc有关的指针为ORW函数/SYSCALL来完成利用,但是需要爆破2.5bytes

ret2libc_start_main 方法相对上述方法来说利用更加稳定,而且利用链比较清晰,利用需要具备栈迁移能力,同时需要从main函数到漏洞点处rbx 指向可控内存

Details

利用思路

libc_start_main 函数里实际上有两个地方会调用_dl_debug 函数向stderr打印log字符串,默认情况下是走不到那里的,而当我们能跳转到那里之后,如果栈帧合适(libc_start_main会从栈里面取main函数指针并调用call_main函数),则有可能实现leak + ret2main

分析-从start到main

先来看程序是如何一步步走到main函数的

startlibc_start_maincall_mainmain

所以在main 函数里你能看到之前遗留的多个栈帧

way2main.png

可以看到这里有很多main函数指针,这些指针是这些函数用来调用main的,最后跑到main函数里执行

分析-libc_start_main的一些机会