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