【ctf系列】pwn学习
b站视频教程:【CTF系列教程100集】2023年我在B站学CTF,国内顶级战队大佬带你从入门到精通,零基础小白必看!!!
day1
1 |
|
攻击脚本按照一定的方式发送一个payload
磁盘中的才叫ELF
file a.out是一个ELF文件
节视图 划分功能
段视图 划分执行权限的
rodata read only data
cat /proc/pid/maps proc表示process
gdb调的是虚拟内存
BSS:未初始化的全局变量 不需要占用磁盘空间 需要占据内存空间
pwn的实战中大段序一般不多
eax:e表示extra
LSB小端序
fork 另起了一个新的进程
取值-译码-执行
偏移和位移
汇编 DEST <- DEST SRC ?
checksec xxx
gdb xxx
vmmap
day2
mov ebp esp
mov esp ebp
把esp的值给ebp
eax保存返回地址
call指令自带填入返回地址
ret 指令 ?
pwntools python的一个模块
gdb中的插件:peda gef pwndbg
checksec a.out 命令行工具
IDA软件:
LibcSearcher
1 |
|
ret2text 返回到test段
checksec执行结果:
NX:栈可执行
setbuf(stdin,0) 关闭缓冲区,可以将输入的字符串直接打印出来
1 |
|
栈的保护机制:
ASLR 地址随机化
NX
canary
获取shellcode的方法:
1)pwn有模块
1 |
|
leave 表示把esp移到ebp的位置
pop
ret ???????/
1 |
|
day3
1 |
|
ROP 是因为没有一个现成的函数可供调用,所以需要自己构造
ida 在汇编那个区域 输入G,然后输入地址,直接就能跳转
ida shift+F12 跳到字符串
ret等效于 pop EIP
xor %eax, %eax 将eax清空
mov %eax, (%edx) 加%是后者给前者赋值
静态链接和动态链接
1 |
|
静态链接文件较大 静态文件和动态文件大小差距在于库函数
1 |
|
day4
plt在代码段
got global offset table
ret2text 找后门函数
ret2shellcode
ret2syscall二进制用的是静态链接 静态 将库函数写到了elf文件本身 代码会比较多 就可以很容易的构成一个攻击流
ret2libc plt表中存在system,很有利
plt是一个表,表里面保存的是代码
got.plt里面保存的是数据,里面保存的是地址
假设
0xaaaaaaaa system@got
32是栈传递 64是寄存器调用
system(“/bin/sh”) /bin/sh是存放到rodata地方
-fno-stack
1 |
|
nop使得ASLR打开之后栈溢出执行成为可能
上图的ebp是system函数自己push进去的
下面为:只有system函数,没有/bin/sh字符串
ret2libc3
除了给可执行文件,还给了libc.so
fflush()清理缓冲区
read(0, &buf, 0xAu) 0表示标准输入
day5
ret2text 代码中没有后门函数
ret2shellcode checksec看没有RWE相关的东西
ret2libc1 既有system,又有 /bin/sh
ret2libc2 只有system 自己输入/bin/sh
ret2libc3 还给了一个libc.so文件
泄露got表中put函数的地址,从libc中找到puts函数和system函数的距离,就可以算出system函数的地址了
泄露got表中put函数的地址方法:
打印了好多东西,这些东西是put函数执行的,所以put函数已经执行过了,got表里面就有值了
ida中找不到/bin/sh和sh,可以用strings找个含有sh的字符串
整体的攻击脚本:
sendlineafter 当收到第一个参数之后,就发送第二个参数+/n输出
cyclic是用来填充垃圾数据的
课后题1:ret2text
课后题2:ret2shellcode
ASLR,不知道写到栈上的地址是什么?所以题目就告诉了
nop
asm是把汇编代码变成机器码
课后题3:ret2libc system有 /bin/sh也有
有了system,在plt表里面有个表项目
daedbeef是垃圾数据
课后题4:x64
1 |
|
return 将栈顶的值指向rip
rip:pop_rdi_ret
rdi: /bin/sh
rip: system
system取rdi中的参数,执行system(“/bin/sh”)
都是先传参,再调用函数
64位ROP小技巧 csu(不是一个完整的攻击,只是ROP中间的一个技巧)
jz z是1就jump z是0就向下执行
课后题5:
没有system
1)找到libc的真实地址 之前那个题是题目给提供了一个函数,然后给打印出来了
没有/bin/sh
1)有没有其他符号末尾有sh,可以调用
2)用rop将/bin/sh读入缓冲区,而且地址是固定的,例如bss
3)泄露了libc的地址,可以用libc里面的任何东西
有sh,不一定是可用的
libc里面有/bin/sh,可以用的
但是有write函数
day6
格式化字符串
字符串截断
1 |
|
通过%p泄露出canary,构造exp的时候再填回去
%p是把栈上的值直接打印出来
%s是把栈上的值当成一个地址,把这个地址指向的内容打印出来
取第3个参数
%n 任意地址写
%hhn 一个字节
%hn 两个字节
%n 四个字节
例题1
练习题2
64位 前6位参数存到了寄存器中
堆
mmap memory map
day1
0x8 0x10 0x18 0x20
1 |
|
previous size复用
因为previous size表示上一个chunk是free chunk的size大小,此时上一个chunk不是free chunk,所以这个previous size就没用了
fashbin中的size,即使free掉,最后一位也还是1
物理链表:看上一个chunk是不是空闲,然后合并
逻辑链表:如下图
unsorted bin
只有fastbin和?是单向的,其他的bin都是双向的
how2heap
gdb6433
day2
unsorted bin绝大多数是为了fastbin创造条件的
unsorted bin 双向链表
house of xxx 一般是多个漏洞的结合
fsb - format string bug 格式化字符串漏洞
练习题
最简单、最模板化的堆题目
去除了符号表
fastbin 后进先出