The next task is to set up signal handlers from assembly.

That's not too difficult. From your guide, it looks like you've got it mostly figured out already.

  %idefine sys_signal 48
  %idefine SIG_SEGV 11

  mov eax, sys_signal
  mov ebx, SIG_SEGV
  mov ecx, signal_handler
  int 0x80

  signal_handler
    printf "We crashed!!!\n";
  ret

Well, actually, you wouldn't want to return with SIG_SEGV, but...as long as you don't re-register the handler, I imagine returning would terminate your program.

One thing you have to keep in mind that I didn't see in your guide is that you have to re-register the signal hander every time the signal gets called. Also, if your program recieves a signal that it doesn't have a handler set up for it will be terminated "kill -9" style.

The real trick is figuring out the register contents at the time of the crash.

  pushfd; pop dword [r.flags]; cld
  mov eax, [esp + 13 * 4]; mov [r.eax], eax
  mov eax, [esp + 10 * 4]; mov [r.ebx], eax
  mov eax, [esp + 12 * 4]; mov [r.ecx], eax
  mov eax, [esp + 11 * 4]; mov [r.edx], eax
  mov eax, [esp +  7 * 4]; mov [r.esi], eax
  mov eax, [esp +  6 * 4]; mov [r.edi], eax
  mov eax, [esp +  8 * 4]; mov [r.ebp], eax
  mov eax, [esp +  9 * 4]; mov [r.esp], eax
  mov eax, [esp + 16 * 4]; mov [r.eip], eax

Since I'm using pushfd, I guess I didn't find the flags saved anywhere.

Took me a while to figure that out. There's another set of registers on the stack in front of that set, but they aren't the right ones, and where they come from, I have no idea. I also have no idea if that works on any kernel other than my own.

I'll have to have a look at that third argument to the signal handler some time, if it points to where I'm getting the registers from now, then I'll go ahead and use it.
-
To unsubscribe from this list: send the line "unsubscribe linux-assembly" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to