遇到的就记录在这里,不定期更新。

逆向手转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

image-20200921133035873

image-20200921132939823

对偏移处下断点,使用前需要将程序跑起来,否则:

image-20200921133105016

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
可执行文件等级2fPIE -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的调用约定:

image-20200913025751663

#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);
}
Last modification:September 21st, 2020 at 01:31 pm