逆向-还原代码之split (Intel 32)

#include <stdio.h>

void a_1()
{
 /*80484d0:    55                       push   %ebp
 80484d1:    89 e5                    mov    %esp,%ebp
 80484d3:    57                       push   %edi
 80484d4:    56                       push   %esi
 80484d5:    53                       push   %ebx
 80484d6:    83 ec 4c                 sub    $0x4c,%esp
 80484d9:    c7 45 d4 01 00 00 00     movl   $0x1,-0x2c(%ebp)
 80484e0:    c7 45 d0 02 00 00 00     movl   $0x2,-0x30(%ebp)*/
    int j = 1;
    int i = 2;

 /*80484e7:    c7 45 e4 00 00 00 00     movl   $0x0,-0x1c(%ebp)
 80484ee:    8b 45 e4                 mov    -0x1c(%ebp),%eax
 80484f1:    89 45 e0                 mov    %eax,-0x20(%ebp)
 80484f4:    8b 45 e0                 mov    -0x20(%ebp),%eax
 80484f7:    89 45 dc                 mov    %eax,-0x24(%ebp)
 80484fa:    8b 45 dc                 mov    -0x24(%ebp),%eax
 80484fd:    89 45 d8                 mov    %eax,-0x28(%ebp)*/
    int a[4];
    a[0] = a[1] = a[2] = a[3] = 0;

 /*8048500:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048503:    89 44 24 04              mov    %eax,0x4(%esp)
 8048507:    c7 04 24 74 88 04 08     movl   $0x8048874,(%esp)
 804850e:    e8 7d fe ff ff           call   8048390 <printf@plt>*/
    printf("%d\n", j);

 /*8048513:    8d 45 d4                 lea    -0x2c(%ebp),%eax    // eax = &j
 8048516:    89 44 24 04              mov    %eax,0x4(%esp)    // esp+4 = &j
 804851a:    c7 04 24 74 88 04 08     movl   $0x8048874,(%esp)
 8048521:    e8 6a fe ff ff           call   8048390 <printf@plt>*/
    printf("%x\n", &j);

 /*8048526:    8b 45 d4                 mov    -0x2c(%ebp),%eax    // eax = j = 2
 8048529:    8d 78 14                 lea    0x14(%eax),%edi    // edi = j+0x14
 804852c:    8b 45 d4                 mov    -0x2c(%ebp),%eax    // eax = j
 804852f:    8d 70 10                 lea    0x10(%eax),%esi    // esi = j+0x10
 8048532:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048535:    8d 58 0c                 lea    0xc(%eax),%ebx    // ebx = j+0xc
 8048538:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 804853b:    8d 48 08                 lea    0x8(%eax),%ecx    // ecx = j+0x8
 804853e:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048541:    8d 50 04                 lea    0x4(%eax),%edx    // edx = j+4
 8048544:    8b 45 d4                 mov    -0x2c(%ebp),%eax    // eax = j
 8048547:    89 7c 24 18              mov    %edi,0x18(%esp)
 804854b:    89 74 24 14              mov    %esi,0x14(%esp)
 804854f:    89 5c 24 10              mov    %ebx,0x10(%esp)
 8048553:    89 4c 24 0c              mov    %ecx,0xc(%esp)
 8048557:    89 54 24 08              mov    %edx,0x8(%esp)
 804855b:    89 44 24 04              mov    %eax,0x4(%esp)
 804855f:    c7 04 24 7c 88 04 08     movl   $0x804887c,(%esp)
 8048566:    e8 25 fe ff ff           call   8048390 <printf@plt>*/
    printf("%d %d %d %d %d %d\n", j, j+4, j+8, j+12, j+16, j+20);

 /*804856b:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 804856e:    89 45 d8                 mov    %eax,-0x28(%ebp)*/
    a[0] = j;
 /*8048571:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048574:    83 c0 04                 add    $0x4,%eax
 8048577:    89 45 dc                 mov    %eax,-0x24(%ebp)*/
    a[1] = j+4;
 /*804857a:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 804857d:    83 c0 08                 add    $0x8,%eax
 8048580:    89 45 e0                 mov    %eax,-0x20(%ebp)*/
    a[2] = j+8;
 /*8048583:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048586:    83 c0 0c                 add    $0xc,%eax
 8048589:    89 45 e4                 mov    %eax,-0x1c(%ebp)*/
    a[3] = j+0xc;
 /*804858c:    8b 45 e4                 mov    -0x1c(%ebp),%eax
 804858f:    89 44 24 10              mov    %eax,0x10(%esp)
 8048593:    8b 45 e0                 mov    -0x20(%ebp),%eax
 8048596:    89 44 24 0c              mov    %eax,0xc(%esp)
 804859a:    8b 45 dc                 mov    -0x24(%ebp),%eax
 804859d:    89 44 24 08              mov    %eax,0x8(%esp)
 80485a1:    8b 45 d8                 mov    -0x28(%ebp),%eax
 80485a4:    89 44 24 04              mov    %eax,0x4(%esp)
 80485a8:    c7 04 24 9b 88 04 08     movl   $0x804889b,(%esp)
 80485af:    e8 dc fd ff ff           call   8048390 <printf@plt>*/
    printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);

 /*80485b4:    8d 45 d0                 lea    -0x30(%ebp),%eax
 80485b7:    89 45 d4                 mov    %eax,-0x2c(%ebp)*/
    j = &i;

 /*80485ba:    8d 45 d0                 lea    -0x30(%ebp),%eax
 80485bd:    89 44 24 04              mov    %eax,0x4(%esp)
 80485c1:    c7 04 24 a8 88 04 08     movl   $0x80488a8,(%esp)
 80485c8:    e8 c3 fd ff ff           call   8048390 <printf@plt>*/
    printf("%x\n", i);

 /*80485cd:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 80485d0:    89 44 24 04              mov    %eax,0x4(%esp)
 80485d4:    c7 04 24 74 88 04 08     movl   $0x8048874,(%esp)
 80485db:    e8 b0 fd ff ff           call   8048390 <printf@plt>*/
    printf("%x\n", j);

 /*80485e0:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 80485e3:    8b 00                    mov    (%eax),%eax
 80485e5:    89 44 24 04              mov    %eax,0x4(%esp)
 80485e9:    c7 04 24 74 88 04 08     movl   $0x8048874,(%esp)
 80485f0:    e8 9b fd ff ff           call   8048390 <printf@plt>*/
    printf("%d\n", *(int*)j);

 /*80485f5:    83 c4 4c                 add    $0x4c,%esp
 80485f8:    5b                       pop    %ebx
 80485f9:    5e                       pop    %esi
 80485fa:    5f                       pop    %edi
 80485fb:    5d                       pop    %ebp
 80485fc:    c3                       ret  */
}  

