逆向工程实验

bomblab 拆炸弹 #南京航空航天大学《计算机组成原理Ⅱ课程设计》报告 姓名:冯进 班级:1617201 学号:161720201 报告阶段:Bomblab 完成日期:2019.5.26 all finished ##目录 文章目录实验内容1.Bomb12.Bomb23.Bomb34.Bomb45.Bomb5实验心得备注 实验内容 objdump –d bomb > asm.txt 对bomb进行反汇编并... 阅读详情

        又一个计算系统的实验,这次实验的主要目标是熟悉GDB调试工具,以及一些汇编的语法。

  实验环境:32位操作系统(Fedora 13)。

  实验内容:本实验设计为一个黑客拆解二进制炸弹的游戏。我们仅给黑客(同学)提供一个二进制可执行文件bomb和主函数所在的源程序bomb.c,不提供每个关卡的源代码。程序运行中有6个关卡(6个phase),每个关卡需要用户输入正确的字符串或数字才能通关,否则会引爆炸弹!

  要求同学运用GDB调试工具和objdump反汇编工具,通过分析汇编代码,找到在每个phase程序段中,引导程序跳转到“explode_bomb”程序段的地方,并分析其成功跳转的条件,以此为突破口寻找应该在命令行输入何种字符串来通关。

  接下来是各个关卡的解答

1. phase_1

phase_1的代码如图1。


                图1

分析:0x8048b3e是bomb引导函数,其转移所需条件是%eax为0,通过阅读strings_not_equal的代码可以知道,若两个字符串相等,则%eax设置为0,否则设置为1;那么,bomb函数的转移条件就变成两个字符串不相等,而两个字符串分别为0x80497c0和%eax所存储的字符串首地址。%eax是用户输入的字符串,那么答案就是地址0x804907c0所存储的字符串。


           图2

输出字符串可知答案为“Public speaking is very easy.”。

2. phase_2

phase_2汇编代码如下图3所示。


                  图3

分析:图中红框表示两个炸弹的位置,而黄色方框表示引爆炸弹的转移条件,先分析第一个炸弹,转移条件为M (%ebp-0x18) 的不等于1,那么就需要知道 (%ebp-0x18) 表示什么,第一次出现%ebp-0x18是在地址0x8048b56,此时的%ebp-0x18是作为一个参数传入给函数read_six_numbers,显然,这是一个读取六个数字的函数,那么阅读这个函数的代码,代码如图4所示。从图中可以看出,%ebp的值表示是一个数组的地址,而这个函数就是为这个数组写入值得。从图中可以看到还有一个炸弹,但这个炸弹的意思是如果输入数字不足6个,就引爆炸弹,所以这道题需要输入6个数。而数组的首地址是(%ebp-0x18),那么回到调用函数phase_2,那么调用函数的第一个炸弹的拆除条件就明了了,就是数组的第一个数必须是1。接下来是第二个炸弹,经过阅读和简单的举例,可以得到第二个炸弹之前的那段代码是一个循环,而且是一个迭代,假设数组为a,那么这个循环的意思是a[1]=2*a[0],a[2]=3*a[1],a[3]=4*a[2],以此类推,直到求出a[5]为止,那么这个炸弹也就拆除了。

这道题的答案就是1、2、6、24、120、720


                  图4

3. phase_3

phase_3的汇编代码如下:

08048b98 <phase_3>:

 8048b98: 55                    push   %ebp

 8048b99: 89 e5                 mov    %esp,%ebp

 8048b9b: 83 ec 14              sub    $0x14,%esp

 8048b9e: 53                    push   %ebx

 8048b9f: 8b 55 08              mov    0x8(%ebp),%edx

 8048ba2: 83 c4 f4              add    $0xfffffff4,%esp

 8048ba5:8d 45 fc             lea    -0x4(%ebp),%eax

 8048ba8:50                   push   %eax

 8048ba9:8d 45 fb             lea    -0x5(%ebp),%eax

 8048bac:50                   push   %eax

 8048bad:8d 45 f4             lea    -0xc(%ebp),%eax

 8048bb0:50                   push   %eax

 8048bb1:68 de 97 04 08       push   $0x80497de

 8048bb6:52                   push   %edx

 8048bb7:e8 a4 fc ff ff       call   8048860 <sscanf@plt>

 8048bbc: 83 c4 20              add    $0x20,%esp

 8048bbf: 83 f8 02              cmp    $0x2,%eax

 8048bc2: 7f 05                 jg     8048bc9 <phase_3+0x31>

 8048bc4:e8 33 09 00 00       call   80494fc <explode_bomb>

 8048bc9:83 7d f4 07          cmpl   $0x7,-0xc(%ebp)

 8048bcd:0f 87 b5 00 00 00    ja     8048c88 <phase_3+0xf0>

 8048bd3:8b 45 f4             mov    -0xc(%ebp),%eax

 8048bd6:ff 24 85 e8 97 04 08 jmp    *0x80497e8(,%eax,4)

 8048bdd: 8d 76 00              lea    0x0(%esi),%esi

 8048be0: b3 71                 mov    $0x71,%bl

 8048be2: 81 7d fc 09 03 00 00 cmpl   $0x309,-0x4(%ebp)

 8048be9: 0f 84 a0 00 00 00     je     8048c8f <phase_3+0xf7>

 8048bef:e8 08 09 00 00       call   80494fc <explode_bomb>

 8048bf4: e9 96 00 00 00        jmp    8048c8f <phase_3+0xf7>

 8048bf9: 8d b4 26 00 00 00 00 lea    0x0(%esi,%eiz,1),%esi

 8048c00: b3 62                 mov    $0x62,%bl

 8048c02: 81 7d fc d6 00 00 00 cmpl   $0xd6,-0x4(%ebp)

 8048c09: 0f 84 80 00 00 00     je     8048c8f <phase_3+0xf7>

 8048c0f:e8 e8 08 00 00       call   80494fc <explode_bomb>

 8048c14: eb 79                 jmp    8048c8f <phase_3+0xf7>

 8048c16: b3 62                 mov    $0x62,%bl

 8048c18: 81 7d fc f3 02 00 00 cmpl   $0x2f3,-0x4(%ebp)

 8048c1f: 74 6e                 je     8048c8f <phase_3+0xf7>

 8048c21:e8 d6 08 00 00       call   80494fc <explode_bomb>

 8048c26: eb 67                 jmp    8048c8f <phase_3+0xf7>

 8048c28: b3 6b                 mov    $0x6b,%bl

 8048c2a: 81 7d fc fb 00 00 00 cmpl   $0xfb,-0x4(%ebp)

 8048c31: 74 5c                 je     8048c8f <phase_3+0xf7>

 8048c33:e8 c4 08 00 00       call   80494fc <explode_bomb>

 8048c38: eb 55                 jmp    8048c8f <phase_3+0xf7>

 8048c3a: 8d b6 00 00 00 00     lea    0x0(%esi),%esi

 8048c40: b3 6f                 mov    $0x6f,%bl

 8048c42: 81 7d fc a0 00 00 00 cmpl   $0xa0,-0x4(%ebp)

 8048c49: 74 44                 je     8048c8f <phase_3+0xf7>

 8048c4b:e8 ac 08 00 00       call   80494fc <explode_bomb>

 8048c50: eb 3d                 jmp    8048c8f <phase_3+0xf7>

 8048c52: b3 74                 mov    $0x74,%bl

 8048c54: 81 7d fc ca 01 00 00 cmpl   $0x1ca,-0x4(%ebp)

 8048c5b: 74 32                 je     8048c8f <phase_3+0xf7>

 8048c5d:e8 9a 08 00 00       call   80494fc <explode_bomb>

 8048c62: eb 2b                 jmp    8048c8f <phase_3+0xf7>

 8048c64: b3 76                 mov    $0x76,%bl

 8048c66: 81 7d fc 0c 03 00 00 cmpl   $0x30c,-0x4(%ebp)

 8048c6d: 74 20                 je     8048c8f <phase_3+0xf7>

 8048c6f:e8 88 08 00 00       call   80494fc <explode_bomb>

 8048c74: eb 19                 jmp    8048c8f <phase_3+0xf7>

 8048c76: b3 62                 mov    $0x62,%bl

 8048c78: 81 7d fc 0c 02 00 00 cmpl   $0x20c,-0x4(%ebp)

 8048c7f: 74 0e                 je     8048c8f <phase_3+0xf7>

 8048c81:e8 76 08 00 00       call   80494fc <explode_bomb>

 8048c86: eb 07                 jmp    8048c8f <phase_3+0xf7>

 8048c88: b3 78                 mov    $0x78,%bl

 8048c8a:e8 6d 08 00 00       call   80494fc <explode_bomb>

 8048c8f: 3a 5d fb              cmp    -0x5(%ebp),%bl

 8048c92: 74 05                 je     8048c99 <phase_3+0x101>

 8048c94:e8 63 08 00 00       call   80494fc <explode_bomb>

 8048c99: 8b 5d e8              mov    -0x18(%ebp),%ebx

 8048c9c: 89 ec                 mov    %ebp,%esp

 8048c9e: 5d                    pop    %ebp

 8048c9f: c3                    ret    

