从缓冲区指针计算堆栈中的返回地址
Calculating return addr in stack from a buffer pointer
我正试图粉碎堆栈,并试图从下面的链接中读取SHELL:http://insecure.org/stf/smashstack.html我正在发送arglen neg,并成功地粉碎堆栈,代码给出了segfault。但我无法计算RET地址,我应该把SHELL代码放在那里。因此,在该距离之后的缓冲区中,我将放入SHELL代码。
int foo(char* arg, short arglen)
{
char buffer[8];
short maxlen = 8;
int len;
if (arglen < maxlen)
{
len = strlen(arg);
printf("arglen =%d, buf size =%dn", arglen, len);
strncpy(buffer, arg, len);
}else
printf("foo finished. Everything is normal.n");
return 0;
}
上述代码的info frame
O/p将断点置于strncpy:中
(gdb) info frame
Stack level 0, frame at 0xffffc740:
eip = 0x804854a in foo (target.c:17); saved eip = 0x804864f
called by frame at 0xff80cd13
source language c.
Arglist at 0xffffc738, args: arg=0xffffc750 "1300Ph//shh/bin211343PS211ᙰv̀", arglen=-32549
Locals at 0xffffc738, Previous frame's sp is 0xffffc740
Saved registers:
ebp at 0xffffc738, eip at 0xffffc73c
(gdb)
如何从buffer
地址计算返回地址?
[编辑]
12345%nx90x90x90x90...x90x90SHELLCODE
像这样,我想把我的缓冲内存
调用汇编指令将指令指针推送到堆栈上,然后将调用指令中的地址放在指令指针中。正常功能条目如下:
push bp
mov bp, sp
sub sp, n ; n is the number of bytes for the local variables.
从上到下的堆栈现在看起来像:
arglen
arg
ret
bp
buffer
Buffer是第一个局部参数。那么buffer+8+sizeof(void*)就是返回地址的位置
相关文章:
- 返回地址上的WriteProcessMemory
- 在字符串函数的指针中返回地址
- 英特尔 Pin:如何获取系统调用的返回地址
- 如何使用C 给出的地址覆盖汇编器堆栈的返回地址
- 指针不起作用,返回地址不是值
- Linux x64堆栈在信号处理程序内部展开,以修改返回地址
- 如何在函数中获取函数返回地址
- CPP - 使用 * 或 & 返回地址
- 我真的返回地址或参考临时吗?
- 从缓冲区指针计算堆栈中的返回地址
- 堆栈上的线程返回地址是什么
- 运算符 new[] 的返回地址与数组的实际地址之间的差异
- 这些本地函数的返回地址之间有什么区别
- 同时返回地址和值的函数
- 从std::vector::operator[]获取返回地址做什么
- 在返回地址之前清空指针
- 如何找出在 c++ 中更改函数返回地址的原因
- 局部变量的返回地址和程序仍然有效
- 返回地址在C
- 当操作符地址可以设置为普通变量时,为什么要求从函数返回地址?