Here's an strace. HTH.
root:~# printf "%s\0%s\0%s\0" bob s3cr3t Y2009 | strace checkpassword true 3<&0 execve("/bin/checkpassword", ["checkpassword", "true"], [/* 21 vars */]) = 0 open("/dev/urandom", O_RDONLY) = 4 read(4, "\256\17\273\37\16\272d\267"..., 8) = 8 close(4) = 0 arch_prctl(ARCH_SET_FS, 0x603020) = 0 read(3, "bob\0s3cr3t\0Y2009\0"..., 512) = 19 read(3, ""..., 493) = 0 close(3) = 0 open("/etc/passwd", O_RDONLY) = 3 lseek(3, 0, SEEK_END) = 1935 mmap(NULL, 1935, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f0dcbb67000 close(3) = 0 munmap(0x7f0dcbb67000, 1935) = 0 open("/etc/shadow", O_RDONLY) = 3 lseek(3, 0, SEEK_END) = 1417 mmap(NULL, 1417, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f0dcbb67000 close(3) = 0 munmap(0x7f0dcbb67000, 1417) = 0 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffd3b67030) = -1 EINVAL (Invalid argument) _exit(1) = ?
Here's an strace. HTH.
root:~# printf "%s\0%s\0%s\0" bob s3cr3t Y2009 | strace checkpassword true 3<&0 "/bin/checkpass word", ["checkpassword", "true"], [/* 21 vars */]) = 0 dev/urandom" , O_RDONLY) = 4 273\37\ 16\272d\ 267"... , 8) = 8 ARCH_SET_ FS, 0x603020) = 0 0Y2009\ 0"..., 512) = 19 0x7f0dcbb67000, 1935) = 0 0x7f0dcbb67000, 1417) = 0
execve(
open("/
read(4, "\256\17\
close(4) = 0
arch_prctl(
read(3, "bob\0s3cr3t\
read(3, ""..., 493) = 0
close(3) = 0
open("/etc/passwd", O_RDONLY) = 3
lseek(3, 0, SEEK_END) = 1935
mmap(NULL, 1935, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f0dcbb67000
close(3) = 0
munmap(
open("/etc/shadow", O_RDONLY) = 3
lseek(3, 0, SEEK_END) = 1417
mmap(NULL, 1417, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f0dcbb67000
close(3) = 0
munmap(
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffd3b67030) = -1 EINVAL (Invalid argument)
_exit(1) = ?