简要分析如下:

黄色部分:为输入函数做准备,通过gdb调试分析可知,地址-0x4(%ebp)、-0x5(%ebp)、-0xc(%ebp)为三个要输入的参数,具体调试过程见图5。黄色部分中地址0x80497de存储的是字符串,其值为“%d  %c  %d”,说明中间的数是char,而前后两数是int。


              图5

把断点设在0x8048bbf,run程序,在第三关输入5 a 160的测试数据,然后检查寄存器ebp的值,从汇编代码可以知道,ebp存储的是一个地址,而-0x4(%ebp)为输入的第三个数,-0x5(%ebp)为输入的第二个数,-0xc(%ebp)为输入的第一个数。

红色部分:为炸弹的位置,第一个炸弹比较简单,意思是输入数据少于3个就引爆炸弹。后面的炸弹是针对不同的输入做不同的处理。

绿色部分:switch头部的判断,当第一个输入大于7时,跳到倒数第二个炸弹位置,所以倒数第二个炸弹可以拆除。

其它部分:现在任务就简单了,通过都代码就可以得出答案了。最后一个炸弹是判断第二个参数的,所有答案如下表所示。

第一个参数

0

1

2

4

5

6

7

第二个参数

q

b

b

k

o

v

b

第三个参数

777

214

755

251

160

458

524

4. phase_4

phase_4代码如下,这里直接阅读代码即可读懂,所以没有调试。

08048ce0 <phase_4>:

 8048ce0: 55                    push   %ebp

 8048ce1: 89 e5                 mov    %esp,%ebp

 8048ce3: 83 ec 18              sub    $0x18,%esp

 8048ce6: 8b 55 08              mov    0x8(%ebp),%edx

 8048ce9: 83 c4 fc              add    $0xfffffffc,%esp

 8048cec: 8d 45 fc              lea    -0x4(%ebp),%eax

 8048cef: 50                    push   %eax

 8048cf0: 68 08 98 04 08        push   $0x8049808

 8048cf5: 52                    push   %edx

 8048cf6: e8 65 fb ff ff        call   8048860 <sscanf@plt>

 8048cfb: 83 c4 10              add    $0x10,%esp

 8048cfe: 83 f8 01              cmp    $0x1,%eax

 8048d01: 75 06                 jne    8048d09 <phase_4+0x29>

 8048d03: 83 7d fc 00           cmpl   $0x0,-0x4(%ebp)

 8048d07: 7f 05                 jg     8048d0e <phase_4+0x2e>

 8048d09:e8 ee 07 00 00       call   80494fc <explode_bomb>

 8048d0e: 83 c4 f4              add    $0xfffffff4,%esp

 8048d11: 8b 45 fc              mov    -0x4(%ebp),%eax

 8048d14: 50                    push   %eax

 8048d15: e8 86 ff ff ff        call   8048ca0 <func4>

 8048d1a: 83 c4 10              add    $0x10,%esp

 8048d1d: 83 f8 37              cmp    $0x37,%eax

 8048d20: 74 05                 je     8048d27 <phase_4+0x47>

 8048d22:e8 d5 07 00 00       call   80494fc <explode_bomb>

 8048d27: 89 ec                 mov    %ebp,%esp

 8048d29: 5d                    pop    %ebp

 8048d2a: c3                    ret    

 8048d2b: 90                    nop


具体分析:

红色部分:炸弹位置,按照第三关的分析方法,第一个炸弹作用是判断输入的数据是否大于0,所以输入的数据只有一个,且其值必须大于0。第二个炸弹判断经过函数func4处理后,得到的结果是否等于55。

 

接下来主要是看func4的作用。

