1. 分析程序流程
2. 查看保护
3. 计算偏移
4.明确目标(我们要组合的shellcode)
系统调用号,即 eax 应该为 0xb
第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。
第二个参数,即 ecx 应该为 0
第三个参数,即 edx 应该为 0
接下来我们就要一点点的去拼凑这些内容,我们没法直接在栈里写指令,只能够利用程序中自带的指令去拼凑。
4. 将eax设置为0xb,我们是没法直接往栈里写mov eax,0xb的,那么还有另一种方式是pop eax,但是要保证栈顶必须是0xb。然后设置ebx,ecx,edx,同样是这样的道理,所以我们可以想象栈中的数据是:
pop eax;ret
0xb
pop ebx;pop ecx;pop edx;ret
"/bin/sh"的地址
0
0
int 0x80的地址
这样我们就可以保证eax,ebx,ecx,edx的值了。所以接下来我们要在程序中找一下有没有pop eax;和pop ebx;pop ecx;pop edx;的指令。
5. ROPgadget --binary ./ret2syscall --only "pop|ret" | grep "eax"
6.ROPgadget --binary ./ret2syscall --only "pop|ret" | grep "ebx" | grep "ecx" | grep "edx"
恰好也有我们所需要的,只不过顺序和我们的不同,在组织payload时候需要调换下顺序
6. ROPgadget --binary ./ret2syscall --string "/bin/sh"
7. ROPgadget --binary ./ret2syscall --only "int"
8. 编写exp
9. 调试验证