我正在尝试放置一个格式字符串漏洞,但不清楚这是如何具体工作的。在这段代码中,我试图用我选择的地址覆盖堆栈指针。我在一个输入参数中发送这个地址。
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命令,但似乎都不起作用。请解释一下如何让它工作。
发布于 2018-02-26 06:35:35
如果你反汇编你的程序,你会发现在某些时候:(1)可能会从堆栈位置加载rsp,这取决于编译器和选项。(2)通过ret指令从堆栈位置加载rpc。
您需要获取(2)中加载的值,以指向您希望它执行的代码。您的尝试似乎集中在argv1中的字符串上;这可能是不可能的(见下文);但是更改程序参数(或环境变量)的长度可能会更改argv1所在的地址。一旦你知道了这些值,你需要构造一个argv1,用你想要执行的代码的地址重写(2)中的位置。
(下图):一些cpus/os有一种机制,可以防止您执行.text区段以外的地址。如果您使用的是这些体系结构之一,则需要反汇编程序和共享库,以找到执行所需操作的代码序列,然后构造argv1字符串以将控制权转移到此位置。
既然你这样做只是为了好玩,试着关闭那些选项,否则你想做的是更多的工作,而不是增加一点快乐。
https://stackoverflow.com/questions/48976963
复制相似问题