08048ca0 <func4>:

 8048ca0: 55                    push   %ebp

 8048ca1: 89 e5                 mov    %esp,%ebp

 8048ca3: 83 ec 10              sub    $0x10,%esp

 8048ca6: 56                    push   %esi

 8048ca7: 53                    push   %ebx

 8048ca8: 8b 5d 08              mov    0x8(%ebp),%ebx

 8048cab: 83 fb 01              cmp    $0x1,%ebx

 8048cae: 7e 20                 jle    8048cd0 <func4+0x30>

 8048cb0: 83 c4 f4              add    $0xfffffff4,%esp

 8048cb3: 8d 43 ff              lea    -0x1(%ebx),%eax

 8048cb6: 50                    push   %eax

 8048cb7: e8 e4 ff ff ff        call   8048ca0 <func4>

 8048cbc: 89 c6                 mov    %eax,%esi

 8048cbe: 83 c4 f4              add    $0xfffffff4,%esp

 8048cc1: 8d 43 fe              lea    -0x2(%ebx),%eax

 8048cc4: 50                    push   %eax

 8048cc5: e8 d6 ff ff ff        call   8048ca0 <func4>

 8048cca: 01 f0                 add    %esi,%eax

 8048ccc: eb 07                 jmp    8048cd5 <func4+0x35>

 8048cce: 89 f6                 mov    %esi,%esi

 8048cd0: b8 01 00 00 00        mov    $0x1,%eax

 8048cd5: 8d 65 e8              lea    -0x18(%ebp),%esp

 8048cd8: 5b                    pop    %ebx

 8048cd9: 5e                    pop    %esi

 8048cda: 89 ec                 mov    %ebp,%esp

 8048cdc: 5d                    pop    %ebp

 8048cdd: c3                    ret    

 8048cde: 89 f6                 mov    %esi,%esi

func4用来处理输入的数,该函数的功能是求斐波那契数。地址8048cab的语句判断当数小于等于1时,返回1。其它情况的处理是func4(n-1)+func4(n-2)。就是这样,没什么好说的。

那么答案就是:9。

5. phase_5

phase_5的代码如下:

08048d2c <phase_5>:

 8048d2c: 55                    push   %ebp

 8048d2d: 89 e5                 mov    %esp,%ebp

 8048d2f: 83 ec 10              sub    $0x10,%esp

 8048d32: 56                    push   %esi

 8048d33: 53                    push   %ebx

 8048d34: 8b 5d 08              mov    0x8(%ebp),%ebx

 8048d37: 83 c4 f4              add    $0xfffffff4,%esp

 8048d3a: 53                    push   %ebx

 8048d3b: e8 d8 02 00 00        call   8049018 <string_length>

 8048d40: 83 c4 10              add    $0x10,%esp

 8048d43: 83 f8 06              cmp    $0x6,%eax

 8048d46: 74 05                 je     8048d4d <phase_5+0x21>

 8048d48:e8 af 07 00 00       call   80494fc <explode_bomb>

 8048d4d:31 d2                xor    %edx,%edx

 8048d4f:8d 4d f8             lea    -0x8(%ebp),%ecx

 8048d52:be 20 b2 04 08       mov    $0x804b220,%esi

 8048d57:8a 04 1a             mov    (%edx,%ebx,1),%al

 8048d5a:24 0f                and    $0xf,%al

 8048d5c:0f be c0             movsbl %al,%eax

 8048d5f:8a 04 30             mov    (%eax,%esi,1),%al

 8048d62:88 04 0a             mov    %al,(%edx,%ecx,1)

 8048d65:42                   inc    %edx

 8048d66:83 fa 05             cmp    $0x5,%edx

 8048d69:7e ec                jle    8048d57 <phase_5+0x2b>

 8048d6b:c6 45 fe 00          movb   $0x0,-0x2(%ebp)

 8048d6f: 83 c4 f8              add    $0xfffffff8,%esp

 8048d72: 68 0b 98 04 08        push   $0x804980b

 8048d77: 8d 45 f8              lea    -0x8(%ebp),%eax

 8048d7a: 50                    push   %eax

 8048d7b: e8 b0 02 00 00        call   8049030 <strings_not_equal>

 8048d80: 83 c4 10              add    $0x10,%esp

 8048d83: 85 c0                 test   %eax,%eax

 8048d85: 74 05                 je     8048d8c <phase_5+0x60>

 8048d87:e8 70 07 00 00       call   80494fc <explode_bomb>

 8048d8c: 8d 65 e8              lea    -0x18(%ebp),%esp

 8048d8f: 5b                    pop    %ebx

 8048d90: 5e                    pop    %esi

 8048d91: 89 ec                 mov    %ebp,%esp

 8048d93: 5d                    pop    %ebp

 8048d94: c3                    ret    

 8048d95: 8d 76 00              lea    0x0(%esi),%esi


具体分析:

红色部分:两个炸弹,从第一个炸弹前面调用了函数string_length可以知道,输入数据是一个字符串,且其长度为6。第二个炸弹之前有一个判断字符串是否相等的函数,地址0x8048d6f

的语句是一个字符串常量,通过gdb调试输出其值,为“giants”。那么初步判断输入字符串经过某些处理后和giants进行相等比较,若相等,%eax设置为0,否则,设置为1。看起来和第一道题很相似。那么问题主要在中间的黄色部分呢。

黄色部分:%edx是一个计数器,初始化为0,%ecx是待构造的字符串,%esi是字符串常量,其值如图6所示。%ebx是输入的字符串。


            图6

接下来是一个循环,该循环的作用是依次取出%ebx的字符,截取其后四位得到值x,x再符号扩展为32位为y,然后在%esi存储的字符串常量中找到对应位置y的字符。最后的判断只要构造出的字符串为giants,则可拆除炸弹。那么答案也就显而易见了。这道题答案不定。这里只给出其中一个:opekmq

6. phase_6

