Programming a 3.3V device via ISP

Whenever I program another device through Arduino ISP, I connect the VCC wire to the 5V line and feed that to the target. But, if the target is a 3.3V device, can I connect VCC to the 3.3V pin on my Arduino, or do I need 5V specifically to program the target? And if I specifically need 5V, how do I go about programming the target when it has 3.3V components that will go up in smoke when fed 5V?

Programming should work at 3.3V...

I have successfully programmed ATtiny processor down to their minimum voltage with the target running from batteries. The first time around, I used a simple voltage divider for SCK and MOSI. For MISO, I used a pair of 2N2222 transistors to form a level shifter. I believe RESET works as-is because ArduinoISP manipulates it as an open-collector.

I believe Limor Fried (Lady Ada) uses a simple buffer IC to level shift on her SD card shield. The part she uses and the wiring are well documented. The same technique should work well for ISP programming. (I vaguely recall doing something similar.)

With the target running at 3.3V, you may not need to do anything special to MISO. You do need to reduce the voltage from the Arduino to the target.

Be sure to include series resistors (200 to 1000 ohms seems to be popular) until you are confident you have something correct.

I use Atmel AVR ISP MLKii for 3.3V programming. It does not power the board, but only senses the Vcc level and adjusts its outputs accordingly.