Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
CÓïÑÔº¯Êýµ÷ÓÃÕ»(Èý)
 
×÷Õߣºclover_toeic À´Ô´£º²©¿ÍÔ°  ·¢²¼ÓÚ£º2015-01-07
  4478  次浏览      28
 

6 µ÷ÓÃջʵÀý·ÖÎö

±¾½Úͨ¹ý´úÂëʵÀý·ÖÎöº¯Êýµ÷Óùý³ÌÖÐÕ»Ö¡µÄ²¼¾Ö¡¢ÐγɺÍÏûÍö¡£

6.1 Õ»Ö¡µÄ²¼¾Ö

ʾÀý´úÂëÈçÏ£º

//StackReg.c
#include 

//»ñÈ¡º¯ÊýÔËÐÐʱ¼Ä´æÆ÷%ebpºÍ%espµÄÖµ
#define FETCH_SREG(_ebp, _esp)     do{\
    asm volatile( \
        "movl %%ebp, %0 \n" \
        "movl %%esp, %1 \n" \
        : "=r" (_ebp), "=r" (_esp) \
    ); \
}while(0)
//Ò²¿ÉʹÓÃgccÀ©Õ¹register void *pvEbp __asm__ ("%ebp"); register void *pvEsp __asm__ ("%esp");»ñÈ¡£¬
// pvEbpºÍpvEspÖ¸Õë±äÁ¿µÄÖµ¾ÍÊÇFETCH_SREG(_ebp, _esp)ÖÐ_ebpºÍ_espµÄÖµ

