修改 rsp 堆栈指针
Modifying the rsp stack pointer
我正在尝试放置一个格式字符串漏洞利用程序,但不清楚它究竟是如何工作的。在这段代码中,我试图用我选择的地址覆盖堆栈指针。我在输入参数中发送这个地址。
int main(int argc, char* argv[])
{
cout<<"In main"<<endl;
char outbuf[10];
char buffer[10];
sprintf (buffer, "%4s", argv[1]);
sprintf (outbuf, buffer);
return 0;
}
现在,在 gdb 中传递 run "``python -c "print '%24d' + '\x9a\x08\x40\x00\x90\x90\x90\x90\x90\x90ABCDEFGHIJJKLMNOPQRST'"``"
时,我能够将 main
函数的 return 地址损坏为 0x909090909040089a
。不过,我需要我的 return 地址才能指向 0x40089a
。我试过像上面那样附加 nop
命令和 [=16=]
但似乎没有任何效果。请解释如何进行这项工作。
如果你反汇编你的程序,你会发现在某些时候它:
(1) 可能会从堆栈位置加载 rsp,具体取决于编译器和选项。
(2) 通过 ret 指令从堆栈位置加载 rpc。
您需要获取在(2)中加载的值,以指向您希望它执行的代码。您的尝试似乎以 argv[1] 中的字符串为中心;这可能是不可能的(见下文);但是改变程序参数(或环境变量)的长度可能会改变 argv[1] 所在的地址。
知道这些值后,您需要构造一个 argv[1],over-writes (2) 中的位置以及您要执行的代码的地址。
(下):一些 cpus/os 有一种机制可以防止您执行 .text 部分之外的地址。如果您使用的是其中一种架构,则需要反汇编程序和共享库以找到执行所需操作的代码序列,然后构建 argv[1] 字符串以将控制权转移到此位置。
既然你只是为了好玩而这样做,请尝试关闭这些选项,否则你想要做的是做更多的工作而增加的乐趣很少。
我正在尝试放置一个格式字符串漏洞利用程序,但不清楚它究竟是如何工作的。在这段代码中,我试图用我选择的地址覆盖堆栈指针。我在输入参数中发送这个地址。
int main(int argc, char* argv[])
{
cout<<"In main"<<endl;
char outbuf[10];
char buffer[10];
sprintf (buffer, "%4s", argv[1]);
sprintf (outbuf, buffer);
return 0;
}
现在,在 gdb 中传递 run "``python -c "print '%24d' + '\x9a\x08\x40\x00\x90\x90\x90\x90\x90\x90ABCDEFGHIJJKLMNOPQRST'"``"
时,我能够将 main
函数的 return 地址损坏为 0x909090909040089a
。不过,我需要我的 return 地址才能指向 0x40089a
。我试过像上面那样附加 nop
命令和 [=16=]
但似乎没有任何效果。请解释如何进行这项工作。
如果你反汇编你的程序,你会发现在某些时候它: (1) 可能会从堆栈位置加载 rsp,具体取决于编译器和选项。 (2) 通过 ret 指令从堆栈位置加载 rpc。
您需要获取在(2)中加载的值,以指向您希望它执行的代码。您的尝试似乎以 argv[1] 中的字符串为中心;这可能是不可能的(见下文);但是改变程序参数(或环境变量)的长度可能会改变 argv[1] 所在的地址。 知道这些值后,您需要构造一个 argv[1],over-writes (2) 中的位置以及您要执行的代码的地址。
(下):一些 cpus/os 有一种机制可以防止您执行 .text 部分之外的地址。如果您使用的是其中一种架构,则需要反汇编程序和共享库以找到执行所需操作的代码序列,然后构建 argv[1] 字符串以将控制权转移到此位置。
既然你只是为了好玩而这样做,请尝试关闭这些选项,否则你想要做的是做更多的工作而增加的乐趣很少。