各种变量的存储位置

  1. stack:局部变量
  2. heap: 动态分配内存的变量(malloc/new)
  3. bss section: 全局化的未初始化的变量
  4. data section: 全局化的已初始化的变量
    • rodata: (只读data段)全局化的静态变量(const)

例如:

1
2
3
4
5
6
7
8
9
int a = 0;   //.data
int b; //.bss
const double PI = 3.1415 //rodata

int main(){
int c = 2; //stack
char *d = malloc(16); //heap
return 0;
}

linux下将shellcode运行

1.手写简易shellcode

1
2
3
4
5
6
7
8
9
10
11
12
jmp sh
run:
pop ebx
mov BYTE [ebx+7],0
xor eax,eax
mov al,11
xor ecx,ecx
xor edx,edx
int 0x80
sh:
call run
db "/bin/sh"

2.一系列步骤

1
2
3
Assembly:  nasm a.asm -o a.o -felf32   
Extract Shellcode: objcopy -O binary a.o code //将a.o中需要用内容的提取到code中
xxd -i code //将提取出来的code转换为机器码

3.带入调用shellcode的程序test.c

#include  "code.h"

typedef int(*CODE)();

int main()
{
    ((CODE)shellcode)();
}

Run Shellcode: gcc test.c -o test -m32 -zexexstack       

编译tips

64位机上编译上面程序需要强制32位编译,用gcc -m32 、as –32选项

AT&T:
as easy.s -o easy.o –32
ld easy.o -o easy -m elf_i386

INTEL:
nasm srop.asm -f elf64
ld -m elf_x86_64 srop.o -o srop

在尝试编译c++时,发现5.4 的gcc只加pie或者fpie都无法启动pie,只有当两个都加上时才能开启程序的pie,比较神奇hhh