08048d98 <phase_6>:

 8048d98: 55                    push   %ebp

 8048d99: 89 e5                 mov    %esp,%ebp

 8048d9b: 83 ec 4c              sub    $0x4c,%esp

 8048d9e: 57                    push   %edi

 8048d9f: 56                    push   %esi

 8048da0: 53                    push   %ebx

 8048da1: 8b 55 08              mov    0x8(%ebp),%edx

 8048da4: c7 45 cc 6c b2 04 08 movl   $0x804b26c,-0x34(%ebp)

 8048dab: 83 c4 f8              add    $0xfffffff8,%esp

 8048dae: 8d 45 e8              lea    -0x18(%ebp),%eax

 8048db1: 50                    push   %eax

 8048db2: 52                    push   %edx

 8048db3: e8 20 02 00 00        call   8048fd8 <read_six_numbers>

 8048db8: 31 ff                 xor    %edi,%edi

 8048dba: 83 c4 10              add    $0x10,%esp

 8048dbd: 8d 76 00              lea    0x0(%esi),%esi

 8048dc0:8d 45 e8             lea    -0x18(%ebp),%eax

 8048dc3:8b 04 b8             mov    (%eax,%edi,4),%eax

 8048dc6:48                   dec    %eax

 8048dc7:83 f8 05             cmp    $0x5,%eax

 8048dca:76 05                jbe    8048dd1 <phase_6+0x39>

 8048dcc:e8 2b 07 00 00       call   80494fc <explode_bomb>

 8048dd1:8d 5f 01             lea    0x1(%edi),%ebx

 8048dd4:83 fb 05             cmp    $0x5,%ebx

 8048dd7:7f 23                jg     8048dfc <phase_6+0x64>

 8048dd9:8d 04 bd 00 00 00 00 lea    0x0(,%edi,4),%eax

 8048de0:89 45 c8             mov    %eax,-0x38(%ebp)

 8048de3:8d 75 e8             lea    -0x18(%ebp),%esi

 8048de6:8b 55 c8             mov    -0x38(%ebp),%edx

 8048de9:8b 04 32             mov    (%edx,%esi,1),%eax

 8048dec:3b 04 9e             cmp    (%esi,%ebx,4),%eax

 8048def:75 05                jne    8048df6 <phase_6+0x5e>

 8048df1:e8 06 07 00 00       call   80494fc <explode_bomb>

 8048df6:43                   inc    %ebx

 8048df7:83 fb 05             cmp    $0x5,%ebx

 8048dfa:7e ea                jle    8048de6 <phase_6+0x4e>

 8048dfc:47                   inc    %edi

 8048dfd:83 ff 05             cmp    $0x5,%edi

 8048e00:7e be                jle    8048dc0 <phase_6+0x28>

 8048e02: 31 ff                 xor    %edi,%edi

 8048e04: 8d 4d e8              lea    -0x18(%ebp),%ecx

 8048e07: 8d 45 d0              lea    -0x30(%ebp),%eax

 8048e0a: 89 45 c4              mov    %eax,-0x3c(%ebp)

 8048e0d: 8d 76 00              lea    0x0(%esi),%esi

 8048e10:8b 75 cc             mov    -0x34(%ebp),%esi

 8048e13:bb 01 00 00 00       mov    $0x1,%ebx

 8048e18:8d 04 bd 00 00 00 00 lea    0x0(,%edi,4),%eax

 8048e1f:89 c2                mov    %eax,%edx

 8048e21:3b 1c 08             cmp    (%eax,%ecx,1),%ebx

 8048e24:7d 12                jge    8048e38 <phase_6+0xa0>

 8048e26:8b 04 0a             mov    (%edx,%ecx,1),%eax

 8048e29:8d b4 26 00 00 00 00 lea    0x0(%esi,%eiz,1),%esi

 8048e30:8b 76 08             mov    0x8(%esi),%esi

 8048e33:43                   inc    %ebx

 8048e34:39 c3                cmp    %eax,%ebx

 8048e36:7c f8                jl     8048e30 <phase_6+0x98>

 8048e38:8b 55 c4             mov    -0x3c(%ebp),%edx

 8048e3b:89 34 ba             mov    %esi,(%edx,%edi,4)

 8048e3e:47                   inc    %edi

 8048e3f:83 ff 05             cmp    $0x5,%edi

 8048e42:7e cc                jle    8048e10 <phase_6+0x78>

 8048e44: 8b 75 d0              mov    -0x30(%ebp),%esi

 8048e47: 89 75 cc              mov    %esi,-0x34(%ebp)

 8048e4a: bf 01 00 00 00        mov    $0x1,%edi

 8048e4f: 8d 55 d0              lea    -0x30(%ebp),%edx

 8048e52:8b 04 ba             mov    (%edx,%edi,4),%eax

 8048e55:89 46 08             mov    %eax,0x8(%esi)

 8048e58:89 c6                mov    %eax,%esi

 8048e5a:47                   inc    %edi

 8048e5b:83 ff 05             cmp    $0x5,%edi

 8048e5e:7e f2                jle    8048e52 <phase_6+0xba>

 8048e60: c7 46 08 00 00 00 00 movl   $0x0,0x8(%esi)

 8048e67: 8b 75 cc              mov    -0x34(%ebp),%esi

 8048e6a: 31 ff                 xor    %edi,%edi

 8048e6c: 8d 74 26 00           lea    0x0(%esi,%eiz,1),%esi

 8048e70:8b 56 08             mov    0x8(%esi),%edx

 8048e73:8b 06                mov    (%esi),%eax

 8048e75:3b 02                cmp    (%edx),%eax

 8048e77:7d 05                jge    8048e7e <phase_6+0xe6>

 8048e79:e8 7e 06 00 00       call   80494fc <explode_bomb>

 8048e7e:8b 76 08             mov    0x8(%esi),%esi

 8048e81:47                   inc    %edi

 8048e82:83 ff 04             cmp    $0x4,%edi

 8048e85:7e e9                jle    8048e70 <phase_6+0xd8>

 8048e87: 8d 65 a8              lea    -0x58(%ebp),%esp

 8048e8a: 5b                    pop    %ebx

 8048e8b: 5e                    pop    %esi

 8048e8c: 5f                    pop    %edi

 8048e8d: 89 ec                 mov    %ebp,%esp

 8048e8f: 5d                    pop    %ebp

 8048e90: c3                    ret    

 8048e91: 8d 76 00              lea    0x0(%esi),%esi


具体分析:

这段代码需要输入6个数字。这里以2 1 3 4 5 6为测试数据。

红色部分:炸弹的位置,共有3个。

绿色部分:为一个双层循环。输入数据通过单步运行输出各个寄存器的值可知,这个双层循环的作用为:对输入的6个数字判断是否在1~6之间,且互不相等。若其中有大于6或有两个数相等则引爆炸弹。图7为单步调试过程部分截图。


              图7

黄色部分:为第二个循环,这个循环有点奇怪,它的作用是为地址%ebp-0x34之后的连续六个地址空间分配六个奇怪的地址。这个地址分别为0x804b260、0x804b26c、0x804b254、0x804b248、0x804b23c、0x8048230。对应图8。观察可知,这些地址大小都相差0xc,而且这个循环结束之后,0x804b26c这个最大的值位于六个连续地址的第二位,其它都是按递减顺序来的,再次分布调试代码可知,这些值得分配是按输入数据的大小来分的,它们的值对应如下表。(看不懂先看后面)

输入的数据

分配的地址

2

0x804b260

1

0x804b26c

3

0x804b254

4

0x804b248

5

0x804b23c

6

0x8048230


            图8  phase_6 部分调试过程

灰色部分:第三个循环,这个循环的作用如下:

地址

对应的值

0xbffff1d4

0x804b260

0x804b274

0x804b254

0x804b268

0x804b26c

0x804b25c

0x804b248

0x804b250

0x804b23c

0x804b244

0x804b230

简单来说,就是在第二个循环那些奇怪的值加上0x8之后对应的地址存接下来的值。可以想到类似于链表之类的东西。(看不懂先看后面)