void a_0()
{
 /*80485fd:    55                       push   %ebp
 80485fe:    89 e5                    mov    %esp,%ebp
 8048600:    57                       push   %edi
 8048601:    56                       push   %esi
 8048602:    53                       push   %ebx
 8048603:    83 ec 4c                 sub    $0x4c,%esp
 8048606:    c7 45 d4 00 00 00 00     movl   $0x0,-0x2c(%ebp)*/
    int j = 0;

 /*804860d:    c7 45 e4 00 00 00 00     movl   $0x0,-0x1c(%ebp)
 8048614:    8b 45 e4                 mov    -0x1c(%ebp),%eax
 8048617:    89 45 e0                 mov    %eax,-0x20(%ebp)
 804861a:    8b 45 e0                 mov    -0x20(%ebp),%eax
 804861d:    89 45 dc                 mov    %eax,-0x24(%ebp)
 8048620:    8b 45 dc                 mov    -0x24(%ebp),%eax
 8048623:    89 45 d8                 mov    %eax,-0x28(%ebp)*/
    int a[4];
    a[0] = a[1] = a[2] = a[3] = 0;

 /*8048626:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048629:    89 44 24 04              mov    %eax,0x4(%esp)
 804862d:    c7 04 24 74 88 04 08     movl   $0x8048874,(%esp)
 8048634:    e8 57 fd ff ff           call   8048390 <printf@plt>*/
    printf("%d\n", j);

 /*8048639:    8d 45 d4                 lea    -0x2c(%ebp),%eax
 804863c:    89 44 24 04              mov    %eax,0x4(%esp)
 8048640:    c7 04 24 74 88 04 08     movl   $0x8048874,(%esp)
 8048647:    e8 44 fd ff ff           call   8048390 <printf@plt>*/
    printf("%x\n", &j);

 /*804864c:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 804864f:    8d 78 14                 lea    0x14(%eax),%edi    // edi = j+0x14
 8048652:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048655:    8d 70 10                 lea    0x10(%eax),%esi    // esi = j+0x10
 8048658:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 804865b:    8d 58 0c                 lea    0xc(%eax),%ebx    // ebx = j+0xc
 804865e:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048661:    8d 48 08                 lea    0x8(%eax),%ecx    // ecx = j+0x8
 8048664:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048667:    8d 50 04                 lea    0x4(%eax),%edx    // edx = j+0x4
 804866a:    8b 45 d4                 mov    -0x2c(%ebp),%eax    // eax = j;
 804866d:    89 7c 24 18              mov    %edi,0x18(%esp)
 8048671:    89 74 24 14              mov    %esi,0x14(%esp)
 8048675:    89 5c 24 10              mov    %ebx,0x10(%esp)
 8048679:    89 4c 24 0c              mov    %ecx,0xc(%esp)
 804867d:    89 54 24 08              mov    %edx,0x8(%esp)
 8048681:    89 44 24 04              mov    %eax,0x4(%esp)
 8048685:    c7 04 24 7c 88 04 08     movl   $0x804887c,(%esp)
 804868c:    e8 ff fc ff ff           call   8048390 <printf@plt>*/
    printf("%d %d %d %d %d %d\n", j , j+4, j+8, j+0xc, j+0x10, j+0x14);

 /*8048691:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048694:    89 45 d8                 mov    %eax,-0x28(%ebp)*/
    a[0] = j;
 /*8048697:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 804869a:    83 c0 04                 add    $0x4,%eax
 804869d:    89 45 dc                 mov    %eax,-0x24(%ebp)*/
    a[1] = j+4;

 /*80486a0:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 80486a3:    83 c0 08                 add    $0x8,%eax
 80486a6:    89 45 e0                 mov    %eax,-0x20(%ebp)*/
    a[2] = j+8;

 /*80486a9:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 80486ac:    83 c0 0c                 add    $0xc,%eax
 80486af:    89 45 e4                 mov    %eax,-0x1c(%ebp)*/
    a[3] = j+0xc;

 /*80486b2:    8b 45 e4                 mov    -0x1c(%ebp),%eax
 80486b5:    89 44 24 10              mov    %eax,0x10(%esp)
 80486b9:    8b 45 e0                 mov    -0x20(%ebp),%eax
 80486bc:    89 44 24 0c              mov    %eax,0xc(%esp)
 80486c0:    8b 45 dc                 mov    -0x24(%ebp),%eax
 80486c3:    89 44 24 08              mov    %eax,0x8(%esp)
 80486c7:    8b 45 d8                 mov    -0x28(%ebp),%eax
 80486ca:    89 44 24 04              mov    %eax,0x4(%esp)
 80486ce:    c7 04 24 9b 88 04 08     movl   $0x804889b,(%esp)
 80486d5:    e8 b6 fc ff ff           call   8048390 <printf@plt>*/
    printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);

 /*80486da:    83 c4 4c                 add    $0x4c,%esp
 80486dd:    5b                       pop    %ebx
 80486de:    5e                       pop    %esi
 80486df:    5f                       pop    %edi
 80486e0:    5d                       pop    %ebp
 80486e1:    c3                       ret*/
}    

