kicked
eax=00000000 ebx=00000001 ecx=00000000 edx=00ff0ad0 esi=77e57ea1 edi=0012fcbc eip=00401130 esp=0012fc10 ebp=77e58299 iopl=0 nv up ei pl zr na po nc cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000246 00401106 81fa5f8f4b42 cmp edx,0x424b8f5f 0040110c 5f pop edi 0040110d 5a pop edx 0040110e 0f8428ffffff je 0040103c 00401114 64ff3500000000 push dword ptr fs:[00000000] fs:00000000=???????? 0040111b 682cceda04 push 0x4dace2c 00401120 8d6c1130 lea ebp,[ecx+edx+0x30] ds:0185a9b7=???????? 00401124 2bea sub ebp,edx 00401126 8d6c15d0 lea ebp,[ebp+edx+0xd0] ss:0185a9b7=???????? 0040112a 2bea sub ebp,edx 0040112c e9f4ffffff jmp 00401125 00401131 ec in al,dx 00401132 08e9 or cl,ch 00401134 0100 add [eax],eax ds:00000000=???????? 00401136 0000 add [eax],al ds:00000000=?? 00401138 195257 sbb [edx+0x57],edx ds:0185a9b6=???????? 0040113b 55 push ebp 0040113c 33d2 xor edx,edx 0040113e e873000000 call 004011b6 00401143 59 pop ecx 00401144 4f dec edi 00401145 2cdf sub al,0xdf
(続き)
そもそもIPが合ってないので意味はないのだけど、それにしてもなんだろなこれは。ええとまず401126、disp8は符号拡張されるので+0D0hはわとすん君の逆汗が間違いで-30hが正しい。しかるにleaは命令名*1の通り単にEA計算するだけであって、つまり401120から4命令を消費して
00401120 8d6c1130 lea ebp, [ecx+edx+30h] ebp ← ecx + edx + 30h 00401124 2bea sub ebp, edx ebp ← ebp - edx 00401126 8d6c15d0 lea ebp, [ebp+edx-30h] ebp ← ebp + edx - 30h 0040112a 2bea sub ebp, edx ebp ← ebp - edx
全体で ebp ← (((ecx + edx + 30h) - edx) + edx - 30h) - edx となるが、これは結局 ebp ← ecx であって他に副作用は何一つ無い。
・・・まあこれはこれで本当にいったい何がしたかったのか疑念は残るけれど、実のところそんなことはどでもよくてだな、本題はIntelニモニックにC臭い0x使うってのは非常に悪趣味に思えることなのでした。まる。
無意味の続き。40112Cのjmpがたかが-12の飛距離なのにshortでなくnearな時点でなんだか微妙な気分がするわけで、状況証拠的には謎packerあたりが何かfixupを大間違いしてコードをブチ壊しているように見える。以下根拠。後続の401131は普通に考えておかしいけれど、かといってtableの類を踏んだようにも見えないわけで、どちらかというと401133のE9がやっぱり jmp near のE9なのだろうから、そうすると401131は2バイト命令だったはずである。同様に401138も見るからに非常識であって、どちらかというと401138は1バイト命令で401139から(あるいは401138から)pushの連続だったのであろう。すなわち2箇所の見るからに非常識なゴミは共に謎っぽい jmp near の直後1バイトなわけで、しかも問題のjmpもそのままでは飛び先が実に不自然であって、このdisp32を書き換えようとして場所を1バイト間違えたと考えるとすんなりつじつまが合いそうである。
0040110c 5f pop edi 0040110d 5a pop edx 0040110e 0f8428ffffff je $0040103c 00401114 64ff3500000000 push dword ptr fs:[0] 0040111b 682cceda04 push 4DACE2Ch 00401120 8d6c1130 lea ebp, [ecx+edx+30h] 00401124 2bea sub ebp, edx 00401126 8d6c15d0 lea ebp, [ebp+edx-30h] 0040112a 2bea sub ebp, edx 0040112c e9f4ffffff jmp $00401125 ←? 00401131 ??08 ??? 00401133 e901000000 jmp $00401139 ←? 00401138 ?? ??? 00401139 52 push edx 0040113a 57 push edi 0040113b 55 push ebp 0040113c 33d2 xor edx, edx 0040113e e873000000 call $004011b6 00401143 59 pop ecx 00401144 4f dec edi 00401145 2cdf sub al, 0DFh
では401131は何だったのだろう? 2バイト目の08がimmed8ってことは・・・まあなさそうだからなしとして、short branch のdisp8なら飛び先は40113B・・・これも文脈的に難易度高すぎるか。となるとやはりmod-reg-r/mバイトであろうからオペランドは(第一バイトのdwビットを01と仮定して)推定 [eax],ecx になる。
とりあえず fs:[0] が見えているからにはこれで総じて例外ハンドラの類のはずなんだけど・・・ほんとなにやってんだコレ。まさか xor eax, dword ptr 0 なんて剛毅なことはいわないと信じたいんだけど。
*1:Load Effective Address