我正在学习缓冲区溢出的工作原理并遇到了一些我不理解的问题。
我正在尝试通过缓冲区溢出更改函数指针的地址,并将参数传递到从 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 中启动溢出。
最佳答案
假设你有一个字符串:
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
从您所描述的行为来看,您有一个小端系统。
关于c - 论据从右到左阅读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26091236/