reversing.kr ImagePrc
今回の問題は以下のようなBitmapの推論問題である。
![](https://assets.st-note.com/img/1715525947402-cfXXuTebhl.png)
早速IDA Proによりデバッグしてもると、以下のような流れを確認できる。
まず、CreateCompatibleBitmap関数により、200x150のピクセルを持ったbitmapを生成する。
![](https://assets.st-note.com/img/1715526218834-S7a3sZhE3t.png?width=1200)
次に、GetDIBits関数からポインターされているBitmapのBitを検索して、bufferにコピーする。
![](https://assets.st-note.com/img/1715526438743-yFvFxOfy4n.png?width=1200)
上記のコードからわかるのは、このプログラムが受けるデータは0x18、つまり、24BitのBitmapとなっていることである。
そして、文字列を検索すると、入力されたデータが間違えてることを示す
演算が存在することを確認できる。
![](https://assets.st-note.com/img/1715526680876-JBch2uhpwq.png)
そして、この文字列はLoc_4013CD関数から呼び出されていて、さらにその関数はLoc_4013A3から呼び出されていることが確認できる。
![](https://assets.st-note.com/img/1715526802503-F5Pj2e5cJU.png?width=1200)
この時、4013A3から、描かれたBitmapデータを比較する。もっと詳しく見るために以下のコードに着目する。
![](https://assets.st-note.com/img/1715527021802-mBKZ5k7EE1.png?width=1200)
ecx レジスタには描かれたBitmapデータのポインタ(&esi)が入って、LoadResource関数により比較の元となるデータ(eax+ecx)が1byteごとに呼び出され、それを90000byteの大きさまで比較して、間違ってる場合には、Wrongを出力する。
![](https://assets.st-note.com/img/1715527514333-Zozf87KEJV.png)
実際に実行して見ると、FFFFFFFのようなBitmapデータが確認できる。
以上の結果からeax+ecxからその90000byteまでデータを出力して、Bitmapを作ると、以下のような答えを得る。
![](https://assets.st-note.com/img/1715527683148-Pmo0w0pQ21.png)
この記事が気に入ったらサポートをしてみませんか?