ctfshow-pwn01

直接nc连接后即可获得flag(好吧,我也不知道为什么会如此……)

pwn1-1

pwn1-2

ctfshow-pwn02

pwn2-1

将stack文件下载后拖入pwn机

file命令查看stack是32位的文件

pwn2-2

checksec命令执行查看保护机制:栈不可执行(canary)

pwn2-3

然后将文件,拖入IDA进行静态分析,按F5进入主函数

pwn2-4

setvbuf(貌似是定义输入输出流?好像不用管它)
其他函数都很好懂 进入pwnme函数看一下

pwn2-5

(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
ebp决定他有9个字节,但其实可以输入更多的字节,那就造成了栈溢出,想到ret2text

接下来要计算填充数据
pwn2-6

IDA观察可得s有9个字节

接下来我们来找找system的地址

shift+F12看返回地址

pwn2-7

找到/bin/sh

双击进入

pwn2-8

CTRL+X交叉引用(这里应该会有弹窗,直接选择OK就行)

pwn2-9

直接F5进去查看函数

pwn2-10

按TAB键返回,显现地址后并找到地址

pwn2-11

我们在pwn机中用cyclic来进行一番测试,首先cyclic 200生成一个随机字符串,然后gdb调试程序

pwn2-12

然后输入r,粘贴前面生成的字符串,发现程序报错

pwn2-13

EIP本该执行一个地址,但这个地址是随机输入的就报错了

计算eip的偏移量

pwn2-14

编写exp文件

1
2
3
4
5
6
7
from pwn import*
# p = process('./stack')
p = remote('pwn.challenge.ctf.show',)
add_addr = 0x804850F
payload = b'A'*13+p32(add_addr)
p.sendline(payload)
p.interactive()

执行脚本后,cat flag获得flag