为什么这不能用exit函数来利用

时间:2013-12-30 02:41:06

标签: c gdb stack buffer-overflow

我有一段代码只有strcpy() argv1在一个100字节长的缓冲区中。之后我将测试目的放在exit(0)或exit(1)函数中。没有其他用过。我从gdb得到的是以下

 (gdb) i r eip
 eip            0x8048455   0x8048455 <main+65>
 (gdb) info frame
 Stack level 0, frame at 0xbffff260:
eip = 0x8048455 in main (exploitable.c:9); saved eip 0x41414141
source language c.
Arglist at 0xbffff258, args: argc=1094795585, argv=0xbffff304
 Locals at 0xbffff258, Previous frame's sp is 0xbffff260
 Saved registers:
 ebp at 0xbffff258, eip at 0xbffff25c
(gdb) i r eip
eip            0x8048455    0x8048455 <main+65>
(gdb) c
Continuing.
[Inferior 1 (process 2829) exited normally]

由于保存的eip是0x41414141,为什么在离开当前堆栈之后执行会转到无效的0x41414141地址?肯定它与退出功能有关,但我无法理解:/

我知道解释是在以下代码中,但我无法得到它

   => 0x08048455 <+65>: mov    DWORD PTR [esp],0x0
   0x0804845c <+72>:    call   0x8048350 <exit@plt>

最后一行意味着执行转到exit函数并且我不确定0x08040455行显示传递给exit函数的0参数。退出功能在运行时没有任何离开/返回指令?因为“正好”在主要之外的框架的保存 - 被覆盖了!

1 个答案:

答案 0 :(得分:2)

exit函数未返回。它调用用atexit()定义的函数,进行一些清理,并通过使用函数0 (EXIT)调用Linux来终止该过程。

使用return 1 / return 0代替exit(1) / exit(0),如果您想查看EIP之后main()发生了什么结束。