pwn71
目录
题目
预计时间
2h
题目分析及截图
题目描述是 ret2syscall
ret2syscall原理:
利用 系统调用去进行攻击,核心思想是:控制寄存器+ 跳转syscall
在栈溢出时,我们能控制栈,因此可以构造 ROP链
**32-bit ret2syscall:**eax / ebx / ecx / edx
1 | eax = "系统调用号" |
**64-bit ret2syscall:**rax / rdi / rsi / rdx
一句话概括:利用栈溢出构造ROP链执行系统调用
知道原理之后我们就可以去写题了
先checksec ./pwn看一下保护机制
1 | yyh@yyh:~/pwn71$ checksec ./pwn |
发现 NX 开启,即不可执行,我们可以使用 syscall 进行绕过,因为syscall是利用gadget 来进行系统调用的
我们先使用Ida看一下程序的代码
main函数
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
很明显的栈溢出 gets(&v4);
我们先看需要 填充 的偏移是多少
我第一次是在ida中看的,
int v4; // [esp+1Ch] [ebp-64h] BYREF那么offset = 0x64 + 4吗?其实不是的,我是写好exp之后发现打不通,才发现这个offset是不对的
我们可以使用
cyclic来看偏移,这是更准确的方法具体操作:
gdb ./pwn
b main
r
cyclic 200
复制下来这串字符之后
Ctrl + d退出调试
gdb ./pwn
r
输入这串字符
得到溢出地址
cyclic -l 0x62616164

之后我们就得到了偏移地址是112
我们怎么构造ROP链?
首先execve的系统调用号是11 (0xb)
那么如果要执行 “/bin/sh” 的话
eax = 11 (0xb)->execve的系统编号ebx = "/bin/sh"-> 文件名ecx = 0edx = 0int 0x80
Q:int 80 的意思是什么?
A:触发中断 0x80,让 CPU 从用户态切换到内核态执行系统调用。
当然如果我们需要执行这个命令的话就需要寄存器传参,就需要找 gadget 的地址
可以使用ROPgadget命令来找我们所需要的地址
ROPgadget --binary pwn --only "pop|ret" | grep eax
ROPgadget --binary pwn --only "pop|ret" | grep ebx
ROPgadget --binary pwn --only "pop|ret" | grep ecx
到ecx发现并没有pop ecx ; ret
但是我们发现了0x0806eb90 : pop edx ; pop ecx ; pop ebx ; ret
这个gadget同样可以使用,并且它正好按顺序帮我设置了 execve 所需的三个寄存器
exp如下
1 | from pwn import * |
这道题到此就结束了
加油!