背景介绍
必备基础
C python
计算机组成原理
汇编语言
linux操作系统
IDA、GDB等常见工具的基本操作
特别的
got/plt
elf文件结构
函数调用的栈结构
堆
一些基本的常用术语
pwn
shellcode:一段完成特定功能的代码
payload:攻击代码(可以说包含shellcode)
PoC:Proof of Concept
Exp:Exploit 完整的利用
基础环境
socat
sudo apt-get install socat
socat TCP-LISTEN:4444。。。
不同点:socat打进pwn后的目录是home/pwn
xinetd 【手动进程】
sudo apt-get install xinetd
/etc/services下先添加自己的服务端口信息
/etc/xinetd.d/下添加自己的服务
services。。。
不同点:打进pwn后的目录是根目录
交互方式
socket
zio
pwntools
反编译与调试工具
IDA pro
gdb(peda, gef, pwndbg插件 着色)
调试exp
远程调试
首先在ida中分析程序,寻找要下的断点
使用raw_input()使远程程序暂停
找到进程attach
下断点
c > continue
成功断下
如果使用了pwntools的话可以使用内置的方法
gdb.attach(p,'''
B *0x0804000
B *0xxxxxxxx
)
关于一些缓解措施
ASLR:地址随机化
RELocation ReadOnly(RELRO):重定位只读,它能够保护函数的调用不受攻击者重定向的影响
PIE:位置无关可执行文件
NX[NoeXecute(NX) bit]:不可执行位(类似win下的DEP)参考github 0x9x/peda
x86 汇编
Registors : 【常用寄存器的功能记住】
leave 将ebp恢复成之前的ebp
ret return到ret addr
栈:往低地址跑 变量...
堆:往高地址跑 malloc较小的空间时,分配较大的空间会用map映射一块
GOT
【延迟调用】
【Lazy binding】
应用 比如格式化字符串
while(1){
scanf();
printf(s);
}
利用got劫持,将printf()劫持成system(),再传进去一个"/bin/sh"
Buffer overflow
outline
stack frame
buffer overflow
Dangerous function
strategy
Stack canary
checksec 查看保护开没开
小端地址怎么构造:
1. p32()[pwntools]或l32()[zio]
2. 自己构造
格式化字符串
没有libc
printf addr
info leak vuln
泄露出来好几个函数,libc中函数之间的偏移都是定死的
收集libc.db
%x
很多%x泄露栈上的信息
同理也可以写入栈
第一次写进来,第二次再去修改
盲打format string
只给了 ip port
while(1){
read(..)
printf(..);
}
arch x86?x64?%p --> addr
确定在栈上面的输入位置
aaaa%x,%x,%x...
dump bin file
get target_function 通过泄露got表找到
overwrite got
ROP:Return-Oriented-Programming
re2libc
是一种rop链的构造方法
gadgets 一般是多个pop再加一个return
插件:rop++,ropgadget tool,readelf插件定位函数在libc.so中的偏移 readelf -r ...| grep -w read@
re2dlresolve
利用lazy binding的特性,寻找想要执行的函数的地址
不需要info leak
必须可以控制resolve的参数 可控的区域要大一点
PIE RELRO 必须要是关闭的PIE存在必须leak.text段地址
SROP利用-Sigreturn Oriented Programming
利用信号机制,构造出想要的
pwntools中有一个模块
mmap映射
参数传递区别
x86 通过栈传递参数
x64
win:前3个参数走寄存器(rdi rsi rdx)
linux:前6个参数走寄存器,后面的通过栈
一点小感想
只听懂了差不多一半左右 0- 0 ToT
有趣啊有趣