Display one post based on ID from $_GET

If you want to reach the “single” page of a custom post type (or even a regular post), you can do this by going to http://example.com?p=[post_id]&post_type=[post_type_name]. If you use Pretty permalinks WordPress will redirect you to the “canonical” link, which may look like http://example.com/my-post-type/my-post-name/.

So by changing the target of your form and the post_id hidden input to p it should work:

<form class="product_form" action="checkout" method="get" target="<?php home_url(); ?>">
<input name="p" type="hidden" value="<?=$post->ID?>"/>
<input type="image" src="https://wordpress.stackexchange.com/questions/17532/<?php  bloginfo("template_url'); ?>/images/buy.png' class="wpsc_buy_button" /> 
</form>