蓝色部分:第四个循环,这个循环看完之后我瞬间明白之前两个循环的作用了。这个循环分别比较了0x804b260和0x804b26c等地址对所存值的大小,如果后者大于等于前者,就引爆炸弹。所以,这里我把所有奇怪地址对应的值都输出了。如下表。


地址

值

0x804b26c

253

0x804b260

725

0x804b254

301

0x804b248

997

0x804b23c

212

0x804b230

432

结合前面黄色部分的分析,可以知道这道题其实就是给右表这些值排个序,使他们按降序排列。

那么答案也就显而易见了:4 2 6 3 1 5

7. secrect_phase

一开始看main函数的时候就发现了一个隐藏关卡。不过不知道怎么启动。既然前六关做完离ddl还有很多时间,这里就来试一下。

main函数中每个关卡之后都有一行 call   804952c <phase_defused>,那么接下来就来看一下这个函数。

0804952c <phase_defused>:

 804952c: 55                    push   %ebp

 804952d: 89 e5                 mov    %esp,%ebp

 804952f: 83 ec 64              sub    $0x64,%esp

 8049532: 53                    push   %ebx

 8049533: 83 3d 80 b4 04 08 06 cmpl   $0x6,0x804b480    //这个直接数的值是空

 804953a: 75 63                 jne    804959f <phase_defused+0x73>

 804953c: 8d 5d b0              lea    -0x50(%ebp),%ebx

 804953f: 53                    push   %ebx

 8049540: 8d 45 ac              lea    -0x54(%ebp),%eax

 8049543: 50                    push   %eax

 8049544: 68 03 9d 04 08        push   $0x8049d03   //“%d %s”,输入一个数和一个字符串

 8049549: 68 70 b7 04 08        push   $0x804b770   //空值

 804954e: e8 0d f3 ff ff        call   8048860 <sscanf@plt>

 8049553: 83 c4 10              add    $0x10,%esp

 8049556: 83 f8 02              cmp    $0x2,%eax  //输入的数据的个数(一个字符串算一个)

 8049559: 75 37                 jne    8049592 <phase_defused+0x66>  //若不等于两个则结束这个函数

 804955b: 83 c4 f8              add    $0xfffffff8,%esp

 804955e: 68 09 9d 04 08        push   $0x8049d09    //“austinpowers”

 8049563: 53                    push   %ebx

 8049564: e8 c7 fa ff ff        call   8049030 <strings_not_equal>

 8049569: 83 c4 10              add    $0x10,%esp

 804956c: 85 c0                 test   %eax,%eax

 804956e: 75 22                 jne    8049592 <phase_defused+0x66>   //若输入的字符串和“austinpowers”不同,则结束函数

 8049570: 83 c4 f4              add    $0xfffffff4,%esp

 8049573: 68 20 9d 04 08        push   $0x8049d20   //“Curses, you've found the secret phase!\n”

 8049578: e8 93 f2 ff ff        call   8048810 <printf@plt>

 804957d: 83 c4 f4              add    $0xfffffff4,%esp

 8049580: 68 60 9d 04 08        push   $0x8049d60   //“But finding it and solving it are quite different...\n”

 8049585: e8 86 f2 ff ff        call   8048810 <printf@plt>

 804958a: 83 c4 20              add    $0x20,%esp

 804958d:e8 56 f9 ff ff       call   8048ee8 <secret_phase>    //引发隐藏关卡

 8049592: 83 c4 f4              add    $0xfffffff4,%esp

 8049595: 68 a0 9d 04 08        push   $0x8049da0      //“Congratulations! You've defused the bomb!\n”

 804959a: e8 71 f2 ff ff        call   8048810 <printf@plt>

 804959f: 8b 5d 98              mov    -0x68(%ebp),%ebx

 80495a2: 89 ec                 mov    %ebp,%esp

 80495a4: 5d                    pop    %ebp

 80495a5: c3                    ret    

 80495a6: 90                    nop

 80495a7: 90                    nop

 80495a8: 90                    nop

 80495a9: 90                    nop

 80495aa: 90                    nop

 80495ab: 90                    nop

 80495ac: 90                    nop

 80495ad: 90                    nop

 80495ae: 90                    nop

 80495af: 90                    nop

红色部分为隐藏关卡位置。

具体分析:通过阅读代码可以发现这个函数中有很多的直接数出现,经过前面的几个关卡的经验,这里直接调试输出这些直接数的值。如图9。

               图 9

将图中内容对应着代码一起看。就可以读懂这段代码了。(如代码中的注释,读懂后写的),根据注释可以知道,这段代码的引发需要两个数据,一个int和一个string。

看一下前面关卡的输入就可以知道,只有第四关的输入小于2个,其它关卡的输入都大于2。那么在第四关输入9的时候顺便输入“austinpowers”肯定可以引发隐藏关卡。如图10。

     图10   与想象中不同,以为第4关就可以引发隐藏关卡

接下来继续看secret_phase的代码(输入第一个测试数据“1234”,引爆第一颗炸弹后再输入第二个测试数据“900”)

08048ee8 <secret_phase>:

 8048ee8: 55                    push   %ebp

 8048ee9: 89 e5                 mov    %esp,%ebp

 8048eeb: 83 ec 14              sub    $0x14,%esp   //(%esp-$0x14)存储的是字符串“But finding it and solving it are quite different...\n”的首地址

 8048eee: 53                    push   %ebx     //经过调试,ebx寄存器存储的是“austinpowers”的首地址。

 8048eef: e8 08 03 00 00        call   80491fc <read_line>

 8048ef4: 6a 00                 push   $0x0

 8048ef6: 6a 0a                 push   $0xa

 8048ef8: 6a 00                 push   $0x0

 8048efa: 50                    push   %eax    //eax寄存器存储的是“1234”的首地址

 8048efb: e8 f0 f8 ff ff        call   80487f0 <__strtol_internal@plt>   //这个函数的作用不太明了,暂时看下面

 8048f00: 83 c4 10              add    $0x10,%esp

 8048f03: 89 c3                 mov    %eax,%ebx    //把%eax的值移到%ebx,此时%ebx=”1234”

 8048f05: 8d 43 ff              lea    -0x1(%ebx),%eax   //此时%eax的值为”1233”

 8048f08: 3d e8 03 00 00        cmp    $0x3e8,%eax    //把%eax的值和1000比较

 8048f0d: 76 05                 jbe    8048f14 <secret_phase+0x2c>

 8048f0f:e8 e8 05 00 00       call   80494fc <explode_bomb>    //%eax的值大于1000的话就引爆炸弹,那么此时就可以知道函数__strtol_internal的作用了,就是把字符串转化成int型,测试数据“1234”在这里引爆了第一颗炸弹。那么输入另一个测试数据“900”。

 8048f14: 83 c4 f8              add    $0xfffffff8,%esp

 8048f17: 53                    push   %ebx   //%ebx存储的是测试数据“900”

 8048f18: 68 20 b3 04 08        push   $0x804b320

 8048f1d: e8 72 ff ff ff        call   8048e94 <fun7>   //这里需要调用fun7,fun7的功能在下面分析。

 8048f22: 83 c4 10              add    $0x10,%esp

 8048f25: 83 f8 07              cmp    $0x7,%eax    //%eax存的是fun7的返回值,只要这个值和0x7想等,就可以跳过第二个炸弹

 8048f28: 74 05                 je     8048f2f <secret_phase+0x47>

 8048f2a:e8 cd 05 00 00       call   80494fc <explode_bomb>

 8048f2f: 83 c4 f4              add    $0xfffffff4,%esp

 8048f32: 68 20 98 04 08        push   $0x8049820

 8048f37: e8 d4 f8 ff ff        call   8048810 <printf@plt>

 8048f3c: e8 eb 05 00 00        call   804952c <phase_defused>

 8048f41: 8b 5d e8              mov    -0x18(%ebp),%ebx

 8048f44: 89 ec                 mov    %ebp,%esp

 8048f46: 5d                    pop    %ebp

 8048f47: c3                    ret    

 8048f48: 90                    nop

 8048f49: 90                    nop

 8048f4a: 90                    nop

 8048f4b: 90                    nop

 8048f4c: 90                    nop

 8048f4d: 90                    nop

 8048f4e: 90                    nop

 8048f4f: 90                    nop

