Когда я выполняю шелл-код в основной функции, он работает нормально. Однако, когда я выполняю его другой функцией, вызываемой main, это вызовет ошибку сегментации. Насколько я знаю, вызов функции должен влиять на стек, а шелл-код должен находиться в куче. Что-то не так в моем коде?
Шелл-код генерируется matesploit, и я использую qemu-arm для запуска программы.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
// msfvenom -p linux/armle/exec CMD=/bin/pwd -f c
unsigned char buf[] =
"\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x78\x46\x0a\x30\x01\x90\x01"
"\xa9\x92\x1a\x0b\x27\x01\xdf\x2f\x62\x69\x6e\x2f\x70\x77\x64";
void runShellCode(){
unsigned char *pShellCode = (unsigned char *)calloc(1, 4096);
memcpy(pShellCode, buf, sizeof(buf));
(*(void(*)()) pShellCode)();
}
int main(int argc, char *argv[])
{
// uncomment these lines it will work perfectly fine
// unsigned char *pShellCode = (unsigned char *)calloc(1, 4096);
// memcpy(pShellCode, buf, sizeof(buf));
// (*(void(*)()) pShellCode)();
runShellCode();
return 0;
}
Командная команда для компиляции и запуска:
arm-linux-gnueabi-gcc test.c -o test_arm -static
qemu-arm test_arm
Код дизассемблирования шелл-кода (который неверен, поэтому я удаляю его)
Обновите код способом mmap (). Однако, если аргумент main () равен void
, он работает нормально. Пока аргумент int argc, char *argv[]
, это вызовет SEGV.
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <sys/mman.h>
// msfvenom -p linux/armle/exec CMD=/bin/pwd -f c
unsigned char buf[] =
"\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x78\x46\x0a\x30\x01\x90\x01"
"\xa9\x92\x1a\x0b\x27\x01\xdf\x2f\x62\x69\x6e\x2f\x70\x77\x64";
int main(int argc, char *argv[])
//int main(void)
{
unsigned char *pShellCode = (unsigned char *)calloc(1, 4096);
memcpy(pShellCode, buf, sizeof(buf));
void (*sc) () = NULL;
sc = mmap (0, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
memcpy (sc, pShellCode, 4096);
__builtin___clear_cache (sc, sc + sizeof(sc));
sc();
return 0;
}