In cases where all the libraries support ASLR, writing an exploit is much harder. The known technique for this is chaining multiple vulnerabilities. For example, one vulnerability will be responsible for information disclosure and another for memory corruption. The information disclosure vulnerability could leak an address of a module that helps reconstruct the ROP chain based on that address. The exploit could contain a ROP chain comprised of just RVAs (relative addresses without the ImageBase values) and exploit the information disclosure vulnerability on the fly to leak the address and reconstruct the ROP chain in order to execute the shellcode. This type of exploits is more common in scripting languages, for example, targeting vulnerabilities that are exploited using JavaScript. Using the power of this scripting language, the attacker is able to construct the ROP chain on the target machine.
An example of...