在主要功能:如何做EBP值的變化在此函數
0x08049230 <+0>: push %ebp
0x08049231 <+1>: mov %esp,%ebp
0x08049233 <+3>: sub $0x28,%esp
0x08049236 <+6>: movl $0xdeadbeef,-0xc(%ebp)
0x0804923d <+13>: call 0x8048ed4 <getbuf>
0x08049242 <+18>: mov -0xc(%ebp),%edx
在getbuf功能:
0x08048ed4 <+0>: push %ebp
0x08048ed5 <+1>: mov %esp,%ebp
0x08048ed7 <+3>: sub $0x28,%esp
0x08048eda <+6>: lea -0x14(%ebp),%eax
0x08048edd <+9>: mov %eax,(%esp)
0x08048ee0 <+12>: call 0x8048de4 <Gets>
0x08048ee5 <+17>: mov $0x1,%eax
0x08048eea <+22>: leave
0x08048eeb <+23>: ret
基本上主要功能使用%EBP-位於0xC檢查損壞的堆棧。
在getbuf函數中,lea -0x14(%ebp),%eax爲輸入字符串分配20個字節。
如果我提供了24個字節,$ ebp將被覆蓋。我不確定爲什麼getbuf中的ebp更改會影響主函數中的ebp值。
我知道$ ebp會壓入堆棧。當getbuf返回時,$ ebp將從堆棧彈出。主函數中的$ ebp是否從getbuf接收$ ebp?
我也做了一些測試。我的輸入字符串是aaaabbbbccccddddeeee,它是24個字節。我在0x08049242 < +18>:mov -0xc(%ebp),%edx中設置了一箇中斷點,然後打印$ ebp,但這不是eeee的十六進制表示。我注意到存儲在$ ebp中的值確實發生了變化。如果輸入小於20字節,則值爲0xbffff6c8。如果輸入是24個字節,則其值變爲0xb7fd0ac0。
任何人都可以解釋它是如何改變的,主函數中的$ ebp如何知道gebuf函數中$ ebp的值?
謝謝
堆棧幀讀了起來,e.g https://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames – MicroVirus