void a_3()
{
 /*80486e2:    55                       push   %ebp
 80486e3:    89 e5                    mov    %esp,%ebp
 80486e5:    57                       push   %edi
 80486e6:    56                       push   %esi
 80486e7:    53                       push   %ebx
 80486e8:    83 ec 4c                 sub    $0x4c,%esp
 80486eb:    c7 45 d4 03 00 00 00     movl   $0x3,-0x2c(%ebp)*/
    int j = 0;

 /*80486f2:    c7 45 e4 00 00 00 00     movl   $0x0,-0x1c(%ebp)
 80486f9:    8b 45 e4                 mov    -0x1c(%ebp),%eax
 80486fc:    89 45 e0                 mov    %eax,-0x20(%ebp)
 80486ff:    8b 45 e0                 mov    -0x20(%ebp),%eax
 8048702:    89 45 dc                 mov    %eax,-0x24(%ebp)
 8048705:    8b 45 dc                 mov    -0x24(%ebp),%eax
 8048708:    89 45 d8                 mov    %eax,-0x28(%ebp)*/
    int a[4];
    a[0] = a[1] = a[2] = a[3] = 0;

 /*804870b:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 804870e:    89 44 24 04              mov    %eax,0x4(%esp)
 8048712:    c7 04 24 74 88 04 08     movl   $0x8048874,(%esp)
 8048719:    e8 72 fc ff ff           call   8048390 <printf@plt>*/
    printf("%d\n", j);

/* 804871e:    8d 45 d4                 lea    -0x2c(%ebp),%eax
 8048721:    89 44 24 04              mov    %eax,0x4(%esp)
 8048725:    c7 04 24 74 88 04 08     movl   $0x8048874,(%esp)
 804872c:    e8 5f fc ff ff           call   8048390 <printf@plt>*/
    printf("%d\n", &j);

 /*8048731:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048734:    8d 78 14                 lea    0x14(%eax),%edi
 8048737:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 804873a:    8d 70 10                 lea    0x10(%eax),%esi
 804873d:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048740:    8d 58 0c                 lea    0xc(%eax),%ebx
 8048743:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048746:    8d 48 08                 lea    0x8(%eax),%ecx
 8048749:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 804874c:    8d 50 04                 lea    0x4(%eax),%edx
 804874f:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048752:    89 7c 24 18              mov    %edi,0x18(%esp)
 8048756:    89 74 24 14              mov    %esi,0x14(%esp)
 804875a:    89 5c 24 10              mov    %ebx,0x10(%esp)
 804875e:    89 4c 24 0c              mov    %ecx,0xc(%esp)
 8048762:    89 54 24 08              mov    %edx,0x8(%esp)
 8048766:    89 44 24 04              mov    %eax,0x4(%esp)
 804876a:    c7 04 24 7c 88 04 08     movl   $0x804887c,(%esp)
 8048771:    e8 1a fc ff ff           call   8048390 <printf@plt>*/
    printf("%d %d %d %d %d %d\n", j , j+4, j+8, j+0xc, j+0x10, j+0x14);

 /*8048776:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048779:    89 45 d8                 mov    %eax,-0x28(%ebp)
 804877c:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 804877f:    83 c0 04                 add    $0x4,%eax
 8048782:    89 45 dc                 mov    %eax,-0x24(%ebp)
 8048785:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048788:    83 c0 08                 add    $0x8,%eax
 804878b:    89 45 e0                 mov    %eax,-0x20(%ebp)
 804878e:    8b 45 d4                 mov    -0x2c(%ebp),%eax
 8048791:    83 c0 0c                 add    $0xc,%eax
 8048794:    89 45 e4                 mov    %eax,-0x1c(%ebp)
 8048797:    8b 45 e4                 mov    -0x1c(%ebp),%eax
 804879a:    89 44 24 10              mov    %eax,0x10(%esp)
 804879e:    8b 45 e0                 mov    -0x20(%ebp),%eax
 80487a1:    89 44 24 0c              mov    %eax,0xc(%esp)
 80487a5:    8b 45 dc                 mov    -0x24(%ebp),%eax
 80487a8:    89 44 24 08              mov    %eax,0x8(%esp)
 80487ac:    8b 45 d8                 mov    -0x28(%ebp),%eax
 80487af:    89 44 24 04              mov    %eax,0x4(%esp)
 80487b3:    c7 04 24 9b 88 04 08     movl   $0x804889b,(%esp)
 80487ba:    e8 d1 fb ff ff           call   8048390 <printf@plt>*/
    printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);

 /*80487bf:    83 c4 4c                 add    $0x4c,%esp
 80487c2:    5b                       pop    %ebx
 80487c3:    5e                       pop    %esi
 80487c4:    5f                       pop    %edi
 80487c5:    5d                       pop    %ebp
 80487c6:    c3                       ret    */
}

