为了深入学习PWN,此文章仅作为个人参考
工具
IDA、 gdb、 objdump、 ldd、 ncat、 msf-pattern_create、 checksec、 readelf、ropper、one_gadget、LibcSeacher、main_arena_offset
ncat 启动脚本进行端口监听
ncat -vc ./xxxxx -kl 127.0.0.1 8888
ncat -vc ./xxxxx -kl ::1 8888
objdump
objdump -M intel -D ./xxxxx
创建循环字符串
msf-pattern_create -l 10
Aa0Aa1Aa2A
gdb 命令
命令(缩写) 功 能
run(r) 启动或者重启一个程序。
list(l) 显示带有行号的源码。
continue(c) 让暂停的程序继续运行。
next(n) 单步调试程序,即手动控制代码一行一行地执行。
step(s) 如果有调用函数,进入调用的函数内部;否则,和 next 命令的功能一样。
until(u)
until location(u location) 当你厌倦了在一个循环体内单步跟踪时,单纯使用 until 命令,可以运行程序直到退出循环体。
until n 命令中,n 为某一行代码的行号,该命令会使程序运行至第 n 行代码处停止。
finish(fi) 结束当前正在执行的函数,并在跳出函数后暂停程序的执行。
return(return) 结束当前调用函数并返回指定值,到上一层函数调用处停止程序执行。
jump(j) 使程序从当前要执行的代码处,直接跳转到指定位置处继续执行后续的代码。
print(p) 打印指定变量的值。
quit(q) 退出 GDB 调试器。
gdb-peda
checksec // 查看文件的架构与保护机制开启状态
vmmap // 查看进程中的权限,以及起止地址
find
info file // 查看当前文件的信息,例如程序入口点
info break // 查看当前断点信息
disassemble + func // 对指定的函数进行反汇编
break +''地址'' // 设置断点
r(run) // 运行程序
c(contunue) // 继续执行
x / (n , f ,u) // n,f,u是其三个可选参数
n:是正整数,表示需要显示的内存单元的个数,即从当前地址向后显示n个内存单元的内容,
一个内存单元的大小由第三个参数u定义。
f:表示addr指向的内存内容的输出格式,s对应输出字符串,此处需特别注意输出整型数据的格式:
x 按十六进制格式显示变量.
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
u:就是指以多少个字节作为一个内存单元-unit,默认为4。u还可以用被一些字符表示:
如b=1 byte, h=2 bytes,w=4 bytes,g=8 bytes.
<addr>:表示内存地址。
例如: x/20xw $esp // 常用于x86打印esp地址向后20个内存单元,以4字节作为一个内存单元,以16进制显示
x/20xg $rsp // 常用于x64查看
layout // 用于分割窗口,可以一边查看代码,一边测试。
主要有下面几种用法:
layout src // 显示源代码窗口
layout asm // 显示汇编窗口
layout regs // 显示源代码/汇编和寄存器窗口
layout split // 显示源代码和汇编窗口
layout next // 显示下一个layout
layout prev // 显示上一个layout
Ctrl + L // 刷新窗口
Ctrl + x 再按1 // 单窗口模式,显示一个窗口
Ctrl + x 再按2 // 双窗口模式,显示两个窗口
Ctrl + x 再按a // 回到传统模式,即退出layout,回到执行layout之前的调试窗口。
查询偏移量
msf-pattern_offset -q Aa2A
[*] Exact match at offset 6
查看进程加载的模块地址
pidof ./xxxxx
cat /proc/进程号/maps
一个程序
ELF Header
.init
.plt
.text
.rodata
.got
.data
.bss
变量
rdi
rsi
rdx
rcx
r8d
r9d
各种防护措施
Stack Guard/canary
DEP/NX
ASLR
PIE
RELRO
Stack Guard/canary
做完function prologue的时候会将随机生成的乱数塞入stack中,
function return前会检查该乱数是否被更动过,
若发现更变就立即结束程式
DEP/NX
Data execution prevention
可执行的地方不能写,可写的地方不能执行
又称NX
可以防御之前说的在global变量部分写shellcode,然后修改rip进行执行
ASLR
Address Space Layout Randomization
每次程式执行时 stack、heap、library位置都不一样
PIE
Position Independent Execution
开启后,code 与 data 都会跟着ASLR
RELRO
Relocation Read-Only
Partial RELRO
· GOT 可写
Full RELRO
· Load time时会将所有function resolve完毕
· GOT 不可写
ROP
Return Oriented Programming
通过不断去执行包含ret的程式片段来达到想要的操作
这些包含ret的程式片段又被称作gadget