遇到的就记录在这里,不定期更新。
逆向手转PWN进度
第一日(2020.9.13)
学习了ROPgadget,做了一道x86-64的ROP。
学习了GDB动调。
命令笔记
查segment
objdump -h welpwn
readelf -S welpwn
复制libc
cp /lib/i386-linux-gnu/libc.so.6 ./libc.so.6
ldd
ldd welpwn
查相关链接库
objdump
objdump -d ./level5
反汇编
objdump -h welpwn
查segment
ROPgadget
安装:
ROPgadget在Pwn中用于搜索汇编指令和字符串,安装方法:
1.安装python-capstone:apt-get install python-capstone
2.下载安装文件:git clone https://github.com/JonathanSalwan/ROPgadget.git
3.进入目录 :cd ROPgadget
4.运行安装脚本: python setup.py develop
使用方法:
1.搜索/bin/sh:
ROPgadget --binary intoverflow “/bin/sh”
ROPgadget --binary libc.so.6 --only "pop|ret" | grep rdi
ROPgadget --binary 3fb1a4283 --string 'sh'
pwndbg
rebase
对偏移处下断点,使用前需要将程序跑起来,否则:
GCC编译安全选项
ASLR
ASLR等级与说明
等级 | 说明 |
---|---|
0 | 关闭 |
1 | 保留 共享库 栈 mmap vdso随机化 |
2 | 完全 1 基础上 brk() 分配的内存空间也将被随机化 |
ASLR等级查看
sysctl -n kernel.randomize_va_space
cat /proc/sys/kernel/randomize_va_space
123
ASLR修改
sysctl -w kernel.randomize_va_space=0
或
echo 0 > /proc/sys/kernel/randomize_va_space
权限不够可以sudo -s后再输入上面的指令。
PIE(代码段和数据段的随机)
效果 | 编译选项 |
---|---|
关闭 | 低版本默认关闭 高版本-fno-pie -no-pie |
可执行文件等级1 | -fpie -pie |
可执行文件等级2 | fPIE -pie |
共享库文件等级1 | -fpic |
共享库文件等级2 | -fPIC |
DEP/NX(数据不可执行保护)
效果 | 编译选项 |
---|---|
开启 | 默认开启 -z noexecstack |
关闭 | -z execstack |
canary(栈溢出保护)
效果 | 编译选项 |
---|---|
禁止 | -fno-stack-protector |
启用 针对部分char数组函数 | -fstack-protector |
启用 全部函数 | -fstack-protector-all |
FORTIFY(缓冲区溢出检查)
效果 | 编译选项 |
---|---|
关闭 | 默认 |
开启 较弱检查 编译时检查 | -D_FORTIFY_SOURCE=1 |
开启 较强检查 运行时也检查 | -D_FORTIFY_SOURCE=2 |
RELRO(只读保护)
效果 | 编译选项 |
---|---|
关闭 | -z norelro |
部分 Partial RELRO | 默认 -z lazy |
全部 | -z now |
安装笔记
ROPgadget
1.安装python-capstone: apt-get install python-capstone
2.下载安装文件:git clone https://github.com/JonathanSalwan/ROPgadget.git
3.进入目录 :cd ROPgadget
4.运行安装脚本: python3 setup.py develop
- 依赖于capstone
- python2还是python3需要自己改。
gdb-peda安装
git clone https://github.com/longld/peda.git
echo "source ~/Program/peda/peda.py" >> ~/.gdbinit
记得将~/Program/peda
改成你的peda下载路径。
知识点
一张图快速了解fastcall x86-64的调用约定:
#include <stdio.h>
int f(int a,int b,int c,int d,int e,int f,int g,int h){
return a+b+c+d+e+f+g+h;
}
int main(){
f(1,2,3,4,5,6,7,8);
}
我来追番了
pwn爷爷冲冲冲!
୧(๑•̀⌄•́๑)૭ PWN爷爷 他lie了୧(๑•̀⌄•́๑)૭