int main()
{
 /*qA80487c7:    55                       push   %ebp
 80487c8:    89 e5                    mov    %esp,%ebp
 80487ca:    83 e4 f0                 and    $0xfffffff0,%esp
 80487cd:    e8 fe fc ff ff           call   80484d0 <a_1>*/
    a_1();

 //80487d2:    e8 26 fe ff ff           call   80485fd <a_0>
    a_0();

 //80487d7:    e8 06 ff ff ff           call   80486e2 <a_3>
    a_3();

 /*80487dc:    c9                       leave  
 80487dd:    c3                       ret    
 80487de:    66 90                    xchg   %ax,%ax*/
}

// code
void a_1()
{
    int *a = 1;
    int byte1, byte2, byte3, byte4;
    int b = 2;

    byte1 = byte2 = byte3 = byte4 = 0;

    printf("a=%x\n", a);    // 1
    printf("a=%x\n", &a);    // b7d24708

    printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]); // 0x1 0x5 0x9 0xd 0x11 0x15
    //printf("%x %x %x %x\n", a[0], a[1], a[2], a[3]);     // Segmentation fault (core dumped)

    byte1 = (char *)&a[0];
    byte2 = (char *)&a[1];
    byte3 = (char *)&a[2];
    byte4 = (char *)&a[3];

    printf("%x %x %x %x\n", byte1, byte2, byte3, byte4); // 1 5 9 d

    a = &b;
    printf("b=%x\n", &b);    // b7d246f4
    printf("a=%x\n", a);    // b7d246f4
    printf("a=%x\n", *a);    // 2
}

