修改rsp堆栈指针

时间:2018-02-25 18:30:24

标签: c gdb printf string-formatting

我正在尝试放置一个格式字符串漏洞,但目前还不清楚它是如何工作的。在这段代码中,我试图用我选择的地址覆盖堆栈指针。我在输入参数中发送此地址。

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 个答案:

答案 0 :(得分:1)

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

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

(下面):某些cpus / os有一种机制可以阻止你在.text部分之外执行地址。如果您使用其中一种体系结构,则需要反汇编程序和共享库以查找执行所需操作的代码序列,然后构造argv [1]字符串以将控制权转移到此位置。

因为你只是为了踢,所以试着关闭这些选项,否则你想要做的就是为了增加快乐而做更多的工作。