我正在尝试放置一个格式字符串漏洞,但目前还不清楚它是如何工作的。在这段代码中,我试图用我选择的地址覆盖堆栈指针。我在输入参数中发送此地址。
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
,但似乎没有任何效果。请详细说明如何使其发挥作用。
答案 0 :(得分:1)
如果你反汇编你的程序,你会发现它在某些时候: (1)可能从堆栈位置加载rsp,具体取决于编译器和放大器。选项。 (2)通过ret指令从堆栈位置加载rpc。
您需要获取(2)中加载的值以指向您希望它执行的代码。你的尝试似乎集中在argv [1]中的字符串;这可能是不可能的(见下文);但是更改程序参数(或环境变量)的长度可能会更改argv [1]所在的地址。 一旦你知道这些值,就需要构造一个argv [1],用你想要执行的代码的地址覆盖(2)中的位置。
(下面):某些cpus / os有一种机制可以阻止你在.text部分之外执行地址。如果您使用其中一种体系结构,则需要反汇编程序和共享库以查找执行所需操作的代码序列,然后构造argv [1]字符串以将控制权转移到此位置。
因为你只是为了踢,所以试着关闭这些选项,否则你想要做的就是为了增加快乐而做更多的工作。