论证从右到左阅读

时间:2014-09-29 01:06:19

标签: c perl

我正在学习缓冲区溢出是如何工作的,并且遇到了一些我不理解的事情。

我试图通过缓冲区溢出更改函数指针的地址,并将参数传递给从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中启动溢出。

1 个答案:

答案 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

根据您描述的行为判断,您有一个小端系统。