【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 后进先出






