Oppin käänteisinsinööriä. Joten koodaan joitain ohjelmia ja yritän ymmärtää niiden kokoonpanoa. Törmäsin utelias tapaukseen, enkä usko, että en pysty ratkaisemaan sitä yksin.
Tässä on c-koodi:
#include <stdio.h>int main () {char * texto = "O numero e% d \ n"; int i = 10; while (i) {printf (texto, i -);} return 0;}
IDA: n tuottama kokoonpano on seuraava:
mov eax, [esp + 28] lea edx, [eax-1]; Osa jota en ymmärrämov [esp + 28], edxmov [esp + 4], eaxmov eax, [esp + 18h] mov [esp], eax; char * call _printf
Ymmärrän sen, että se tallentaa vanhan arvon eax: iin ja työntää pinoa (en tarkoituksella ole ottanut optimointia käyttöön) ja työntää sitten muodon. se tapahtuu keskellä, se tekee i--
, mutta en ymmärrä miten se toimii. Joten se saa osoitteen eax-1
ja tallentaa edx
-kansioon ja tallentaa sen sitten i
-kohtaan, mutta eax
ei sisällä osoitetta vaan arvoa.
Kiitos etukäteen.