c - 论据从右到左阅读

标签 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 中启动溢出。

最佳答案

假设你有一个字符串:

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/

相关文章:

c - 套接字在recv之前关闭而不调用close

Perl 模块安装

html - 如何从 HTML 链接中提取 HREF 值?

mysql - 在单个 MySQL 查询中更新多个列是否有限制?

c - 良好的实践和内存泄漏

c - 如何使用另一个函数的参数调用一个函数?

linux - 从 cron 运行时,Perl 脚本不会将 STDOUT 输出到文件

regex - 一个简单的Perl正则表达式保证永远不会匹配字符串?

c++ - 构建小型中小企业客户端的未定义引用

c - malloc 不存在的物理地址错误