设计Shellcode会产生错误的结果

时间:2016-06-18 13:57:48

标签: c assembly shellcode

我制作了这个简单的装配程序:

library(shiny)

ui <- shinyUI(
  fluidPage(
    numericInput("centerpoints", "Number of center points", value=0, min=0, max=25),
    checkboxInput("changeCenterpoints", "Cap maximum at 0")
  )
)

server <- function(input, output, session){
  observeEvent(input$changeCenterpoints, {
    if(input$changeCenterpoints){
      updateNumericInput(session, "centerpoints", max = 0, value = 0)
    }else{
      updateNumericInput(session, "centerpoints", max = 25)
    }
  })
}

shinyApp(ui, server)

这显然是在64位操作系统(Linux)上运行。然后我按如下方式编译它:

.text
    .globl _start
    _start:
        mov %20, %rbx
        mov %1, %rax
        int $0x80

最后在运行程序后,它退出状态为20

as -o ExitShellcode.o ExitShellcode.s
ld -o ExitShellcode ExitShellcode.o

使用objdump转储文件的shellcode:

echo $?
20

但是,在将shellcode放入此程序之后:

objdump -d ExitShellcode

ExitShellcode:     file format elf64-x86-64


Disassembly of section .text:

0000000000400078 <_start>:
400078: 48 c7 c3 14 00 00 00    mov    $0x14,%rbx
40007f: 48 c7 c0 01 00 00 00    mov    $0x1,%rax
400086: cd 80                   int    $0x80

并编译:

#include <stdio.h>

char shellcode[] = "\x48\xc7\xc3\x14\x00\x00\x00"
                   "\x48\xc7\xc0\x01\x00\x00\x00"
                   "\xcd\x80";

int main()
{
    int *ret;

    ret = (int *)&ret +2;

    *ret = (int)shellcode;

}

并运行,程序以0状态退出:

gcc -g -o Shellcode Shellcode.c
Shellcode.c: In function ‘main’:
Shellcode.c:13:9: warning: cast from pointer to integer of different        size     [-Wpointer-to-int-cast]
*ret = (int)shellcode;

问题是什么?不应该以20?

退出

1 个答案:

答案 0 :(得分:2)

您的代码错误地假定编译器将变量ret放在堆栈上的某个位置,而不是main的返回地址。相反,编译器将它放在其他地方,因为它允许这样做,所以你的代码什么都不做。您可能遵循在互联网上找到的设计糟糕的示例。

如果你想在shellcode数组中执行“shellcode”,你可以尝试向它转换一个指向函数的指针然后调用它:

char shellcode[] = "\x48\xc7\xc3\x14\x00\x00\x00"
               "\x48\xc7\xc0\x01\x00\x00\x00"
               "\xcd\x80";

int main()
{
    ((void (*)()) shellcode)();
}

但是这仍然可能会失败,因为放置.data的{​​{1}}部分不可执行,因此程序在运行时会崩溃。要解决该问题,请在链接程序时使用shellcode选项。例如:

-zexecstack