我制作了这个简单的装配程序:
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?
退出答案 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