我正在尝试放置格式字符串利用程序,但尚不清楚它的工作方式。在这段代码中,我试图用我选择的地址覆盖堆栈指针。我在输入参数中发送此地址。

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函数的返回地址破坏为0x909090909040089a。我需要我的寄信人地址仅指向0x40089a。我尝试附加上述和nop\0命令,但似乎没有任何效果。请解释一下如何使它起作用。

最佳答案

如果您反汇编程序,则会在某个时候发现它:
 (1)可能会从堆栈位置加载rsp,具体取决于编译器和选项。
 (2)通过ret指令从堆栈位置加载rpc。

您需要获取在(2)中加载的值,以指向您希望其执行的代码。您的尝试似乎以argv [1]中的字符串为中心;这可能是不可能的(见下文);但是更改程序参数(或环境vars)的长度可能会更改argv [1]所在的地址。
一旦知道了这些值,就需要构造一个argv [1],用您要执行的代码的地址覆盖(2)中的位置。

(下图):某些cpus / os具有防止您执行.text部分之外的地址的机制。如果您使用的是这些架构之一,则需要反汇编程序和共享库以找到满足您所需的代码序列,然后构造argv [1]字符串以将控制权转移到该位置。

由于您只是为了踢球而做,因此请尝试关闭这些选项,否则,您要做的是做更多的工作,而增加的乐趣却很少。

关于c - 修改rsp堆栈指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48976963/

10-10 21:26