#define PRINT_ADDR(x)     printf("[%s]: &"#x" = %p\n", __FUNCTION__, &x)
#define PRINT_SREG(_ebp, _esp)     do{\
    printf("[%s]: EBP      = 0x%08x\n", __FUNCTION__, _ebp); \
    printf("[%s]: ESP      = 0x%08x\n", __FUNCTION__, _esp); \
    printf("[%s]: (EBP)    = 0x%08x\n", __FUNCTION__, *(int *)_ebp); \
    printf("[%s]: (EIP)    = 0x%08x\n", __FUNCTION__, *((int *)_ebp + 1)); \
    printf("[%s]: &"#_esp"  = %p\n", __FUNCTION__, &_esp); \
    printf("[%s]: &"#_ebp"  = %p\n", __FUNCTION__, &_ebp); \
}while(0)

void tail(int paraTail){
    int locTail = 0;
    int ebpReg, espReg;

    FETCH_SREG(ebpReg, espReg);
    PRINT_SREG(ebpReg, espReg);
    PRINT_ADDR(paraTail);
    PRINT_ADDR(locTail);
}
int middle(int paraMid1, int paraMid2, int paraMid3){
    int ebpReg, espReg;
    tail(paraMid1);

    FETCH_SREG(ebpReg, espReg);
    PRINT_SREG(ebpReg, espReg);
    PRINT_ADDR(paraMid1);
    PRINT_ADDR(paraMid2);
    PRINT_ADDR(paraMid3);
    return 1;
}
int main(void){
    int ebpReg, espReg;
    int locMain = middle(1, 2, 3);

    FETCH_SREG(ebpReg, espReg);
    PRINT_SREG(ebpReg, espReg);
    PRINT_ADDR(locMain);
    return 0;
}

StackReg

¸Ã³ÌÐòÿ¸öº¯Êý¶¼Ç¶Èë»ã±à´úÂ룬ÒÔ»ñÈ¡¸÷º¯ÊýÔËÐÐʱ¿ÌEBPºÍESP¼Ä´æÆ÷µÄÖµ¡£Ã¿¸öº¯Êý¶¼´òÓ¡³öEBP¼Ä´æÆ÷ËùÖ¸ÏòÄÚ´æµØÖ·´¦µÄÖµ£¬ÒÔ¼°Î»ÓÚÆäºóµÄº¯Êý·µ»ØµØÖ·¡£Í¼7¸ø³ö³ÌÐòµÄ±àÒëºÍÔËÐнá¹û¡£

ͼ7 StackRegÔËÐнá¹û

Ϊ±ãÓÚÀí½âÊä³ö½á¹ûÖÐÊý¾Ý¼äµÄ¹ØÏµ£¬½«Æäת»¯ÎªÍ¼8Ëùʾ¡£Í¼×ó»¹Ê¾³öÕ»µÄÔö³¤·½ÏòºÍÕ»µÄÄÚ´æµØÖ·¡£ºÚÉ«¼ýÍ·ºÍ¼Ä´æÆ÷Ãû±íʾµ±Ç°Õ»Ö¡£¬·ñÔòÓûÒÉ«±íʾ¡£Í¼Öбíʾtailº¯ÊýÄÚËù¿´µ½µÄÕ»²¼¾Ö£¬ÆäÖÐÍêÕûʾ³ötailºÍmiddleº¯ÊýµÄÕ»Ö¡½á¹¹£¬ÒÔ¼°mainº¯ÊýµÄ²¿·Ö¡£×¢Ò⣬ÐβÎ1¡¢2¡¢3(³£Á¿)²»ÔÚÕ»ÄÚ¡£

ͼ8 StackRegÕ»Ö¡²¼¾Ö

ͨ³£Ã¿¸öº¯Êý¶¼ÓÐ×Ô¼ºµÄÕ»Ö¡¡£¸÷Õ»Ö¡Öдæ·Åǰһ¸öµ÷Óú¯ÊýµÄÕ»Ö¡»ùÖ·£¬Í¨¹ý¸ÃµØÖ·Óò½«ËùÓÐÖ÷µ÷º¯ÊýÓë±»µ÷º¯ÊýµÄÕ»Ö¡ÒÔÁ´±íÐÎʽÁ¬ÔÚÒ»Æð¡£º¯Êýµ÷Óü¶ÊýÔ½¶à£¬Õ¼ÓõÄÕ»¿Õ¼äÒ²Ô½´ó£¬Òò´ËӦСÐÄʹÓõݹ麯Êý¡£

6.2 Õ»Ö¡µÄÐγÉ

Ϊ·½±ã½²½â£¬»ñÈ¡StackRegʾÀý³ÌÐòËù¶ÔÓ¦µÄ»ã±à´úÂëÆ¬¶Î£¬Èçͼ9Ëùʾ¡£ÔÚ»ã±à´úÂëÖУ¬×î×óÁÐΪָÁîÔÚÄÚ´æÖеĵØÖ·£¬Õ»Ö¡Öеķµ»ØµØÖ·(return address)¼´Ö¸´ËÀàµØÖ·¡£×îÓÒÁÐΪ´ýÖ´ÐеĻã±àÖ¸ÁîÓï¾ä£¬ÖмäÁÐΪ¸ÃÖ¸ÁîÔÚ´úÂë¶ÎÖеÄ16½øÖƱíʾ£¬¿É¼ûpush %ebpÖ¸Áî½öÕ¼Ò»¸ö×Ö½Ú(0x55)¡£Ã¿´ÎCPUÖ´Ðж¼ÒªÏȶÁÈ¡%eip¼Ä´æÆ÷Öµ£¬È»ºó¶¨Î»µ½%eipÖ¸ÏòµÄ»ã±àÖ¸ÁîÄÚ´æµØÖ·£¬¶ÁÈ¡¸ÃÖ¸Áî²¢Ö´ÐС£¶ÁȡָÁî»áʹ%eip¼Ä´æÆ÷ÖµÔö¼ÓÏàÓ¦Ö¸ÁîµÄ³¤¶È(×Ö½ÚÊý)£¬Ö´ÐÐÖ¸Áîºó%eipֵΪÏÂÌõ´ýÖ´ÐÐÖ¸ÁîµÄÌø×ªµØÖ·¡£

ͼ9 StackReg»ã±àƬ¶Î

¼ÙÉè³ÌÐòÔËÐÐÔÚmain¸Õµ÷ÓÃmiddleº¯Êýʱ£¬¹Û²ìÕ»Ö¡²¼¾ÖÈçºÎ±ä»¯¡£³ÌÐò½øÈëmiddleº¯ÊýËùÔËÐеĵÚÒ»ÌõÖ¸ÁîλÓÚÄÚ´æµØÖ·0x804847c´¦£¬ÔÚÔËÐиÃÖ¸Áî֮ǰµÄÕ»Ö¡½á¹¹Èçͼ10Ëùʾ¡£´ËʱEBPÖ¸Ïòmainº¯ÊýÕ»Ö¡µÄÍ·²¿£¬¶øESPËùÖ¸ÏòµÄÄÚ´æÖдæ·Å³ÌÐò·µ»Øµ½mainº¯ÊýµÄÖ¸ÁîλÖÃ(0x080485c5)¡£

ͼ10 StackRegÔËÐÐÖÐÕ»Ö¡½á¹¹-1

±»µ÷º¯ÊýÔÚµ÷Óúó»ñµÃ³ÌÐòµÄ¿ØÖÆÈ¨£¬½Ó×ÅÐèÍê³É3Ï×÷£º½¨Á¢×Ô¼ºµÄÕ»Ö¡£¬Îª¾Ö²¿±äÁ¿·ÖÅä¿Õ¼ä£¬°´Ðè±£´æ¼Ä´æÆ÷%ebx¡¢%esiºÍ%ediµÄÖµ¡£

ÄÚ´æµØÖ·0x804847c¡«0x804847fµÄÖ¸ÁîÓÃÓÚÐγÉmiddleº¯ÊýµÄÕ»Ö¡¡£µÚÒ»ÌõÖ¸Áî(λÓÚµØÖ·0x804847c´¦£¬¼ò³Æ<Ö¸Áî804847c>)½«Ö÷µ÷º¯ÊýmainµÄÕ»Ö¡»ùÖ·±£´æµ½Õ»ÉÏ(ѹջ²Ù×÷)£¬¸ÃµØÖ·ÓÃÓÚ´Ó±»µ÷º¯Êý¶ÑÕ»·µ»Øµ½Ö÷µ÷º¯ÊýmainÖС£ÕýÊǸ÷º¯ÊýÄÚµÄÕâÒ»²Ù×÷£¬Ê¹µÃËùÓÐÕ»Ö¡Á¬ÔÚÒ»Æð³ÉΪһÌõÁ´¡£

<Ö¸Áî804847d>½«%esp¼Ä´æÆ÷µÄÖµ¸³Öµ¸ø%ebp¼Ä´æÆ÷£¬´Ëʱ%ebp¼Ä´æÆ÷Öдæ·Åµ±Ç°º¯ÊýµÄÕ»Ö¡»ùÖ·£¬ÒÔ±ã¸ù¾ÝÆ«ÒÆÁ¿·ÃÎʶÑÕ»ÖеIJÎÊý»ò±äÁ¿¡£ÕâÑù±ã¿ÉÌÚ³ö%esp¼Ä´æÆ÷ÒÔ×÷ËûÓ㬲¢ÔÚÐèҪʱ¸ù¾Ý%ebpÖµ´Óµ±Ç°º¯ÊýÕ»¶¥Ö±½Ó·µ»ØÕ»µ×¡£

<Ö¸Áî804847f>¶Ô%esp½øÐмõ²Ù×÷£¬¼´½«%espÏòµÍµØÖ·´¦Òƶ¯40(0x28)¸ö×Ö½Ú£¬ÒÔ±ãÔÚÕ»ÉÏÌÚ³ö¿Õ¼äÀ´´æ·Å¾Ö²¿±äÁ¿ºÍÁÙʱ±äÁ¿¡£

ÔËÐÐÍêÉÏÊöÈýÌõÖ¸Áîºó£¬middleº¯ÊýµÄÕ»Ö¡¾ÍÒÑÐγɣ¬Èçͼ11Ëùʾ¡£Í¼Öл¹Ê¾³ö¸Ãº¯ÊýÄڵľֲ¿±äÁ¿ebpRegºÍespRegÔÚÕ»Ö¡ÖеÄλÖá£

ͼ11 StackRegÔËÐÐÖÐÕ»Ö¡½á¹¹-2

Ëæºó£¬½«Ö´ÐÐmiddleº¯ÊýÌå¡£Ö´Ðйý³ÌÖÐÖ¡»ùÖ¸ÕëEBP±£³Ö²»±ä£¬Í¨¹ý¸ÃÖ¸Õë¼ÓÆ«ÒÆÁ¿¼´¿É·ÃÎʺ¯Êýʵ²Î¡¢¾Ö²¿±äÁ¿ºÍÁÙʱ´æ´¢ÄÚÈÝ¡£¼´Ê¹middleº¯ÊýÄÚµ÷ÓÃÆäËûº¯Êý(Èçtail)£¬ÉõÖÁµÝ¹éµ÷ÓÃmiddle×ÔÉí£¬Ö»ÒªÔÚÕâЩ×Óµ÷Ó÷µ»ØÊ±»Ö¸´EBP£¬¾Í¿É¼ÌÐøÓÃEBP¼ÓÆ«ÒÆÁ¿µÄ·½Ê½·ÃÎÊʵ²ÎµÈÐÅÏ¢¡£

<Ö¸Áî804848d>ºÍ<Ö¸Áî804848f>ÊÇmiddleº¯ÊýÖÐÄÚǶµÄ»ã±à´úÂ룬ÓÃÓÚ»ñÈ¡´Ëʱ%ebpºÍ%esp¼Ä´æÆ÷µÄÖµ¡£<Ö¸Áî8048491>½«%ebp¼Ä´æÆ÷Öµ·ÅÈë¾Ö²¿±äÁ¿ebpRegÖУ¬<Ö¸Áî8048494>Ôò½«%esp¼Ä´æÆ÷Öµ·ÅÈë¾Ö²¿±äÁ¿espRegÖС£ÆäÖУ¬0xfffffffc(%ebp)µÈÓÚ(%ebp - 4)£¬±íʾÔÚÖ¡»ùÖ¸ÕëÏòµÍµØÖ·Æ«ÒÆËÄ×ֽڵĵØÖ·´¦´æ´¢µÄÄÚÈÝ(Æ«ÒÆÁ¿Óò¹Âë±íʾ£¬¸ºÖµ±íʾÏòµÍµØÖ·Æ«ÒÆ)¡£

<Ö¸Áî8048482>ºÍ<Ö¸Áî8048485>½«mainº¯ÊýÖд«µÝÀ´µÄµÚÒ»¸ö±äÁ¿paraMid1Öµ¿½±´µ½%esp¼Ä´æÆ÷ËùÖ¸ÏòµÄÄÚ´æÖУ¬Îªµ÷ÓÃtailº¯Êý×¼±¸Êµ²Î¡£´Ëʱջ¿Õ¼äÈçͼ12Ëùʾ¡£

ͼ12 StackRegÔËÐÐÖÐÕ»Ö¡½á¹¹-3

<Ö¸Áî8048488>µ÷ÓÃtailº¯Êý£¬¸Ãµ÷Óý«·µ»ØµØÖ·(EIPÖ¸ÁîÖ¸Õë¼Ä´æÆ÷µÄÄÚÈÝ)ѹÈëÕ»ÖУ¬µ÷ÓøÃÖ¸ÁîºóµÄÕ»¿Õ¼äÈçͼ13Ëùʾ¡£Ñ¹Õ»µÄ·µ»ØµØÖ·ÊÇ0x804848d£¬´Óͼ9Öпɿ´³ö¸ÃµØÖ·Ö¸Ïòmiddleº¯ÊýÄÚµ÷ÓÃtailº¯ÊýµÄºóÒ»ÌõÖ¸Áµ±tailº¯Êý·µ»ØÊ±½«´Ó¸ÃµØÖ·´¦¼ÌÐøÔËÐгÌÐò¡£µ÷ÓÃ<Ö¸Áî8048488>Ò²Òâζ׎øÈëtailº¯ÊýµÄÕ»Ö¡£¬tailº¯Êý²ÉÓÃÓëmiddleº¯ÊýÏàͬ·½Ê½µÄ½¨Á¢×Ô¼ºµÄÕ»Ö¡¡£Ç°ÃæÍ¼8ËùʾÕýÊÇtailº¯Êý½¨Á¢Õ»Ö¡Ê±µÄÄÚ´æ²¼¾Ö¡£

ͼ13 StackRegÔËÐÐÖÐÕ»Ö¡½á¹¹-4

ͨ¹ýÒÔÉÏÔËÐÐʱ·ÖÎö£¬¿É¿´µ½º¯Êýµ÷Óùý³ÌÖжÑÕ»À©Õ¹Óë»Ö¸´µÄ¶¯Ì¬¹ý³Ì¡£%espºÍ%ebpÁ½¸ö¼Ä´æÆ÷Ö®¼äµÄ¸³ÖµÊ±»ú£¬ÕýÊÇÖ÷µ÷º¯ÊýºÍ±»µ÷º¯ÊýÖ°Ôð½»ÌæÖ®Ê±¡£Ò²ÕýÊǸÃʱ»úµÄÕýÈ·£¬²ÅÄܱ£Ö¤¶ÑÕ»µÄ»Ö¸´¡£

6.3 Õ»Ö¡µÄÏûÍö

ÔڰѳÌÐò¿ØÖÆÈ¨·µ»¹¸øÖ÷µ÷º¯Êýǰ£¬±»µ÷º¯ÊýÈôÓзµ»ØÖµ£¬ÔòÏȽ«Æä±£´æÔÚÏàÓ¦¼Ä´æÆ÷(ͨ³£ÊÇ%eax)ÖУ¬È»ºó°´Ðè»Ö¸´%ebx¡¢%esiºÍ%edi¼Ä´æÆ÷µÄÖµ£¬×îºó´ÓÕ»Àﵯ³ö·µ»ØµØÖ·¡£

ÏÂÃæ¹Û²ìtailº¯ÊýÄÚ½øÐк¯Êý·µ»ØÊ±Õ»¿Õ¼äÈçºÎ±ä»¯¡£<Ö¸Áî804847a>ΪleaveÖ¸Á½«%esp¼Ä´æÆ÷µÄÖµÉèÖÃΪ%ebp¼Ä´æÆ÷Öµ²¢×öÒ»´Îµ¯Õ»²Ù×÷£¬½«µ¯Õ»²Ù×÷µÄÄÚÈÝ·ÅÈë%ebp¼Ä´æÆ÷ÖС£¸ÃÖ¸ÁîµÄ¹¦ÄܵȼÛÓÚ"mov %ebp, %esp"¼Ó"pop %ebp"£¬¿É½«tailº¯ÊýËù½¨Á¢µÄÕ»Ö¡Çå³ý¡£¸ÃÖ¸ÁîÖ´ÐкóµÄÕ»²¼¾ÖÓëͼ13ÍêÈ«Ïàͬ¡£<Ö¸Áî804847b>ÓÃÓÚ½«Õ»Éϵķµ»ØµØÖ·µ¯³öµ½%eip¼Ä´æÆ÷ÖУ¬Ö´ÐиÃÖ¸Áîºó³ÌÐò·µ»Øµ½middleº¯ÊýµÄ0x804848dµØÖ·´¦¡£¸ÃÖ¸ÁîÖ´ÐкóµÄÕ»½á¹¹Óëͼ12Ïàͬ¡£

6.4 ·µ»Ø½á¹¹Ìå

·ÖÎöÒÔÏÂʾÀý³ÌÐò£º

//StackStrt.c
#include 

typedef struct{
    int member1;
    int member2;
    int member3;
}T_RET_STRT;

//FETCH_SREG/PRINT_SREG/PRINT_ADDRºê¶¨Ò壬ÂÔ(Ïê¼ûStackReg.c)
T_RET_STRT func(int paraFunc){
    T_RET_STRT locStrtFunc = {.member1=1, .member2=2, .member3=3};
    int ebpReg, espReg;

    FETCH_SREG(ebpReg, espReg);
    PRINT_SREG(ebpReg, espReg);
    PRINT_ADDR(paraFunc);
    printf("[%s]: (BelowPara) = 0x%08x\n", __FUNCTION__, *((int *)¶Func - 1));
    PRINT_ADDR(locStrtFunc.member1);
    PRINT_ADDR(locStrtFunc.member2);
    PRINT_ADDR(locStrtFunc.member3);
    return locStrtFunc;
}
int main(void){
    int ebpReg, espReg;
    T_RET_STRT locStrtMain = func(100);

    FETCH_SREG(ebpReg, espReg);
    PRINT_SREG(ebpReg, espReg);
    PRINT_ADDR(locStrtMain.member1);
    PRINT_ADDR(locStrtMain.member2);
    PRINT_ADDR(locStrtMain.member3);
    return 0;
}

StackStrt

¸ÃʾÀýÖУ¬mainºÍfuncº¯ÊýÄÚ¾ù¶¨ÒåÀàÐÍΪT_RET_STRTµÄ¾Ö²¿±äÁ¿£¬ÇÒfuncº¯ÊýµÄ·µ»ØÖµÀàÐÍÒ²ÊÇT_RET_STRT¡£±äÁ¿locStrtMainºÍlocStrtFuncµÄÄڴ潫·ÖÅäÔÚ¸÷×Ôº¯ÊýµÄÕ»Ö¡ÖУ¬ÄÇôfuncº¯ÊýµÄlocStrtFunc±äÁ¿ÖµÈçºÎͨ¹ýº¯Êý·µ»ØÖµ´«µÝµ½mainº¯ÊýµÄlocStrtMain±äÁ¿ÖУ¿±àÒë¸Ã³ÌÐò²¢ÔËÐÐÒÔ¹Û²ì½á¹û£¬Èçͼ14Ëùʾ¡£Í¼15ʾ³öfuncº¯ÊýÄÚËù¿´µ½µÄÕ»²¼¾Ö¡£

ͼ14 StackStrtÔËÐнá¹û

ͼ15 StackStrtÕ»Ö¡²¼¾Ö

´ÓͼÖпɿ´³ö£¬mainº¯Êýµ÷ÓÃfuncº¯Êýʱ³ý½«ºóÕßËùÐèµÄ²ÎÊýѹÈëÕ»ÖÐÍ⣬»¹½«¾Ö²¿±äÁ¿locStrtMainµØÖ·Ò²Ñ¹ÈëÕ»ÖУ»funcº¯Êý·µ»ØÊ±½«locStrtFunc±äÁ¿µÄֵͨ¹ý¸ÃµØÖ·Ö±½Ó¿½±´µ½mainº¯ÊýµÄlocStrtMain±äÁ¿ÖУ¬´Ó¶øÊ¡È¥Ò»´Îͨ¹ýÕ»µÄÖÐת¿½±´¡£

ɾ³ý´òÓ¡µÈÎÞ¹ØÓï¾äºó£¬²é¿´StackStrt.cÔ´Îļþ»ã±à´úÂëÈçÏÂͼËùʾ(ÂÔÓÐɾ¼õ)£º

ͼ16 StackStrt»ã±àƬ¶Î

<Ö¸Áî804839a>½«¾Ö²¿±äÁ¿locStrtMain½á¹¹ÌåÔÚÕ»ÖеĵØÖ·´æÈë%eax¼Ä´æÆ÷¡£<Ö¸Áî804839d>½«±êÁ¿²ÎÊý(100)ÈëÕ»£¬Òò<Ö¸Áî8048397>ÒÑÔ¤ÁôºÃ´æ´¢¿Õ¼ä£¬¹Ê´Ë´¦µÈЧÓÚ"pushl $0x64"¡£<Ö¸Áî8048397>½«%eaxÖб£´æµÄ½á¹¹Ì嵨ַ(&locStrtMain)ÈëÕ»£¬´Ë´¦µÈЧÓÚ"pushl %eax"¡£

<Ö¸Áî804835a>½«8(%ebp)´¦Ëù´æ´¢µÄÖ÷µ÷º¯ÊýlocStrtMain½á¹¹Ì嵨ַ´æÈë%edx¼Ä´æÆ÷¡£<Ö¸Áî804835d>ÖÁ<Ö¸Áî804836b>¶Ô±»µ÷º¯ÊýÕ»Äڵľֲ¿±äÁ¿locStrtFunc½á¹¹Ì帳ֵ¡£<Ö¸Áî8048372>ÖÁ<Ö¸Áî8048380>½«locStrtFunc½á¹¹ÌåµÄ¸÷¸ö³ÉÔ±±äÁ¿ÖµÒÀ´Î´æÈë%edx¼Ä´æÆ÷ËùÖ¸ÏòµÄÄÚ´æµØÖ·´¦(&locStrtMain)¡£<Ö¸Áî8048383>½«ÔÝ´æµÄ%edx¼Ä´æÆ÷ÄÚÈÝ´æÈë%eax¼Ä´æÆ÷£¬´Ëʱ%eaxÄÚ´æ·ÅÖ÷µ÷º¯Êý½á¹¹ÌålocStrtMainµÄµØÖ·¡£

¸ù¾Ý»ã±à½á¹û£¬¿ÉÖªfuncº¯Êý±»¡°¸Ä±à¡±ÎªÒÔÏÂʵÏÖ£º

void func(T_RET_STRT *pStrtMain, int paraFunc){
    T_RET_STRT locStrtFunc = {.member1=1, .member2=2, .member3=3};
    pStrtMain->member1 = locStrtFunc.member1;
    pStrtMain->member2 = locStrtFunc.member2;
    pStrtMain->member3 = locStrtFunc.member3;
    return; //´Ë¾ä¿ÉÓпÉÎÞ
}

modified func

ÈôÏÔʽÉùÃ÷½á¹¹ÌåÖ¸Õë²ÎÊý£¬Ôò¿É±àд¸ü¸ßЧµÄfuncº¯Êý´úÂ룺

void func(T_RET_STRT *pStrtMain, int paraFunc){
2 pStrtMain->member1 = 1;
3 pStrtMain->member2 = 2;
4 pStrtMain->member3 = 3;
5 }

×¢Ò⣬ÈôT_RET_STRT locStrtMain = func(100)¸ÄΪfunc(100)£¬Ö÷µ÷º¯ÊýÕ»ÉÏÈÔ»áÔ¤ÁôÒ»¸ö½á¹¹Ìå±äÁ¿µÄ¿Õ¼ä£¬È»ºó½«¸Ã±äÁ¿µØÖ·´æÈë%eax¼Ä´æÆ÷¡£<Ö¸Áî8048397>ºÍ<Ö¸Áî804839a>·Ö±ð±äΪsub $0x1c, %espºÍlea 0xffffffe8(%ebp), %eax¡£

´ÓÒÔÉÏ·ÖÎöÒàÖª£¬µ±º¯ÊýÒԽṹÌå»òÁªºÏÌå×÷Ϊ·µ»ØÖµÊ±£¬º¯ÊýµÚÒ»¸ö²ÎÊý´æ·ÅÔÚÕ»Ö¡12(%ebp)λÖô¦£¬¶ø8(%ebp)λÖô¦´æ·Å·µ»ØÖµµÄµØÖ·¡£

   
4478 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
Visual C++±à³ÌÃüÃû¹æÔò
ÈκÎʱºò¶¼ÊÊÓõÄ20¸öC++¼¼ÇÉ
CÓïÑÔ½ø½×
´®¿ÚÇý¶¯·ÖÎö
ÇáÇáËÉËÉ´ÓCһ·×ßµ½C++
C++±à³Ì˼Ïë


C++²¢·¢´¦Àí+µ¥Ôª²âÊÔ
C++³ÌÐò¿ª·¢
C++¸ß¼¶±à³Ì
C/C++¿ª·¢
C++Éè¼ÆÄ£Ê½
C/C++µ¥Ôª²âÊÔ


±±¾© ǶÈëʽC¸ßÖÊÁ¿±à³Ì
Öйúº½¿Õ ǶÈëʽC¸ßÖÊÁ¿±à³Ì
»ªÎª C++¸ß¼¶±à³Ì
±±¾© C++¸ß¼¶±à³Ì
µ¤·ð˹ C++¸ß¼¶±à³Ì
±±´ó·½Õý CÓïÑÔµ¥Ôª²âÊÔ
ÂÞ¿ËΤ¶û C++µ¥Ôª²âÊÔ