You can find where the PNG headers and data regions are with a tool like hachoir, but that won't save you, because the problem is not here.
The problem is not only about headers, since you deal with a compressed format (PNG), the "data" region is not a dumb bitmap where bits can be changed and let the file be valid, format-wise.
Compressed data contains some kind of "instructions" that the decompresser algorithm shall process in order to reconstruct the decompressed data. In a way, a compressed data format is a kind of domain-specific binary language, that the decompresser parses and interprets.
Taking a valid program in this language (a valid PNG file with valid compressed data region) and twiddling bits at random can yield to another valid program (another valid PNG) according to this specific language, or not.
For example, the naive RLE algorithm produces a sequence of {byte content, occurrence count} bytes. Change one bit in the "occurrence count" byte, and suddenly the decompressed data has a different number of bytes than the expected number width * height * depth
, so the image should reasonably be considered as corrupted.
For a positive ending, if the program refuses to open the fuzzed PNG without crashing, exhausting CPU/memory resources or formatting your hard drive, then the program just behaves correctly, which is a good thing (but remember, not finding any bug doesn't mean there aren't, it only means you didn't find them).
If you really want to fuzz the image data and nothing else, what you need is a fuzzer that works on the decompressed data. I don't know if it exists but then it needs to be fully aware of the formats you want to use it with (PNG, MP3, etc.), it can't be a generic binary fuzzer.