首页 > 试题广场 >

阅读如下C代码片段(其中Y表示代码指令地址):Y1:void

[单选题]
阅读如下C代码片段(其中Y表示代码指令地址):
void overflow(char* pShellcode, int iLen) {
Y1:char buffer[8];
Y2: memcpy(buffer, pShellcode, dwLen); 
Y3: „„
}
Y4: int main() {
Y5: „„
Y6: overflow("123456789123456789",18);
Y7: „„ 
}
main主程序调用执行overflow函数后,指令指针指向()
  • Y3
  • Y7
  • 0x34353637
  • 0x37363534
这个题有点变态啊…… 此题考察的是对栈的理解,overflow函数内部声明的局部变量buffer[8]其容量为1个字节,然后调用memcpy进行拷贝。main函数中调用时输入的拷贝长度为18,超过了buffer的预设长度,栈空间被覆盖,overflow函数调用完成后无法顺利回到main函数(这题计算量好大,放弃了)。不过有个问题,32位系统的参数传入是依靠push stack,而64位是依靠register,所以这个题emmmmm
发表于 2020-09-02 15:37:34 回复(1)
这道题不是很严谨, 这里先加一些前提: 
1. 32bit系统, int 4B, 指针4B
2.  小端存储
然后看栈帧变化, 
高字节地址, 向低字节地址移动↓
== main 栈帧 == ======
... 前面一些不重要的分配..

----开始调用overflow------
传参 (int) 18 4B
----------------------------------
传参 18B 的字符串
9
...
1
----------------------------------
返回地址 4B
----------------------------------
=====================
===overflow的栈帧======
4B: 保存mian函数的EBP 后面要恢复
新 EBP = ESP, 指向该处
------------------------------------
局部变量 buffer 8B
----------------------------------最终ESP指向此处
======================

开始拷贝:  
8
...
1  前8个字符8B占用, 由于小端, 下面是低地址, 所以排列是向上的, 
所以字符9123 会放到 存旧EBP的位置(4B)
那么同理 放到返回地址的字符就是 小地址->大: 字符4567
由于小端, 所以返回地址是 字符的7654
字符的7654写成十六进制就是
ox37363534

发表于 2022-03-20 12:22:42 回复(0)
(32位系统)栈帧的结构为   局部变量(8byte)+ EPB(4byte) + Return Addr(4 byte) + 入参(从右到左  8byte)
出栈时  12345678 没有问题  9123 覆盖EPB 4567覆盖了 Return Addr 按照小端来计算 地址是 ‘7’‘6’‘5’‘4’= 0x3736353
发表于 2021-12-09 08:17:43 回复(1)
发表于 2022-04-23 21:33:31 回复(1)
高地址 push main函数的ebp 4bytes


push 局部变量(无) 0


push para2: 18 4bytes


push para1: "123456789123456789" 18bytes


push 返回地址(下一条指令) Y7 4bytes
7
6
5
4
当前Y7 = 7654

call overflow



push overflow 的ebp 4bytes
3
2
1
9

push overflow的局部变量 buf[8] 8bytes
8
7
6
5
4
3
2
1


push memcpy的参数para3 iLen 4bytes


push memcpy的para2  *pShellcode 4bytes


push memcpy的para1 buf     4bytes


push 返回地址 Y3 4bytes


call memcpy



push memcpy 的 ebp 4bytes

低地址 push memcpy的局部变量








发表于 2022-12-12 18:04:44 回复(0)
脑壳胀🙉
发表于 2023-08-28 23:21:44 回复(0)