Level16에서 shell()이 없어졌습니다.
setreuid가 main() 안으로 들어갔습니다.
shell code를 집어넣고 해당 위치로 함수포인터를 돌려버리면 되겠습니다.
일단 gdb로 뜯어봅니다.

buf의 주소 0xffffffc8 (%ebp)와 함수포인터의 주소 0xfffffff0 (%ebp)의 거리는 40(0x28)입니다.
40 안에 shell code를 넣고 해당 위치로 함수포인터를 돌리면 됩니다.
shell code는 40보다 작은 것으로 사용하면 됩니다.
함수포인터에 덮어씌울 buf의 시작주소를 알아봅니다.

0xbffffaf0부터 buf가 시작됩니다.
공격해봅니다.

안됩니다.
아왜
또 주소가 바뀐 듯 합니다.
gdb에서 사용한 주소보다 공격할 때 사용한 주소가 더 짧으니
함수포인터에 덮어씌울 주소를 16-byte 크게 해서 다시 공격해봅니다.

level18의 shell이 떨어졌습니다.