具体分析:

红色部分:炸弹位置,第一个炸弹的引爆条件是输入的字符串大于1001。第二个炸弹的引爆条件是fun7返回值和0x7不相等。那么这个隐藏关卡的关键就只剩下fun7的作用了。

 

下面是fun7函数的代码

08048e94 <fun7>:

 8048e94: 55                    push   %ebp

 8048e95: 89 e5                 mov    %esp,%ebp

 8048e97: 83 ec 08              sub    $0x8,%esp

 8048e9a: 8b 55 08              mov    0x8(%ebp),%edx   //存的是36的地址“0x804b320”,这个地址在相同的计算机中是不会变的。

 8048e9d: 8b 45 0c              mov    0xc(%ebp),%eax   //%eax存的是900

 8048ea0: 85 d2                 test   %edx,%edx   //测试edx的值是否为0,为0的时候修改标志位ZF=1,否则ZF=0。

 8048ea2: 75 0c                 jne    8048eb0 <fun7+0x1c>   //当标志位ZF不等于1时,跳到0x8048eb0,否则,忽略这条语句

 8048ea4: b8 ff ff ff ff        mov    $0xffffffff,%eax    //把eax赋值为-1

 8048ea9: eb 37                 jmp    8048ee2 <fun7+0x4e>  //跳到0x8048ee2

 8048eab: 90                    nop

 8048eac: 8d 74 26 00           lea    0x0(%esi,%eiz,1),%esi

 8048eb0: 3b 02                 cmp    (%edx),%eax   //比较%edx存储的地址里面的值和%eax的值

 8048eb2: 7d 11                 jge    8048ec5 <fun7+0x31>   //若%eax大于等于M(%edx)的值,则跳到0x8048ec5

 8048eb4: 83 c4 f8              add    $0xfffffff8,%esp

 8048eb7: 50                    push   %eax

 8048eb8: 8b 42 04              mov    0x4(%edx),%eax    //%edx存储的值加4后得到一个地址,取这个地址里面的值x,把x赋给%eax

 8048ebb: 50                    push   %eax

 8048ebc: e8 d3 ff ff ff        call   8048e94 <fun7>

 8048ec1: 01 c0                 add    %eax,%eax    //%eax的值乘2

 8048ec3: eb 1d                 jmp    8048ee2 <fun7+0x4e>   //跳到0x8048ee2

 8048ec5: 3b 02                 cmp    (%edx),%eax     //比较M(%edx)的值和%eax的值的大小

 8048ec7: 74 17                 je     8048ee0 <fun7+0x4c>    //若M(%edx)和%eax的值相等,则跳到0x8048ee0

 8048ec9: 83 c4 f8              add    $0xfffffff8,%esp

 8048ecc: 50                    push   %eax

 8048ecd: 8b 42 08              mov    0x8(%edx),%eax   //%edx存储的值加8后得到一个地址,取这个地址里面的值x,把x赋给%eax

 8048ed0: 50                    push   %eax

 8048ed1: e8 be ff ff ff        call   8048e94 <fun7>

 8048ed6: 01 c0                 add    %eax,%eax    //%eax的值乘2

 8048ed8: 40                    inc    %eax      //%eax的值加1

 8048ed9: eb 07                 jmp    8048ee2 <fun7+0x4e>   //跳到0x8048ee2

 8048edb: 90                    nop

 8048edc: 8d 74 26 00           lea    0x0(%esi,%eiz,1),%esi

 8048ee0: 31 c0                 xor    %eax,%eax   //将%eax置为0

 8048ee2: 89 ec                 mov    %ebp,%esp

 8048ee4: 5d                    pop    %ebp

 8048ee5: c3                    ret    

 8048ee6: 89 f6                 mov    %esi,%esi

具体分析:这个函数是一个递归函数,通过对代码的阅读,可以发现这个函数的关键点是地址“0x804b320”的值,以及它加n*0x4和n*0x8的值。下表表示的就是这些地址和值的对应关系。

地址%edx

%edx为地址里面的值

0x4(%edx)

0x8(%edx)

0x804b320

36

0x804b314

0x804b308

 

 

 

 

0x804b314

8

0x804b214

0x804b2fc

0x804b308

50

0x804b2f0

0x804b2d8

 

 

 

 

0x804b214

0

0

0

0x804b2fc

22

0x0804b290

0x804b2a8

0x804b2f0

45

0x804b2cc

0x804b284

0x804b2d8

107

0x804b2b4

0x804b278

 

 

 

 

0

0

0

0

0

0

0

0

0x804b290

20

0

0

0x804b2a8

35

0

0

0x804b2cc

40

0

0

0x804b284

47

0

0

0x804b2b4

99

0

0

0x804b278

1001

0

0

通过写这个表的过程,可以发现这其实是一棵二叉树。下面以二叉树的形式来表示这些数据。


这颗二叉树我只画出不是0的部分。

结合代码和注释可以得出这个函数的作用:

设输入的数为x,x与36比较,若小于36,则继续与36的左子树比较;若大于36,则与36的右子树比较;若等于36,则%eax的值置为0。若跳到某一个子树为0时,把%eax的值置为-1。当函数返回时,若是从右子树返回,则%eax=2*%eax+1,若从左子树返回,则%eax=2*%eax。

