工具
IDA+pwndbg+pwntools+...
IDA
先祭上神器
pwndbg
这个比peda好用一点。推荐。
- stack 100 查看栈信息
- heap -h 查看堆(需要更全的heap插件可以看libheap,不过这个基本够了)
gdb自定义hook(这里自定制用,其实pwngdbg自带就完全足够了)
define hook-stop
>info registers
>x/24wx $esp
>x/2i $eip
>end
pwntools
具体网上一堆教程如:pwntools使用,这里就是个人整理一点
p = process('./pwnfun') # 挂载进程
elf = ELF('./pwnfun') # 看到的结果就和checksec一样
p.interactive() # 弹shell
context.log_level = 'debug' # 挂进程之后显示各种调试信息
- DynELF这个用来leak十分好用,不过leak格式比较难写,有点迷
- elf.got['puts'] 这个少用,也有点迷,用ROPgadget(见下文)代替比较好
checksec(pwntools中也有)
CANARY : 覆盖返回地址基本不可利用
FORTIFY : 一种安全机制
NX : 堆栈不可执行
PIE : 攻击时需要泄露地址
RELRO : Partial: 不可修改strtab
Full : 程序装载时填充got表
ROPgadget
ROPgadget --binary ./pwn --only "pop|ret" | grep rdi
metsploit
msfconsole
msf >
show payloads: 显示所有渗透模块
use linux/x64/exec: 使用linux x64 模块
set cmd /bin/sh
generate -t py -b "/x00":产生shellcode /xXX的形式
redare2(要用的话再积累 IDA更加方便)
aaa
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze len bytes of instructions for references (aar)
[x] Analyze function calls (aac)
s sym.main:运行到main处
pdf:打印汇编
odd [strings]: 给参数来运行程序
dc: 运行程序
db: 下断点
dr: 查看所有寄存器信息
VV: 查看调用关系视图
afvn [name] [name]: 重命名,类似ida的n
echo disass main | gdb ./[program] 利用管道来调试
"\41\xffABCD".encode('hex'
set disassembly-flavor intel 设置为x86汇编显示
Complie
- gcc
-fno-stack-protector// 去除栈保护 如 gcc -m32 -g -fno-stack-protector -z execstack -o vuln vuln.c
- nasm
nasm -f elf -o vlun.o vuln.asm //编译 ld -m elf_i386 -s -o vuln vuln.o vuln.o //链接 ./vuln 运行
一些姿势
连接
ssh [email protected] 用来连接目标主机
scp [email protected] [filename] [dir]
scp -P2222 [email protected]:/home/passcode
程序加载追踪
ltrace
strace
测试
主要看socat用法
socat tcp-listen:12345 exec:./stack_overflow 把程序放到本机运行
socat tcp-listen:22333,reuseaddr,fork system:./pwnme 保持程序一直执行
nc 127.0.0.1 12345 本地测试连接
Centos 相关
centos可能默认开了防火墙 所以端口都是关闭的 但是关闭防火墙又不太好,所以开放对应端口就好了
- 通过命令开启允许对外访问的网络端口(这里是23333):
/sbin/iptables -I INPUT -p tcp --dport 23333 -j ACCEPT /etc/rc.d/init.d/iptables save /etc/rc.d/init.d/iptables restart /etc/init.d/iptables status// 查看端口是否开放
加载信息
info proc map 查看各个库加载信息然后寻找 "/bin/sh" 字符串
strings: 查看文件中可见字符串
strings -a -t x /lib32/libc.so.6 | grep "/bin/sh"
objdump -d stack7 | grep "ret" 可以用来查找ret指令
objdump -x [filename] 打印头文件信息以及区段信息
objdump -T libc.so | grep gets
查找gadgets
ROPgadget --binary level4 --only "pop|ret"
ROPgadget --binary libc.so.6 --only "pop|ret" | grep rdi
objdump -d ./level5
__libc_csu_init这个函数里找 ROP
objdump -d -j.plt pwn | grep write 查找write函数地址
Konwledge
QAQ 栈主要就是找溢出和rop等
覆盖x86_64 ret libc
执行call操作时栈内已经存放了传递的变量,call将当前地址压入栈中,作为返回地址,然后执行jmp到指定函数位置。构造call system时可以利用这个先存放一个地址,然后跳转。
ROP
基础技能了,不过自己经常是会忘,都要照着汇编来看参数传递顺序≧ ﹏ ≦
dl-resolve
姿势有点高端:),读取内存。需要了解一下加载过程。(学二进制不知道文件加载过程和咸鱼有什么区别(^_^))
double free
想进入二进制的门槛都要会heap。然而我好像撞死在门槛上了。/(ㄒoㄒ)/~~
一些坑
ret & call
ret 后面必须是 .plt
__libc_init 里用call来必须是 .got的(具体LCTF pwn-100那个)
leak函数
DynELF需要leak函数,这个有一些技巧,有一个总结的链接挂了。简单来说就是主要puts,write,printf这几个函数的区别
关于DynELF
有一定的成功率,不过如果网速或者服务器不过关,这个方法并不是很好,dl-resolve相对易成功一点。baidu杯那个不知道是不是这个原因QAQ
其他的坑
to be continued
resources
pwnable
主要linux elf为主 比较适合开拓思路和入门,做过一点,不过因为懒,有点荒废了
配上writeup-riskgray食用更佳
io
还没来得及看,主要是有arm的
LiveOverFlow
youtube有相关视频 从他的视频学了不少
CTF writeup
各种writeup (大多国外),感觉国内各ctf都参照了很多国外的比赛
CTFer-bin
resource recommand
各种资源,看了晕
DEF CON
知名hacker团队
tisiphone
推送多 有心得体会系列文章可以看看