Crispin Cowan wrote:

> I presume that what you're doing here is to mark the library pages
> non-executable, and then make them executable when you get a page fault due to
> some code trying to make a library call.  If so, how do you distinguish between
> legitmate calls into the library, and bogus calls made by a buffer overflow?

No, because there is no exec/noexec flag on x86 architecture - otherwise
the whole thing would be trivial.

I map a sort of ´zombie´ or ´ghost´ libc into the RSX address space,
marking those pages as PROT_NONE. I also map a regular copy of libc at
some other location.

There are further transition handlers in the gp() and pf() trap code
handling the segment transitions between ´normal´ code and ´libc´ code
(the mentioned ret/call/jmp emulation routines).
 
> "ret-into-libc" is just a common name for the technique.  It is not technically
> precise.  The general case is to change a function return address so that it
> jumps to code that does "exec(sh)".  The intructions that do this don't have to
> be in libc, and don't have to be in a library, they can be in the program's main
> executable body.  It's just convenient for the attacker to use libc, because libc
> necessarily has "exec(sh)" in it, and most programs link to libc.

Ok but I´m talking only about dynamically linked libc.

> > So now assume we doesn't link the libc-plt to the real libc location -
> 
> Same effect:  you deny the attacker access to the libc code body, forcing them to
> look elsewhere for a fairly common sequence of a half dozen bytes in an
> executable page.

Hm, I´m not convinced that this code is so common. One must look for a
sequence similar to mov value, %ebx; mov SYSCALL, %eax; int 0x80; in
order to do something dangerous after overflowing a stack buffer.
 
I think that some level of randomization in the libc location and the
plt linking code would provide a simple (but not complete) defense
against simple jump-into-system()-plt and similar attack.

Paul Starzetz.

Reply via email to