【ctf系列】pwn学习

LibcSearcher

b站视频教程:【CTF系列教程100集】2023年我在B站学CTF,国内顶级战队大佬带你从入门到精通,零基础小白必看!!!

day1

1
nc ip port

image.png

攻击脚本按照一定的方式发送一个payload

磁盘中的才叫ELF
file a.out是一个ELF文件

节视图 划分功能
段视图 划分执行权限的

image.png

rodata read only data
cat /proc/pid/maps proc表示process

image.png

image.png

image.png

gdb调的是虚拟内存

image.png
image.png
BSS:未初始化的全局变量 不需要占用磁盘空间 需要占据内存空间

pwn的实战中大段序一般不多

image.png

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
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *
io=process("./xxx")
io=remote("ip地址", 端口)

io.recvline()
io.recv()

io.send(p64())
io.send(p32(0))
io.send(b"\x0a") # byte对象
io.sendline(b"abcd") <=> io.send(b"abcd\n")
payload = b'A' * 16 + b'BBBB' + p32(-x8048522)
io.sendline(payload)
io.interactive()

ret2text 返回到test段

checksec执行结果:
NX:栈可执行

setbuf(stdin,0) 关闭缓冲区,可以将输入的字符串直接打印出来

1
2
3
4
5
6
7
8
9
10
11
pwndbg> b *0x8048
pwndbg> b main
pwndbg> r # run
pwndbg> s # stag in?
pwndbg> n
AAAAA
pwndbg> stack 24
pwndbg> vmmap
pwndbg>
pwndbg>

栈的保护机制:
ASLR 地址随机化
NX
canary

获取shellcode的方法:
1)pwn有模块

1
2
3
4
5
6
7
8
9
from pwn import *

>>> shellcraft.sh() # 32位机器
>>> print(shellcraft.sh()) # 输出汇编
>>> print(asm(shellcraft.sh())) # 转成二进制

######################################## 64位
>>> context.arch = "amd64"
>>> shellcraft.amd64.sh() # 64位机器

leave 表示把esp移到ebp的位置
pop
ret ???????/

1
2
3
4
5
>>> 0x1111111 - 0x000123
>>> hex(xxxx)

ljust 从左向右有调整,不够位数的用字符补齐
asm(shellcraft.sh()).ljust(112, b'A') + P32(0xxxxxxxxx)

day3

1
2
# python
>>> 0xd0-0x20

ROP 是因为没有一个现成的函数可供调用,所以需要自己构造

ida 在汇编那个区域 输入G,然后输入地址,直接就能跳转
ida shift+F12 跳到字符串

ret等效于 pop EIP
xor %eax, %eax 将eax清空
mov %eax, (%edx) 加%是后者给前者赋值

静态链接和动态链接

image.png

1
2
3
4
5
6
7
gcc -fno-pie -o xx test.c
gcc -fno-pie --static -o xx test.c

gcc -fno-pie -g -m32 -o xx test.c
# fno-pie 关闭32
# -g 加上源代码
# -m32 编译成32位

image.png

image.png

静态链接文件较大 静态文件和动态文件大小差距在于库函数

image.png

1
2
3
pwndbg> plt
pwndbg> x 0x401030
pwndbg> x/20 0x401030

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地方

image.png

image.png

image.png

-fno-stack

1
关闭保护 canary fno-stack-protector ???

image.png

nop使得ASLR打开之后栈溢出执行成为可能

image.png

image.png

image.png
上图的ebp是system函数自己push进去的

image.png

image.png

image.png

image.png

image.png

image.png

下面为:只有system函数,没有/bin/sh字符串

image.png

ret2libc3

除了给可执行文件,还给了libc.so

image.png

image.png
fflush()清理缓冲区
read(0, &buf, 0xAu) 0表示标准输入

day5

ret2text 代码中没有后门函数
ret2shellcode checksec看没有RWE相关的东西
ret2libc1 既有system,又有 /bin/sh
ret2libc2 只有system 自己输入/bin/sh
ret2libc3 还给了一个libc.so文件

