我有一段代码只有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参数。退出功能在运行时没有任何离开/返回指令?因为“正好”在主要之外的框架的保存 - 被覆盖了!
答案 0 :(得分:2)
exit
函数未返回。它调用用atexit()
定义的函数,进行一些清理,并通过使用函数0 (EXIT)
调用Linux来终止该过程。
使用return 1
/ return 0
代替exit(1)
/ exit(0)
,如果您想查看EIP
之后main()
发生了什么结束。