Toot

Written by Will Dormann on 2025-01-17 at 22:32

In a simple world, our CALL [ EAX + 0x48 ] (as outlined by watchTowr) would call to an address that's under our control and we get control of EIP. However I didn't find something so easy. I even poked around at partial overwrites, which would make ASLR completey irrelevant. But no such luck there.

But Stephen does something clever here where this CALL goes a location in libdsplibs.so. The bytes at this address happen to decode to an x86 PUSHF instruction, but that's a red herring. This gadget is in a non-executable segment of memory, which will trigger a SIGSEGV. And normally this would be game over.

HOWEVER, at this point even after the access violation in our gadget, the program flow continues at a massive jump table postamble. Why? The Ivanti code sets up a signal handler to handle SIGSEGVs and attempt to keep on chugging, which is quite courteous to attackers.

At the point of the RET at the end of a jump table postamble, our specially-crafted buffer controls exactly where we go next. At this point, we have full control of EIP, so we're good to ROP away as usual!

=> View attached media | View attached media | View attached media | View attached media

=> More informations about this toot | View the thread | More toots from wdormann@infosec.exchange

Mentions

Tags

Proxy Information
Original URL
gemini://mastogem.picasoft.net/toot/113846067307993121
Status Code
Success (20)
Meta
text/gemini
Capsule Response Time
256.217687 milliseconds
Gemini-to-HTML Time
1.004901 milliseconds

This content has been proxied by September (3851b).