程序陷入StrnCpy时,堆栈情况:
内存映像
/------------\ 内存低地址
| |
| ... ... |<- esp此处,此时在strncpy函数内
| |
|------------|<- ebp此处
|EBP(*1) |
|------------|
|RET(*1) |
|------------|
| *fname |
|------------|
| *pname |
|------------| strncpy()堆栈帧
| namelen |
|------------| -------------------
| ... ... |
|------------|
| fname[0] |
|------------|
| ... ... |
| |
|------------|
| fname[1023]|
|------------|
| ... ... |
|------------|
| EBP(*2) |
|------------|
| RET |
|------------|
| *conn | call_trans2open()堆栈帧
|------------|
| ...其他参数|
|------------| ------------------
| ... ... | 上层函数堆栈帧
| | ------------------
\------------/ 内存高地址
(gdb) x/5wx $ebp
0xbffff438: 0xbffff8f8 0x0806b405 0xbffff4e0 0x081c2234
0xbffff448: 0x00000425
0xbffff4e0就是fname的地址,而0xbffff8f8就是上层基栈指针地址,我们需要覆盖的EIP地址即0xbffff8f8 + 4。Fname与EBP之间相差0xbffff8f8 – 0xbffff4e0 = 0x418(1048)字节。