Faits: A. Le 26 février 2012, X._ a été arrêté dans le cadre d'une instruction conduite par le Ministère public du canton de Genève (ci- après: le Ministère public) et portant sur un trafic de stupéfiants. Il lui est reproché en substance d'avoir pris part à un trafic d'héroïne et d'avoir hébergé des personnes séjournant illégalement en Suisse. Le Tribunal des mesures de contrainte du canton de Genève (ci-après: le Tmc) a ordonné la détention provisoire de X._ jusqu'au 28 mai 2012. Par ordonnance du 29 mai 2012, cette détention a été prolongée jusqu'au 29 juillet 2012. Le prénommé a présenté une requête de mise en liberté provisoire le 21 juin 2012. Par ordonnance du 27 juin 2012, le Tmc a rejeté cette requête, au motif qu'il existait des charges suffisantes ainsi que des risques de fuite et de réitération. Statuant sur recours de l'intéressé, la Chambre pénale de recours de la Cour de justice du canton de Genève (ci-après: la Cour de justice) a confirmé cette décision par arrêt du 31 juillet 2012. Elle a retenu que les charges étaient suffisantes, que les risques précités étaient bien réalisés et que le principe de la proportionnalité était respecté. Le 19 juillet 2012, le Ministère public a renvoyé X._ en jugement pour infraction à la loi fédérale sur les stupéfiants (LStup; RS 812.121) et violation de la loi fédérale sur les étrangers (LEtr; RS 142.20). Par ordonnance du 20 juillet 2012, le Tmc a ordonné sa mise en détention pour des motifs de sûreté, en retenant notamment l'existence des risques de fuite et de réitération. B. Agissant par la voie du recours en matière pénale, X._ demande au Tribunal fédéral d'annuler l'arrêt de la Cour de justice et d'ordonner sa mise en liberté immédiate, subsidiairement de renvoyer la cause à l'instance précédente pour nouvelle décision. Il requiert en outre l'octroi de l'assistance judiciaire. La Cour de justice et le Ministère public ont renoncé à se déterminer.