0
我有兩個不同的二進制文件以及他們main
功能反彙編,像這樣開頭:x86彙編棧佈局混亂
80483d4: 55 push %ebp
80483d5: 89 e5 mov %esp,%ebp
80483d7: 83 e4 f0 and $0xfffffff0,%esp
80483da: 83 ec 20 sub $0x20,%esp
80483dd: 8d 45 08 lea 0x8(%ebp),%eax
80483e0: 89 44 24 1c mov %eax,0x1c(%esp)
而另外一個是這樣的:
80483d4: 8d 4c 24 04 lea 0x4(%esp),%ecx
80483d8: 83 e4 f0 and $0xfffffff0,%esp
80483db: ff 71 fc pushl -0x4(%ecx)
80483de: 55 push %ebp
80483df: 89 e5 mov %esp,%ebp
...
80483e6: 89 4d f0 mov %ecx,-0x10(%ebp)
第一個是下編譯GNU/Linux 2.6.24,第二個是在GNU/Linux 2.6.9下編譯的。大部分時間,我理解爲0x4(%esp)
作爲返回地址,0x8(%esp)
作爲第一個參數。顯然,第一個二進制使用0x8(%ebp)
- 它與0x8(%esp)
在對齊發生之前相同 - 作爲第一個參數,而第二個二進制使用0x4(%esp)
作爲第一個參數,它讓我感到困惑,爲什麼它做到了。這是因爲它們是在不同版本的GNU/Linux下編譯的?
等待...我仍然失去了x(所以如何來esp + 4指出第一個參數,然後.....啊ebp被推了!!!!!!我明白了,我不知道爲什麼我錯過了這一點!我有多愚蠢 – REALFREE