我正在学习缓冲区溢出是如何工作的,并且遇到了一些我不理解的事情。
我试图通过缓冲区溢出更改函数指针的地址,并将参数传递给从Perl脚本运行的可执行文件。我的问题是,为什么Perl似乎从右到左阅读我的地址论点?
的Perl:
$arg = "AAAAAAAAAA"."\x40\x11\xc4"; //string with address to malicious test function
$cmd = "./bo_test ".$arg;
system($cmd);
输入的地址是打印输出时该功能的确切地址。但是,为了通过溢出调用测试函数,我需要输入“\ xc4 \ x11 \ x40”。
如果我指向C中的地址,它会接受我期望的输入:
//call function based on address pointer_fn
desired_fn = ( void (*)())0x4011c4; //when run desired_fn runs the malicious test method
有人可以解释为什么Perl这样做(或者我做错了导致它)?
如果有帮助,我使用strcopy()复制参数并在我的exe中启动溢出。
答案 0 :(得分:6)
假设你有一个字符串:
char* s = "\x40\x11\xc4";
如果您有一个3字节大小的整数类型,并且您希望将字符串的内容视为3字节整数,则可以使用:
the_int_type* p = (the_int_type*)s;
在小端系统中,*p
的值为:
0x40 + (0x11 >> 8) + (0xc4 >> 16)
在大端系统中,将是:
(0x40 >> 16) + (0x11 >> 8) + 0xc4
根据您描述的行为判断,您有一个小端系统。