image.png

image.png

泄露got表中put函数的地址,从libc中找到puts函数和system函数的距离,就可以算出system函数的地址了

泄露got表中put函数的地址方法:

image.png

image.png

打印了好多东西,这些东西是put函数执行的,所以put函数已经执行过了,got表里面就有值了

image.png

image.png

ida中找不到/bin/sh和sh,可以用strings找个含有sh的字符串

image.png

整体的攻击脚本:
image.png

sendlineafter 当收到第一个参数之后,就发送第二个参数+/n输出

cyclic是用来填充垃圾数据的

image.png

课后题1:ret2text

image.png

image.png

image.png

image.png

课后题2:ret2shellcode

image.png

image.png
ASLR,不知道写到栈上的地址是什么?所以题目就告诉了

image.png

image.png

nop

image.png

image.png

asm是把汇编代码变成机器码

image.png

课后题3:ret2libc system有 /bin/sh也有

image.png

image.png

有了system,在plt表里面有个表项目

image.png

image.png
image.png

image.png

image.png

daedbeef是垃圾数据

image.png

课后题4:x64

image.png

image.png

1
ROPgadget --binary 文件名 --only "pop|ret" | grep rsi

image.png

image.png

image.png

return 将栈顶的值指向rip

rip:pop_rdi_ret

rdi: /bin/sh
rip: system

system取rdi中的参数,执行system(“/bin/sh”)

image.png
都是先传参,再调用函数

64位ROP小技巧 csu(不是一个完整的攻击,只是ROP中间的一个技巧)

image.png

jz z是1就jump z是0就向下执行

课后题5:

image.png

image.png

没有system
1)找到libc的真实地址 之前那个题是题目给提供了一个函数,然后给打印出来了

没有/bin/sh
1)有没有其他符号末尾有sh,可以调用
2)用rop将/bin/sh读入缓冲区,而且地址是固定的,例如bss
3)泄露了libc的地址,可以用libc里面的任何东西

image.png

有sh,不一定是可用的

image.png

libc里面有/bin/sh,可以用的
image.png

image.png

但是有write函数

day6

格式化字符串

字符串截断

1
2
3
4
hello world\x00password
hello world\x41password

printf("%p", "Hello world")

通过%p泄露出canary,构造exp的时候再填回去

%p是把栈上的值直接打印出来
%s是把栈上的值当成一个地址,把这个地址指向的内容打印出来

image.png

image.png

image.png

取第3个参数

image.png

image.png

%n 任意地址写

image.png

%hhn 一个字节
%hn 两个字节
%n 四个字节

例题1

image.png

image.png

练习题2

image.png

image.png

image.png

image.png

64位 前6位参数存到了寄存器中

mmap memory map

image.png

image.png

image.png

image.png

day1

image.png

image.png

0x8 0x10 0x18 0x20

image.png

image.png

1
p ptr

image.png

previous size复用
因为previous size表示上一个chunk是free chunk的size大小,此时上一个chunk不是free chunk,所以这个previous size就没用了

fashbin中的size,即使free掉,最后一位也还是1

image.png

物理链表:看上一个chunk是不是空闲,然后合并
逻辑链表:如下图

image.png

image.png

unsorted bin

只有fastbin和?是单向的,其他的bin都是双向的

image.png

image.png
how2heap

image.png

gdb6433

day2

unsorted bin绝大多数是为了fastbin创造条件的
unsorted bin 双向链表
house of xxx 一般是多个漏洞的结合

image.png

fsb  - format string bug 格式化字符串漏洞

练习题

最简单、最模板化的堆题目

image.png

image.png

去除了符号表

image.png

fastbin 后进先出

image.png

image.png

image.png

image.png
f2def47484f422d3854051967a63483.png

image.png

image.png


【ctf系列】pwn学习
http://example.com/2023/08/14/ctf/unsupported/【ctf系列】pwn学习/
作者
ningan123
发布于
2023年8月14日
许可协议