栈溢出控制执行流的关键,是让控制执行指令最关键的寄存器eip,
去载入攻击代码的地址,而能控制eip的关键,回忆栈的工作过程
便是在于栈帧中ruturn address
pwn工具:
pwntools是python自带的pwn工具
pwndbg是gdb中的增强模块
Checksec检查文件的保护措施
idapro的基本使用,f5进入将汇编代码变为c语言代码
左侧function windows可以看到所有使用的函数,除了用户
写的函数,许多函数在系统内是已经写好的,其中白色部分是写死的
静态代码,而粉色部分则是需要在用到时去动态链接库中寻找使用的。
gets函数的出现往往代表着有溢出的漏洞,因为gets设计之初没有
考虑安全问题,读入的字符串是无上限的。
Pwntools:
1.本地建立连接:io = process("./文件名")
远程连接 : io = remote("ip",port)
2.接收 io.recv() io.recvline()
3.发送 io.send(\n) == io.sendline()
题目:
1.tools:直接用pwntools的io.recv()接收可以得到b'Pwntools is such an awesome python module, right?\nTell you a secret (only smart baby can see it) :\nZmxhZ3tuMHRfZjRzdGVyX3Q2YW5feTB1fQo=\rMaybe I will tell you again when you clever than ELSEpush ......\n'其中的转义字符也输出就把本来被删去的/r前的一段给显示出来时base64编码
用echo ZmxhZ3tuMHRfZjRzdGVyX3Q2YW5feTB1fQo= | base64 -d 解码得到flag
Pwndbg:
例题:ret2text:return to text
屏幕剪辑的捕获时间: 2024/3/17 16:52
最简单的栈溢出情况,ida已经标识出ebp的距离为10h字节,16字节,
有时也不可靠,最可靠的还是动态调试
在ida中发现main下的vulnerable函数里存在栈溢出
同时存在get_shell的后门函数可以直接访问/bin/sh
接着在 gdb ret2text进入pwndbg下
用b (breaking point) 命令 b main在main处打下一个断点
然后r(run),进入调试界面,用n来到vulnerable函数用s进入
再n进入gets输入八个字符则得到
发现eax和ebp的距离确实为16个字节,ebp下四个字节则为return address
目标是覆盖这个区域让其跳到后门的函数,则拿到shell
用python写exp脚本,开启服务后,查看getshell的地址如下写payload
Payload = b'A'* 16 + b'bbbb'+ p32(0x8048522)
前面为20个垃圾字符,p32将地址变为字节流
Io.sendline(payload)然后io.interactive开启交互