pwnlearn
序言
最近学逆向有些倦了,想多看看别的方向
1.moectfez_u64
在雪豹大佬的指导下尝试的这道题
现在vscode,ctrl+shift+p或者直接输入>输入wsl连接到wsl,要整出flag肯定要远程
1 | from pwn import *#导入pwntools全部模块 |
直接python temp.py报了下先是[ERROR] ‘./pwn’ is not marked as executable (+x)exit
要切换到对应的文件夹cd,
linux每个文件均有读(r),写(w),执行(x)三种模式
要chmod +x temp.py
首先要搭建pwn的虚拟环境,vim ~/.bashrc设置一下
alias gopwn=”source /home/用户名/pwner/bin/activate”
运行后cat flag直接抓住远端flag
ls可以列出来
对不起,不小心做毒wp了,感谢雪豹大佬的指正
1 | from pwn import *#导入pwntools全部模块 |
2.栈
函数的调用过程中使用对战实现
3.简单x86汇编
内存与寻址
声明静态数据区
.DATA表示静态数据区
1 | .DATA |
汇编中仅存在一维数组,没有多维,其实就是内存中连续的区域
dup和字符串也是声明数组的两种的方法
1 | arr DD 100 DUP(0) 声明100个4字节开始于location arr,全初始化为0 |
内存寻址
1 | mov eax, [ebx] 将ebx存的值对应的值的内存存入eax寄存器 |
但是注意
1 | mov eax, [ebx-ecx] ; 只能对寄存器的值相加,不能相减 |
数据类型(大小)原话(SIZE Directives)
修饰指针类型
BYTE PTR- 1 ByteWORD PTR- 2 BytesDWORD PTR- 4 Bytes
指令
三大类:
- 数据移动
movpushpoplea- Load Effective Address
- 算术/逻辑运算
add,subinc,decimul,idivand,or,xornot(逻辑非)+操作数neg(补码取负)+操作数shl,shr
- 控制流
jmpje,jne,jz,jg,jl…cmpcall,ret
调用约定(Calling Convention)
是个协议,规定了如何从调用到返回
C 调用约定:
- 强烈依赖硬件栈的支持 (hardwared-supported stack)
- 基于
push,pop,call,ret指令 - 子过程参数通过栈传递: 寄存器保存在栈上,子过程用到的局部变量也放在栈上
调用管理分为调用方(caller)与被调用方(callee)
(1)调用方规则
1.保存调用方的寄存器
2.将需要的子过程的参数入栈
3.使用call,调用子过程
子过程返回后
1.从栈上删除传递的参数
2.回复保存的寄存器
(2)被调用方的规则
1.将寄存器ebp的值入栈,然后copy ESP to EBP
1 | push ebp |
2.在栈上为局部变量分配空间
3.保存的应有被调用方保存(callee-saved)的寄存器 —— 将他们压入栈。包括 EBX, EDI, ESI
完成以上任务后:
1.将返回值存到eax
2.恢复被调用方保存的寄存器
3.释放局部变量
4.恢复ebp(pop)
5.最高后执行调用方caller
4.数组越界
1 | #include<stdio.h> |
首先要关闭文件保护
1 | gcc -no-pie -z execstack -fno-stack-protector -z norelro -U_FORTIFY_SOURCE 1.c -o pwn |
直接输入aaaaaaaaaapwn溢出
要是开文件保护呢
gcc有个栈保护
1 | char passwd[10]; // [rsp+4h] [rbp-1Ch] BYREF |
passwd后面是v6,v6在溢出后会被修改,从而检验出数组越界
5.栈溢出
1 |
|
要关闭文件保护
1 | gcc -no-pie -fno-stack-protector 2.c -o 2 |
攻击
1.检测保护机制
1 | checksec --file=2 |
1 | RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified FortifiableFILE |
STACK CANARY(栈缓冲区溢出保护)和位置无关(pie)保护关闭
2.break main之后ni(汇编中的步过)
显示的从上往下,第一块是寄存器,第二块是汇编,三是栈,四是调用的函数链
3.数组是从地址往高址存(rsp->rbp)
linux操作指令
1.文件管理器
ls:查看当前路径下的文件和文件夹,ls -l查看详细信息,ls -a可查看隐藏文件
cd:跳转路径,绝对路径可跳转到任意文件夹,相对路径仅能调准到当前文件夹
wsl会将windows系统放到/mnt文件夹下 cd /mnt/d跳转到d路径
cd ..会返回上一级目录
mkdir: 新建文件夹,mkdir project,会在当前目录创建一个project文件夹,
要创建套娃式目录要加上-p,mkdir -p project/20260724/data,会在当前目录创建oject文件夹, o project文件夹内有一个20260716文件夹,20260716文件夹内又有一个data文件夹
rm:删除指令,删了没反悔,常见的是rm file,删除mkdir创建的文件夹rm -r project(r是递归)
-f表示强制执行,rm -rf /*表示直接结束网安生涯
mv: 移动文件,既能移动到其他文件夹下,又能改名,mv /path,/path可以是绝对路径也可以是相对路径
与cd判定一至,mv file1 file2直接改名
cp为备份,与 mv一样,cp file /path但是cp复制过去的文件原文件还在原来的位置,递归复制是-r,-f是强制覆盖
cp -rf project /path
pwd 知道在那个目录远程环境入口为/root,输入pwd即可看见/roo,bash用户一直能看见,zsh用户显示目录
2.文件的查看与修改
cat:查看拼接,cat file1查看文件内容,cat file1 file2 > file3将文件1与文件2的内容拼接到文件
nano与vim均为文件编辑器,vim file,file不存在则创建file
退出方式nano为ctrl+x然后输入Y确认然后回车,不保存修改则是ctrl+x后输入N;vim则是在英
模式下**先按esc,然后输入:wq保存退出,:q!不保存退出,
tail 查看文件的尾部,tile file查看尾部10行的内容,tail -n 20 file查看尾部的20行tail -c n file查看尾部n字节
less 更适用于查看大文件的内容,输入q退出,更多快捷键按h,一分夜醒时打开文件
3.系统管理
kill:应用进程管理,kill PID(结束进程),搭配ps使用,ps查看进程
top:交互式的实时进程监督工具,可以动态显示 CPU、内存、负载和所有运行进程的状态
直接输入top就可以查看运行中的进程占用资源
ps:查看某一时刻的所有进程信息,常用参数ps aux,ps -ef,前者可以查看cpu和内存占用,后者了解当前进程的父进程
uname:获取系统信息,uname -a显示所有的系统信息,快速确认自己正在操作什么操作系统、内核版本、硬件架构
su:切换到root用户
sudo:提权
4.网络相关
ping;连接一下,ping -c 4 发包四次
dig:Linux下最强的DNS(Domain Name System域名系统)查询工具,dig 网址检测DS解析是否有问题
dig+short +网址:直接显示DNS解析后的ip地址,dig -x ip反向解析ip对应的地址
nc:nc ip 端口号 快速链接
ip:可以查看网络接口、IP 地址、路由表、ARP 缓存等信息,并进行配置,ip addr show查看所有的网络接口和ip地址
curl基于uRL语法的文件传输工具,curl 网址支持 HTTP、HTTPS、FTP、SFTP、SMTP 等几十种协议。它被称为命令行下的”浏览器”
wget weget+下载链接,-O参数设置下载路径和文件wget -O /path/file
5.备份压缩
zip :ip 压缩包名称 要压缩的文件/目录,zip file.zip file1 file2 file3,可压缩多个文件,要压缩整个文件夹则要加上-r参数,zip -r file.zip /path/project/20260716/data/ ,加密压缩要加上-e,zip -e file.zip file
unzip:解密压缩,unzip file.zip,指定文件夹unzip file.zip -d /path
解密加密文件夹,unzip -P password file.zip
7z: 强大的压缩解压缩工具,7z a file.7z -r /path压缩文件夹,7z a file.7z file压缩文件
7z a -ppassword file.7z file加密压缩,7z x 压缩文件解密
gzip: gzip file.txt删除file.txt生成file.txt.gz仅能压缩单个文件
gunzip:gunzip file.txt.gz生成txt文件删除gz文件
tar仅打包不压缩,tar -cf file1.tar /path打包path下的所有文件为file1.tar
tar -czf file1.tar.gz /path(-z表示进行gzip压缩,对file1.tar进行gzip压缩)
unrar解压unrar x file.rar
7.软件与包管理
Debain、Ubuntu、kali操作系统是由apt包管理,更新管理器是apt update(获取最新的软件包的索引)
一般是以超级管理员更新sudo apt update,
么有更新的化执行sudo apt upgrade -y进行更新
下载应用是sudo apt install <app-name>
8.其他
ssh:安全外壳协议,不安全的网络上安全的执行网络服务ssh username@ip -p 端口号来连接到题目
env:输入env查看系统的环境变量
source file不加权限,直接运行脚本
chmod,sudo仍无法运行则要chmod +x 可执行文件
