The first thing to do is to determine the overlapping rectangle in geospatial coordinates. To do this, you get the geotransform for each source image:
gt1 = ds1.GetGeoTransform()
# r1 has left, top, right, bottom of dataset's bounds in geospatial coordinates.
r1 = [gt1, gt1, gt1 + (gt1 * ds1.RasterXSize), gt1 + (gt1 * ds1.RasterYSize)]
# Do the same for dataset 2 ...
intersection = [max(r1, r2), min(r1, r2), min(r1, r2), max(r1, r2)]
Then convert that rectangle into pixels for each image by subtracting the top and left coordinates and dividing by the pixel size, rounding up.
From here you can call
ReadRaster() on each image, giving it the pixel extents you've just calculated:
band.ReadRaster(px1, px1, px1 - px1, px1 - px1, px1 - px1, px1 - px1,
# <band's datatype here>
I'm a bit tired, so if this doesn't make much sense, let me know!