void a_0()
{
    int *a = 0;
    int byte1, byte2, byte3, byte4;

    byte1 = byte2 = byte3 = byte4 = 0;

    printf("a=%x\n", a);    // 0    指向地址0
    //printf("a=%d\n", *a);    // Segmentation fault (core dumped) 取地址0上的数据,报错
    printf("a=%x\n", &a);    // c03f1498

    printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]); // 0x0 0x4 0x8 0xc 0x10 0x14
    //printf("%x %x %x %x\n", a[0], a[1], a[2], a[3]);     // Segmentation fault (core dumped)

    byte1 = (char *)&a[0];
    byte2 = (char *)&a[1];
    byte3 = (char *)&a[2];
    byte4 = (char *)&a[3];

    printf("%x %x %x %x\n", byte1, byte2, byte3, byte4); // 0 4 8 c
}

void a_3()
{
    int *a = 3;
    int byte1, byte2, byte3, byte4;

    byte1 = byte2 = byte3 = byte4 = 0;

    printf("a=%x\n", a);    // 3
    printf("a=%x\n", &a);    // ce340a48

    printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]); // 0x3 0x7 0xb 0xf 0x13 0x17
    //printf("%x %x %x %x\n", a[0], a[1], a[2], a[3]);     // Segmentation fault (core dumped)

    byte1 = (char *)&a[0];
    byte2 = (char *)&a[1];
    byte3 = (char *)&a[2];
    byte4 = (char *)&a[3];

    printf("%x %x %x %x\n", byte1, byte2, byte3, byte4); // 3 7 b f
}

void main()
{
    a_1();
    a_0();
    a_3();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值