基本rop:
ret2rext:
利用程序中已有的代码段。
main函数后一般跟都有leave ret;
leave-> mov esp ebp;pop ebp;
函数返回值会保存在rax中;
32位程序传参是通过栈进行传参的,call一个函数的时候,此时esp所指向的位置是第一个参数,esp+4的位置是第二个参数,依次类推后跟下次函数的返回地址。
and 指令 :相同为1,不同为0。
ret2shellcode:
一般这种题目都会有rwx段,我们可以在该段内写入shellcode,然后返回相关内存段就可以了。
ret2syscall:
通过相关寄存器 rax,rbx,rcx,等等来进行系统调用,比如execve("/bin/sh",NULL,NULL),此时就需要控制rax = 0xb rbx = [/bin/sh] 地址
rcx = 0,rdx = 0。然后int 80 或者 syscall 就可以 ,需要注意的是 64位程序传参为寄存器传参 rdi,rsi,rdx,rcx,r8,r9,然后才是栈传参。
ret2libc:
这个就比较简单了,如果前面的掌握了,那么这里看wiki就可以解决了。uu
中级rop:
ret csu:
这种手法就是在我们做题目的时候,如果用ROPgadget工具找不到控制相关寄存器的代码,那么就可以利用程序初始化的时候相关的代码。这里感觉还是自己背下来这段比较好:
.text:0000000000400600 loc_400600: ; CODE XREF: __libc_csu_init+54•j .text:0000000000400600 mov rdx, r13 .text:0000000000400603 mov rsi, r14 .text:0000000000400606 mov edi, r15d .text:0000000000400609 call qword ptr [r12+rbx*8] .text:000000000040060D add rbx, 1 .text:0000000000400611 cmp rbx, rbp .text:0000000000400614 jnz short loc_400600 .text:0000000000400616 .text:0000000000400616 loc_400616: ; CODE XREF: __libc_csu_init+34•j .text:0000000000400616 add rsp, 8 .text:000000000040061A pop rbx .text:000000000040061B pop rbp .text:000000000040061C pop r12 .text:000000000040061E pop r13 .text:0000000000400620 pop r14 .text:0000000000400622 pop r15 .text:0000000000400624 retn .text:0000000000400624 __libc_csu_init endp
ret2reg:
这种攻击手法主要是利用程序中的gadget,比如call register,jmp register等指令,我们可以通过控制相关寄存器中为我们想要的地址,然后执行call register,jmp register,来执行我们想执行的代码。
brop:
这里是盲打pwn,感觉需要慢慢积累。