我几乎可以肯定它是暂停的,因为shellcode应该打印一个字符串。而不是程序挂起
我将自己应用程序中的返回地址覆盖为我自己的shellcode。 jmp 0x7fffffffdbc7
是它遇到的第一条指令。
在它跳转到0x7fffffffdbc7后,它调用第一条指令正下方的地址,该指令应该递减堆栈,然后将位于0x7fffffffdbcc的字符串推到顶部,然后将控制流设置为0x7fffffffdbb2(而不是返回地址我按下了地址字符串)
(gdb) x/20i $rip
=> 0x7fffffffdbb0: jmp 0x7fffffffdbc7
0x7fffffffdbb2: pop rcx
0x7fffffffdbb3: xor eax,eax
0x7fffffffdbb5: mov al,0x4
0x7fffffffdbb7: xor ebx,ebx
0x7fffffffdbb9: inc ebx
0x7fffffffdbbb: xor edx,edx
0x7fffffffdbbd: mov dl,0xf
0x7fffffffdbbf: int 0x80
0x7fffffffdbc1: mov al,0x1
0x7fffffffdbc3: dec ebx
0x7fffffffdbc5: int 0x80
0x7fffffffdbc7: call 0x7fffffffdbb2
0x7fffffffdbcc: rex.W
0x7fffffffdbcd: gs ins BYTE PTR es:[rdi],dx
0x7fffffffdbcf: ins BYTE PTR es:[rdi],dx
0x7fffffffdbd0: outs dx,DWORD PTR ds:[rsi]
0x7fffffffdbd1: sub al,0x1f
0x7fffffffdbd3: ja 0x7fffffffdc44
0x7fffffffdbd5: jb 0x7fffffffdc43
这是我实际运行漏洞利用时发生的事情
(gdb) nexti
0x00007fffffffdbc7 in ?? ()
(gdb) nexti
^C
Program received signal SIGINT, Interrupt.
0x00007fffffffdbc1 in ?? ()
程序挂起,我必须在将控制转移到完全随机的指令之前手动退出。
答案 0 :(得分:1)
您需要使用64位系统调用。 32位系统调用不支持指向字符串的64位指针。