• 我今天拆了个炸弹


    今天群友发来一段汇编代码,说这是一个炸弹程序,需要输入6个数字解开,输错就炸了,

    在线等,挺急的

    代码如下:

    1. 08048b54 <phase_2>:
    2. 8048b54: 53 push %ebx
    3. 8048b55: 83 ec 30 sub $0x30,%esp
    4. 8048b58: 65 a1 14 00 00 00 mov %gs:0x14,%eax
    5. 8048b5e: 89 44 24 24 mov %eax,0x24(%esp)
    6. 8048b62: 31 c0 xor %eax,%eax
    7. 8048b64: 8d 44 24 0c lea 0xc(%esp),%eax
    8. 8048b68: 50 push %eax
    9. 8048b69: ff 74 24 3c pushl 0x3c(%esp)
    10. 8048b6d: e8 a1 07 00 00 call 8049313 <read_six_numbers>
    11. 8048b72: 83 c4 10 add $0x10,%esp
    12. 8048b75: 83 7c 24 04 00 cmpl $0x0,0x4(%esp)
    13. 8048b7a: 79 05 jns 8048b81 <phase_2+0x2d>
    14. 8048b7c: e8 55 07 00 00 call 80492d6 <explode_bomb>
    15. 8048b81: bb 01 00 00 00 mov $0x1,%ebx
    16. 8048b86: 89 d8 mov %ebx,%eax
    17. 8048b88: 03 04 9c add (%esp,%ebx,4),%eax
    18. 8048b8b: 39 44 9c 04 cmp %eax,0x4(%esp,%ebx,4)
    19. 8048b8f: 74 05 je 8048b96 <phase_2+0x42>
    20. 8048b91: e8 40 07 00 00 call 80492d6 <explode_bomb>
    21. 8048b96: 83 c3 01 add $0x1,%ebx
    22. 8048b99: 83 fb 06 cmp $0x6,%ebx
    23. 8048b9c: 75 e8 jne 8048b86 <phase_2+0x32>
    24. 8048b9e: 8b 44 24 1c mov 0x1c(%esp),%eax
    25. 8048ba2: 65 33 05 14 00 00 00 xor %gs:0x14,%eax
    26. 8048ba9: 74 05 je 8048bb0 <phase_2+0x5c>
    27. 8048bab: e8 e0 fb ff ff call 8048790 <__stack_chk_fail@plt>
    28. 8048bb0: 83 c4 28 add $0x28,%esp
    29. 8048bb3: 5b pop %ebx
    30. 8048bb4: c3 ret

    经过ida的反汇编后,转成的C语言如下:

    1. int __cdecl phase_2(int a1)
    2. {
    3. signed int v1; // ebx@3
    4. int result; // eax@7
    5. int v3; // [sp+8h] [bp-2Ch]@4
    6. int v4[6]; // [sp+Ch] [bp-28h]@1
    7. int v5; // [sp+24h] [bp-10h]@1
    8. v5 = *MK_FP(__GS__, 20);
    9. read_six_numbers(a1, v4);
    10. if ( v4[0] < 0 )
    11. explode_bomb();
    12. v1 = 1;
    13. do
    14. {
    15. if ( v4[v1] != *(&v3 + v1) + v1 )
    16. explode_bomb();
    17. ++v1;
    18. }
    19. while ( v1 != 6 );
    20. result = *MK_FP(__GS__, 20) ^ v5;
    21. if ( *MK_FP(__GS__, 20) != v5 )
    22. __stack_chk_fail();
    23. return result;
    24. }

    要破解这个密码的关键是在

    1. v1 = 1;
    2. do
    3. {
    4. if ( v4[v1] != *(&v3 + v1) + v1 )
    5. explode_bomb();
    6. ++v1;
    7. }
    8. while ( v1 != 6 );

    很多人说看不懂这一句,尤其是V3的值不知道是什么

    如果对C不太熟悉的话,确实为难

    v3是一个整数,&v3则是一个整型指针,&v3+1,其实就是v4了,假设v3的内存地址是0x80000000,

    那v4的内存地址就是0x80000004,为什么是+4呢?因为一个整型指针占了4字节啊

    当清楚以上概念后,这题就好解了

     v1=1时,v4[1]=v4[0]+1

     v1=2时,v4[2]=v4[1]+2

     v1=3时,v4[3]=v4[2]+3

     v1=4时,v4[4]=v4[3]+4

     v1=5时,v4[5]=v4[4]+5

    假设v4[0]为1,则密码就是1,2,4,7,11,16

    其它密码也是可以的,只要按着这公式套就好

    最终群友打赏20,以资鼓励^^

  • 相关阅读:
    [标准sql] 内连接和外连接的区别
    事务 还有这些用法,之前都不知道
    ADO.NET 之sqlConnection 对象使用摘要
    Java面试题及答案整理(2022最新版)
    pbootcms模板提交留言表单后,如何跳转到指定的网址?
    ubuntu127.0.1.1
    Web3和区块链开发国内外顶级资源大赏
    大米自动化生产线的运作原理与科技创新
    中学数学教学参考杂志社中学数学教学参考编辑部2022年第27期目录
    亚商投资顾问 早餐FM/0913
  • 原文地址:https://blog.csdn.net/kof98765/article/details/128021011