那么为了让%eax返回0x7,那么输入的数x需要满足的首要条件是:x∈{36,8,50,22,45,107,20,35,40,47,99,1001}。因为如果x等于其它数的话,那么fun7返回的值一定为负数。所以,只需简单代入这些值计算一下就可以知道答案了。

答案为1001。

 

继续查看代码发现还有一个奇怪的关卡invalid_phase,但没找到程序入口,而且根据这个关卡名称也可以判断这是个没用的关卡。

最后是一张测试截图


总结:这次实验花的时间挺长的(接近一周的时间),主要考察GDB调试和汇编代码阅读能力,在这两方面我都需要加强。

系统分析与设计实验报告逆向工程与Report报表 系统分析与设计实验报告 阅读详情

相关推荐

贝尔实验室:逆向工程与技术创新

本章讲述了贝尔实验室的研究人员在面对Linotron 202排版设备的不可靠软件时,如何通过逆向工程和创新编程来解决问题。Ken Thompson和Joe Condon合作编写了二进制程序的反汇编器,并在数小时内破解了梅尔根特勒公司的字符编码方式,最终能够创建自己的符号系统。这一过程中,他们不仅改进了文档准备工具,还创造了用于图形集的Pic语言,以及Yacc和Lex这样的编程工具。本章还强调了贝尔实验室对出版物的支持,包括技术书籍的编写,这些书籍对计算机科学和工程技术产生了深远的影响。

weixin_30632267的博客 1075

CSAPP Bomb phase_5:指针

CSAPP Bomb实验

weixin_51703554的博客 494

PsyberProject: 恶意软件逆向工程与重构实验室

逆向工程(Reverse Engineering)是IT安全领域中的重要组成部分,它涉及对软件、系统或硬件的内部工作原理进行分析,以便理解其设计、实现和运行机制。在恶意软件分析中,逆向工程是一个关键步骤,它使安全专家能够研究恶意软件的行为,从而设计出相应的防御策略。恶意软件研究对于推动网络安全领域的进步至关重要。它不仅提高了我们对潜在威胁的理解,还推动了安全技术的发展和安全意识的提升。

weixin_29476595的博客 1606

逆向工程实验一 PE头及导入表应用

熟悉PE文件格式,通过对PE文件头分析,理解PE文件格式,掌握主要数据结构的定位及其功能,如入口点、节表、节、导入表等。研究如何利用工具对各部分的内容进行读取分析显示,理解RVA、VA、FOA之间的关系;初步掌握汇编程序的调试方法。

zzzfff__的博客 1613

逆向工程:二进制炸弹实验解密指南

汇编语言是一种低级编程语言,它和机器语言几乎一一对应,只是用助记符代替了机器语言中的二进制代码,使得程序更加易读和易写。汇编语言与机器语言的最大区别在于,汇编语言具有可读性,而机器语言只有计算机硬件能理解。它保持了机器语言与硬件的紧密联系,允许程序员直接控制硬件的各个组件,如寄存器和处理器指令。汇编语言的特点包括:接近硬件:由于汇编语言与机器语言非常接近,使得它在执行速度和资源利用方面具有很高的效率。依赖平台:不同的处理器架构有不同的汇编语言,因此它是平台相关的。

weixin_31139479的博客 1608

从零开始:使用VMOS Pro和Xposed绕过APP环境检测的完整指南

本文详细解析了使用VMOS Pro和Xposed框架绕过APP环境检测的完整技术方案,包括模拟器检测、Root环境检测和Hook框架检测的对抗方法。通过实战案例和代码示例,展示了如何利用Xposed Hook技术拦截检测逻辑,特别针对360加固等保护技术提供了解决方案。

ee345的博客 735

计算机系统(2) 实验三 逆向工程实验

计算机系统(2) 实验三 逆向工程实验一、 实验目标与要求:二、实验环境:三、实验方法与步骤:四、实验过程及内容:五、实验结论:六、心得体会: 一、 实验目标与要求: 理解程序(控制语句、函数、返回值、堆栈结构)是如何运行的 掌握GDB调试工具和objdump反汇编工具 二、实验环境: 计算机(Intel CPU) Linux64位操作系统(Ubuntu 17) GDB调试工具 objdump反汇编工具 三、实验方法与步骤: 本实验设计为一个黑客拆解二进制炸弹的游戏。我们仅给黑客(同学)提供一个二进

上山打老虎的博客 5970

Halcon实战:5种边缘检测算子对比(Sobel、Roberts、Prewitt、Kirsch、Canny)

本文深入对比了Halcon中Sobel、Roberts、Prewitt、Kirsch和Canny五大边缘检测算子的实战表现与核心差异。通过工业图像实例与代码解析,提供了基于噪声水平、边缘连续性及实时性要求的场景化选型指南,帮助工程师精准选择最适合的算子以优化视觉检测流程。

weixin_29266007的博客 393

病毒实验四

title: viruslab4 date: 2016-01-06 15:05:28 categories: virus tags: virus --- 导入地址表挂钩 工具:vs2012 ollydbg part1 完成函数GetIAFromImportTable() 遍历当前进程test.exe模块的导入地址表 找到其中存放MessageBoxA()入口地址的地址 打印出该地址以及其中存...

weixin_34402090的博客 360

2025年(第十一届)全国大学生统计建模大赛论文及选题分析

基于数据驱动决策:整个研究围绕给定的洪水灾害相关数据进行深入挖掘和分析,从数据清洗、特征分析、模型建立到最终预测,每一步都以数据为基础,通过对数据的有效利用来揭示洪水灾害发生的相关规律和特征,为洪水灾害的风险评估和预测提供依据,符合数据引领未来决策的理念。实际应用导向:洪水灾害是现实中严重影响人类生命财产安全和社会经济发展的重要问题,本研究旨在实现对洪水灾害的预测,其成果可直接应用于防洪减灾工作,如洪水预警、风险评估与区划等,对实际防灾减灾工作具有重要的指导意义,体现了以数据为支撑服务实际应用的特点。

qq_52590045的博客 1万+

MATLABGUI读取文件并将路径显示在文本框中

MATLABGUI读取文件并将路径显示在文本框中

m0_50305149的博客 2650

逆向工程实验前言

赞赏码 & 联系方式 & 个人闲话 这是什么实验? 安徽大学信息安全专业开设的逆向工程实验。同系列的漏洞挖掘先修课程参见SEEDLabs。 我为什么要上传这些解答? 回首即将结束的本科时光,SEEDLabs和逆向工程Labs是我大学生涯花费过最多精力的专业课,每周都要花费大量的时间去解决这些问题,高难度的课程内容也使得这门课成为了本校信息安全专业的劝退课程。但是SEEDLabs还是选修课程,且在有追梦者博客和实验楼SeedLabs的帮助下,80人的班级最终退课只剩近20人。而逆.

一半西瓜的博客 1812

Python 爬虫实战:爬取去哪儿网酒店评价,提取住宿体验关键词

本文介绍了基于去哪儿网酒店评价数据的爬取与分析方法。首先通过分析网页结构和数据加载机制,定位到评价数据的JSON接口及关键参数。然后使用Python搭建爬虫环境,实现多页评价数据的批量采集与存储,并通过反爬策略确保数据获取的稳定性。在文本分析环节,采用jieba分词和TF-IDF算法提取高频关键词,结合词云可视化展示用户关注点。分析结果显示位置、服务、卫生是核心关注维度,同时识别出好评与差评的关键驱动因素。该方法为酒店服务优化和消费者决策提供了数据支持,并可通过扩展实现更深入的情感分析和竞品对比。

2503_91057718的博客 999

逆向工程实验Pre9

1、2、3、4、阅读 5、MD5 Collision Attack Lab Task1: Generating Two Different Files with the Same MD5 Hash Task2: Understanding MD5’s Property Task3: Generating Two Executable Files with the Same MD5 Hash Task4: Making the Two Programs Behave Differently

一半西瓜的博客 1585

OGRE 3D----2. QGRE + QQuickView

将 OGRE(面向对象图形渲染引擎)集成到使用 QQuickView 的 Qt Quick 应用程序中,可以在现代灵活的 UI 框架中提供强大的 3D 渲染功能。本文将指导您如何在 QQuickView 环境中设置 OGRE。

charce_you的专栏 914

YOLOv8【第四章:注意力机制篇·第20节】一文讲透,注意力机制设计原则与选择指南 - 从原理到实践的系统化方法论!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》,该专栏持续复现网络上各种热门内容(全网YOLO改进最全最新的专栏,质量分97分+,全网顶流),改进内容支持(分类、检测、分割、追踪、关键点、OBB检测)。且专栏会随订阅人数上升而涨价(毕竟不断更新),当前性价比极高,有一定的参考&学习价值,部分内容会基于现有的国内外顶尖人工智能AIGC等AI大模型技术总结改进而来,嘎嘎硬核。    ✨ 特惠福利:目前活动一折秒杀价!一次订阅,永久免费,所有后续更新内容均免费阅读!

**My Coding Family** 897

【深圳大学计算机系统2】实验三 逆向工程实验

本实验设计为一个黑客拆解二进制炸弹的游戏。我们仅给黑客(同学)提供一个二进制可执行文件bomb_64和主函数所在的源程序bomb_64.c,不提供每个关卡的源代码。程序运行中有6个关卡(6个phase),每个关卡需要用户输入正确的字符串或数字才能通关,否则会引爆炸弹(打印出一条错误信息,并导致评分下降)!要求同学运用,通过分析汇编代码找到在每个phase程序段中,引导程序跳转到“explode_bomb”程序段的地方,并分析其成功跳转的条件,以此为突破口寻找应该在命令行输入何种字符串来通关。

归忆_AC的博客 3955

AWR2243的等效相位中心与虚拟通道

在俯仰维方向上,不重合的虚拟通道有8个,排序为1:4,9:12。每个虚拟阵元之间的间隔为lambda/2。实际y轴方向虚拟阵列只跨越了8*lambda/2的距离。等效相位中心与虚拟通道类似,只是每个相位中心之间间隔为lambda/4,实际y轴方向等效相位中心只跨越了8*lambda/4=7.59mm的距离

qq_50974341的博客 1981

CSAPP实验——逆向工程拆除“二进制炸弹”程序

计算机系统基础的实验课,引用了国外的实验,非常好 文章目录一、实验目的:二、实验要求三、实验内容(所修改函数代码,功能以及重要代码的解释):1.phase_12.phase_23.phase_34.phase_45.phase_5的求解6.phase_67·Secret_phase四、实验截图五、实验总结 一、实验目的: 逆向工程拆除“二进制炸弹”程序 增强对程序机器级表示、汇编语言、调试器和逆向工程等 理解。 一个“Binary Bombs”(二进制炸弹,简称炸弹)是一个 Linux可执行C程序,包含ph

Karthus77的博客 5972

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

逆向工程实验(二)

2.使用OD搜索字符串功能,搜不到有用的字符串,字符串应该是被加密了,浏览代码,发现有两个地方调用了GetDlgItemTextA和GetDlgItemInt,在这两个地方下断。eax中保存了用户输入的Serial,esi中保存了程序根据Name计算出的Serial,两者相等即通过验证。这段代码中,两次调用GetDlgItemTextA,在调用处下断,第一次调用获取输入的Name,第二次调用获取输入的Serial。在此处下断点调试,发现401335处判断name的长度,应该不小于5。6.保存文件,并运行。

tiancaia123的博客 967

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

逆向工程实验Lab7

赞赏码 & 联系方式 & 个人闲话 逆向工程前言 1、阅读 2、Crackme2.exe 3、Pseudo Random Number Generation Lab Task1: Generate Encryption Key in a Wrong Way Task2: Guessing the Key Task 3: Measure the Entropy of Kernel Task 4: Get Pseudo Random Numbers from /dev/random 4、(选做)gl.exe

一半西瓜的博客 1921

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

实验四 mybatis动态sql及逆向工程

掌握动态sql中几个重要标签,明白其应用场景;熟悉逆向工程使用方法。

2301_76979886的博客 1043

逆向工程实验Lab3

逆向工程前言 Lab3 1、What does this code do? 2、2017bath这张图片有一些文字片段可能简单加密了,是某人说的,此人的姓名是什么? 3、运行CrackMe1.exe,提示 "嗯,对了" 代表成功。 4、修改CrackMe1.exe使得:只有输入你的学号才能出现成功提示。并且把“大家好...net”这段话全部换成自己自定义的英文。 5、运行login.exe,提示 "You Get It!" 代表成功。

一半西瓜的博客 2647

逆向工程实验Lab1

赞赏码 & 联系方式 & 个人闲话 逆向工程前言 1、This is a security check to prevent automated programs from creating accounts. 2、elfpass 3、运行win.pyc,要求输出'You Win'代表成功。 4、在windows操作系统下运行cmpy2.exe,要求输出'you are right!' 5、crackme文件拷贝进seed虚拟机运行,要求输出'Congratulations!'代表成功。

一半西瓜的博客 2984
上一篇: hdu1005--(Number Sequence)
下一篇: 缓冲区溢出攻击实验
blackturtle
博客等级 码龄10年 15粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值