Bootstrap

HNU-计算机系统-实验3-BombLab

写在前面

首先要感谢A橙_大佬,在之前的实验以及学习中,许多地方参考与学习了大佬的思路。

本次实验也是听取了A橙_大佬的建议,先自己做一遍,再看答案,有了更进一步的深入理解。

最后在验收的时候,发现验收助教居然还是A橙_大佬。哈哈,他真的好温柔,还送我一本专业课书。

视频讲解

有关这个实验的讲解我录制了一个视频上传了B站,链接如下,感觉报告没有看懂的同学可以看一下这个视频,特别是对于汇编代码有进一步的讲解,可能会更容易理解一些。

HNU-CS炸弹实验……蹦蹦炸弹!_哔哩哔哩_bilibili

问题呈现 

WARNING

本次实验是根据每个同学的学号来生成的,所以无法抄袭,只能借鉴思路,每个同学的问题从答案到过程都有许多不同,唯一相同的只能说是每题的考点。

本次实验收到的是一个文件包,打开之后是这样的几个文件。

 几个文件如下

1、bomb是可执行文件,无法打开

2、bomb.c文件

/***************************************************************************
 * Dr. Evil's Insidious Bomb, Version 1.1
 * Copyright 2011, Dr. Evil Incorporated. All rights reserved.
 *
 * LICENSE:
 *
 * Dr. Evil Incorporated (the PERPETRATOR) hereby grants you (the
 * VICTIM) explicit permission to use this bomb (the BOMB).  This is a
 * time limited license, which expires on the death of the VICTIM.
 * The PERPETRATOR takes no responsibility for damage, frustration,
 * insanity, bug-eyes, carpal-tunnel syndrome, loss of sleep, or other
 * harm to the VICTIM.  Unless the PERPETRATOR wants to take credit,
 * that is.  The VICTIM may not distribute this bomb source code to
 * any enemies of the PERPETRATOR.  No VICTIM may debug,
 * reverse-engineer, run "strings" on, decompile, decrypt, or use any
 * other technique to gain knowledge of and defuse the BOMB.  BOMB
 * proof clothing may not be worn when handling this program.  The
 * PERPETRATOR will not apologize for the PERPETRATOR's poor sense of
 * humor.  This license is null and void where the BOMB is prohibited
 * by law.
 ***************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include "support.h"
#include "phases.h"

/* 
 * Note to self: Remember to erase this file so my victims will have no
 * idea what is going on, and so they will all blow up in a
 * spectaculary fiendish explosion. -- Dr. Evil 
 */

FILE *infile;

int main(int argc, char *argv[])
{
    char *input;

    /* Note to self: remember to port this bomb to Windows and put a 
     * fantastic GUI on it. */

    /* When run with no arguments, the bomb reads its input lines 
     * from standard input. */
    if (argc == 1) {  
	infile = stdin;
    } 

    /* When run with one argument <file>, the bomb reads from <file> 
     * until EOF, and then switches to standard input. Thus, as you 
     * defuse each phase, you can add its defusing string to <file> and
     * avoid having to retype it. */
    else if (argc == 2) {
	if (!(infile = fopen(argv[1], "r"))) {
	    printf("%s: Error: Couldn't open %s\n", argv[0], argv[1]);
	    exit(8);
	}
    }

    /* You can't call the bomb with more than 1 command line argument. */
    else {
	printf("Usage: %s [<input_file>]\n", argv[0]);
	exit(8);
    }

    /* Do all sorts of secret stuff that makes the bomb harder to defuse. */
    initialize_bomb();

    printf("Welcome to my fiendish little bomb. You have 6 phases with\n");
    printf("which to blow yourself up. Have a nice day!\n");

    /* Hmm...  Six phases must be more secure than one phase! */
    input = read_line();             /* Get input                   */
    phase_1(input);                  /* Run the phase               */
    phase_defused();                 /* Drat!  They figured it out!
				      * Let me know how they did it. */
    printf("Phase 1 defused. How about the next one?\n");

    /* The second phase is harder.  No one will ever figure out
     * how to defuse this... */
    input = read_line();
    phase_2(input);
    phase_defused();
    printf("That's number 2.  Keep going!\n");

    /* I guess this is too easy so far.  Some more complex code will
     * confuse people. */
    input = read_line();
    phase_3(input);
    phase_defused();
    printf("Halfway there!\n");

    /* Oh yeah?  Well, how good is your math?  Try on this saucy problem! */
    input = read_line();
    phase_4(input);
    phase_defused();
    printf("So you got that one.  Try this one.\n");
    
    /* Round and 'round in memory we go, where we stop, the bomb blows! */
    input = read_line();
    phase_5(input);
    phase_defused();
    printf("Good work!  On to the next...\n");

    /* This phase will never be used, since no one will get past the
     * earlier ones.  But just in case, make this one extra hard. */
    input = read_line();
    phase_6(input);
    phase_defused();

    /* Wow, they got it!  But isn't something... missing?  Perhaps
     * something they overlooked?  Mua ha ha ha ha! */
    
    return 0;
}

3、README文件

This is bomb 177.

It belongs to 20210801XXXX ([email protected])

说明这是属于谁的炸弹问题。(为了隐私,我把自己学号后四位抹去了)

(其实作为助教在检查开始应该先看这个的,因为有冒用他人答案的现象,但这次助教好像没看)

对bomb进行反汇编(使用objdump -d bomb >m.txt)

得到bomb.asm,这是汇编代码文件,如下

(注意:这个汇编代码文件很长,建议不要轻易打开看,会很卡顿)


bomb:     file format elf32-i386


Disassembly of section .init:

08048724 <_init>:
 8048724:	53                   	push   %ebx
 8048725:	83 ec 08             	sub    $0x8,%esp
 8048728:	e8 33 02 00 00       	call   8048960 <__x86.get_pc_thunk.bx>
 804872d:	81 c3 c7 38 00 00    	add    $0x38c7,%ebx
 8048733:	8b 83 fc ff ff ff    	mov    -0x4(%ebx),%eax
 8048739:	85 c0                	test   %eax,%eax
 804873b:	74 05                	je     8048742 <_init+0x1e>
 804873d:	e8 ee 00 00 00       	call   8048830 <__gmon_start__@plt>
 8048742:	e8 89 02 00 00       	call   80489d0 <frame_dummy>
 8048747:	e8 54 19 00 00       	call   804a0a0 <__do_global_ctors_aux>
 804874c:	83 c4 08             	add    $0x8,%esp
 804874f:	5b                   	pop    %ebx
 8048750:	c3                   	ret

Disassembly of section .plt:

08048760 <read@plt-0x10>:
 8048760:	ff 35 f8 bf 04 08    	pushl  0x804bff8
 8048766:	ff 25 fc bf 04 08    	jmp    *0x804bffc
 804876c:	00 00                	add    %al,(%eax)
	...

08048770 <read@plt>:
 8048770:	ff 25 00 c0 04 08    	jmp    *0x804c000
 8048776:	68 00 00 00 00       	push   $0x0
 804877b:	e9 e0 ff ff ff       	jmp    8048760 <_init+0x3c>

08048780 <fflush@plt>:
 8048780:	ff 25 04 c0 04 08    	jmp    *0x804c004
 8048786:	68 08 00 00 00       	push   $0x8
 804878b:	e9 d0 ff ff ff       	jmp    8048760 <_init+0x3c>

08048790 <fgets@plt>:
 8048790:	ff 25 08 c0 04 08    	jmp    *0x804c008
 8048796:	68 10 00 00 00       	push   $0x10
 804879b:	e9 c0 ff ff ff       	jmp    8048760 <_init+0x3c>

080487a0 <signal@plt>:
 80487a0:	ff 25 0c c0 04 08    	jmp    *0x804c00c
 80487a6:	68 18 00 00 00       	push   $0x18
 80487ab:	e9 b0 ff ff ff       	jmp    8048760 <_init+0x3c>

080487b0 <sleep@plt>:
 80487b0:	ff 25 10 c0 04 08    	jmp    *0x804c010
 80487b6:	68 20 00 00 00       	push   $0x20
 80487bb:	e9 a0 ff ff ff       	jmp    8048760 <_init+0x3c>

080487c0 <alarm@plt>:
 80487c0:	ff 25 14 c0 04 08    	jmp    *0x804c014
 80487c6:	68 28 00 00 00       	push   $0x28
 80487cb:	e9 90 ff ff ff       	jmp    8048760 <_init+0x3c>

080487d0 <__stack_chk_fail@plt>:
 80487d0:	ff 25 18 c0 04 08    	jmp    *0x804c018
 80487d6:	68 30 00 00 00       	push   $0x30
 80487db:	e9 80 ff ff ff       	jmp    8048760 <_init+0x3c>

080487e0 <strcpy@plt>:
 80487e0:	ff 25 1c c0 04 08    	jmp    *0x804c01c
 80487e6:	68 38 00 00 00       	push   $0x38
 80487eb:	e9 70 ff ff ff       	jmp    8048760 <_init+0x3c>

080487f0 <getenv@plt>:
 80487f0:	ff 25 20 c0 04 08    	jmp    *0x804c020
 80487f6:	68 40 00 00 00       	push   $0x40
 80487fb:	e9 60 ff ff ff       	jmp    8048760 <_init+0x3c>

08048800 <puts@plt>:
 8048800:	ff 25 24 c0 04 08    	jmp    *0x804c024
 8048806:	68 48 00 00 00       	push   $0x48
 804880b:	e9 50 ff ff ff       	jmp    8048760 <_init+0x3c>

08048810 <__memmove_chk@plt>:
 8048810:	ff 25 28 c0 04 08    	jmp    *0x804c028
 8048816:	68 50 00 00 00       	push   $0x50
 804881b:	e9 40 ff ff ff       	jmp    8048760 <_init+0x3c>

08048820 <__memcpy_chk@plt>:
 8048820:	ff 25 2c c0 04 08    	jmp    *0x804c02c
 8048826:	68 58 00 00 00       	push   $0x58
 804882b:	e9 30 ff ff ff       	jmp    8048760 <_init+0x3c>

08048830 <__gmon_start__@plt>:
 8048830:	ff 25 30 c0 04 08    	jmp    *0x804c030
 8048836:	68 60 00 00 00       	push   $0x60
 804883b:	e9 20 ff ff ff       	jmp    8048760 <_init+0x3c>

08048840 <exit@plt>:
 8048840:	ff 25 34 c0 04 08    	jmp    *0x804c034
 8048846:	68 68 00 00 00       	push   $0x68
 804884b:	e9 10 ff ff ff       	jmp    8048760 <_init+0x3c>

08048850 <__libc_start_main@plt>:
 8048850:	ff 25 38 c0 04 08    	jmp    *0x804c038
 8048856:	68 70 00 00 00       	push   $0x70
 804885b:	e9 00 ff ff ff       	jmp    8048760 <_init+0x3c>

08048860 <write@plt>:
 8048860:	ff 25 3c c0 04 08    	jmp    *0x804c03c
 8048866:	68 78 00 00 00       	push   $0x78
 804886b:	e9 f0 fe ff ff       	jmp    8048760 <_init+0x3c>

08048870 <__isoc99_sscanf@plt>:
 8048870:	ff 25 40 c0 04 08    	jmp    *0x804c040
 8048876:	68 80 00 00 00       	push   $0x80
 804887b:	e9 e0 fe ff ff       	jmp    8048760 <_init+0x3c>

08048880 <fopen@plt>:
 8048880:	ff 25 44 c0 04 08    	jmp    *0x804c044
 8048886:	68 88 00 00 00       	push   $0x88
 804888b:	e9 d0 fe ff ff       	jmp    8048760 <_init+0x3c>

08048890 <__errno_location@plt>:
 8048890:	ff 25 48 c0 04 08    	jmp    *0x804c048
 8048896:	68 90 00 00 00       	push   $0x90
 804889b:	e9 c0 fe ff ff       	jmp    8048760 <_init+0x3c>

080488a0 <__printf_chk@plt>:
 80488a0:	ff 25 4c c0 04 08    	jmp    *0x804c04c
 80488a6:	68 98 00 00 00       	push   $0x98
 80488ab:	e9 b0 fe ff ff       	jmp    8048760 <_init+0x3c>

080488b0 <socket@plt>:
 80488b0:	ff 25 50 c0 04 08    	jmp    *0x804c050
 80488b6:	68 a0 00 00 00       	push   $0xa0
 80488bb:	e9 a0 fe ff ff       	jmp    8048760 <_init+0x3c>

080488c0 <__fprintf_chk@plt>:
 80488c0:	ff 25 54 c0 04 08    	jmp    *0x804c054
 80488c6:	68 a8 00 00 00       	push   $0xa8
 80488cb:	e9 90 fe ff ff       	jmp    8048760 <_init+0x3c>

080488d0 <gethostbyname@plt>:
 80488d0:	ff 25 58 c0 04 08    	jmp    *0x804c058
 80488d6:	68 b0 00 00 00       	push   $0xb0
 80488db:	e9 80 fe ff ff       	jmp    8048760 <_init+0x3c>

080488e0 <strtol@plt>:
 80488e0:	ff 25 5c c0 04 08    	jmp    *0x804c05c
 80488e6:	68 b8 00 00 00       	push   $0xb8
 80488eb:	e9 70 fe ff ff       	jmp    8048760 <_init+0x3c>

080488f0 <connect@plt>:
 80488f0:	ff 25 60 c0 04 08    	jmp    *0x804c060
 80488f6:	68 c0 00 00 00       	push   $0xc0
 80488fb:	e9 60 fe ff ff       	jmp    8048760 <_init+0x3c>

08048900 <close@plt>:
 8048900:	ff 25 64 c0 04 08    	jmp    *0x804c064
 8048906:	68 c8 00 00 00       	push   $0xc8
 804890b:	e9 50 fe ff ff       	jmp    8048760 <_init+0x3c>

08048910 <__ctype_b_loc@plt>:
 8048910:	ff 25 68 c0 04 08    	jmp    *0x804c068
 8048916:	68 d0 00 00 00       	push   $0xd0
 804891b:	e9 40 fe ff ff       	jmp    8048760 <_init+0x3c>

08048920 <__sprintf_chk@plt>:
 8048920:	ff 25 6c c0 04 08    	jmp    *0x804c06c
 8048926:	68 d8 00 00 00       	push   $0xd8
 804892b:	e9 30 fe ff ff       	jmp    8048760 <_init+0x3c>

Disassembly of section .text:

08048930 <_start>:
 8048930:	31 ed                	xor    %ebp,%ebp
 8048932:	5e                   	pop    %esi
 8048933:	89 e1                	mov    %esp,%ecx
 8048935:	83 e4 f0             	and    $0xfffffff0,%esp
 8048938:	50                   	push   %eax
 8048939:	54                   	push   %esp
 804893a:	52                   	push   %edx
 804893b:	68 90 a0 04 08       	push   $0x804a090
 8048940:	68 20 a0 04 08       	push   $0x804a020
 8048945:	51                   	push   %ecx
 8048946:	56                   	push   %esi
 8048947:	68 f4 89 04 08       	push   $0x80489f4
 804894c:	e8 ff fe ff ff       	call   8048850 <__libc_start_main@plt>
 8048951:	f4                   	hlt
 8048952:	90                   	nop
 8048953:	90                   	nop
 8048954:	90                   	nop
 8048955:	90                   	nop
 8048956:	90                   	nop
 8048957:	90                   	nop
 8048958:	90                   	nop
 8048959:	90                   	nop
 804895a:	90                   	nop
 804895b:	90                   	nop
 804895c:	90                   	nop
 804895d:	90                   	nop
 804895e:	90                   	nop
 804895f:	90                   	nop

08048960 <__x86.get_pc_thunk.bx>:
 8048960:	8b 1c 24             	mov    (%esp),%ebx
 8048963:	c3                   	ret
 8048964:	90                   	nop
 8048965:	90                   	nop
 8048966:	90                   	nop
 8048967:	90                   	nop
 8048968:	90                   	nop
 8048969:	90                   	nop
 804896a:	90                   	nop
 804896b:	90                   	nop
 804896c:	90                   	nop
 804896d:	90                   	nop
 804896e:	90                   	nop
 804896f:	90                   	nop

08048970 <__do_global_dtors_aux>:
 8048970:	55                   	push   %ebp
 8048971:	89 e5                	mov    %esp,%ebp
 8048973:	53                   	push   %ebx
 8048974:	83 ec 04             	sub    $0x4,%esp
 8048977:	80 3d c4 c3 04 08 00 	cmpb   $0x0,0x804c3c4
 804897e:	75 3f                	jne    80489bf <__do_global_dtors_aux+0x4f>
 8048980:	a1 c8 c3 04 08       	mov    0x804c3c8,%eax
 8048985:	bb 20 bf 04 08       	mov    $0x804bf20,%ebx
 804898a:	81 eb 1c bf 04 08    	sub    $0x804bf1c,%ebx
 8048990:	c1 fb 02             	sar    $0x2,%ebx
 8048993:	83 eb 01             	sub    $0x1,%ebx
 8048996:	39 d8                	cmp    %ebx,%eax
 8048998:	73 1e                	jae    80489b8 <__do_global_dtors_aux+0x48>
 804899a:	8d b6 00 00 00 00    	lea    0x0(%esi),%esi
 80489a0:	83 c0 01             	add    $0x1,%eax
 80489a3:	a3 c8 c3 04 08       	mov    %eax,0x804c3c8
 80489a8:	ff 14 85 1c bf 04 08 	call   *0x804bf1c(,%eax,4)
 80489af:	a1 c8 c3 04 08       	mov    0x804c3c8,%eax
 80489b4:	39 d8                	cmp    %ebx,%eax
 80489b6:	72 e8                	jb     80489a0 <__do_global_dtors_aux+0x30>
 80489b8:	c6 05 c4 c3 04 08 01 	movb   $0x1,0x804c3c4
 80489bf:	83 c4 04             	add    $0x4,%esp
 80489c2:	5b                   	pop    %ebx
 80489c3:	5d                   	pop    %ebp
 80489c4:	c3                   	ret
 80489c5:	8d 74 26 00          	lea    0x0(%esi,%eiz,1),%esi
 80489c9:	8d bc 27 00 00 00 00 	lea    0x0(%edi,%eiz,1),%edi

080489d0 <frame_dummy>:
 80489d0:	55                   	push   %ebp
 80489d1:	89 e5                	mov    %esp,%ebp
 80489d3:	83 ec 18             	sub    $0x18,%esp
 80489d6:	a1 24 bf 04 08       	mov    0x804bf24,%eax
 80489db:	85 c0                	test   %eax,%eax
 80489dd:	74 12                	je     80489f1 <frame_dummy+0x21>
 80489df:	b8 00 00 00 00       	mov    $0x0,%eax
 80489e4:	85 c0                	test   %eax,%eax
 80489e6:	74 09                	je     80489f1 <frame_dummy+0x21>
 80489e8:	c7 04 24 24 bf 04 08 	movl   $0x804bf24,(%esp)
 80489ef:	ff d0                	call   *%eax
 80489f1:	c9                   	leave
 80489f2:	c3                   	ret
 80489f3:	90                   	nop

080489f4 <main>:
 80489f4:	55                   	push   %ebp
 80489f5:	89 e5                	mov    %esp,%ebp
 80489f7:	53                   	push   %ebx
 80489f8:	83 e4 f0             	and    $0xfffffff0,%esp
 80489fb:	83 ec 10             	sub    $0x10,%esp
 80489fe:	8b 45 08             	mov    0x8(%ebp),%eax
 8048a01:	8b 5d 0c             	mov    0xc(%ebp),%ebx
 8048a04:	83 f8 01             	cmp    $0x1,%eax
 8048a07:	75 0c                	jne    8048a15 <main+0x21>
 8048a09:	a1 a4 c3 04 08       	mov    0x804c3a4,%eax
 8048a0e:	a3 d0 c3 04 08       	mov    %eax,0x804c3d0
 8048a13:	eb 74                	jmp    8048a89 <main+0x95>
 8048a15:	83 f8 02             	cmp    $0x2,%eax
 8048a18:	75 49                	jne    8048a63 <main+0x6f>
 8048a1a:	c7 44 24 04 08 a1 04 	movl   $0x804a108,0x4(%esp)
 8048a21:	08
 8048a22:	8b 43 04             	mov    0x4(%ebx),%eax
 8048a25:	89 04 24             	mov    %eax,(%esp)
 8048a28:	e8 53 fe ff ff       	call   8048880 <fopen@plt>
 8048a2d:	a3 d0 c3 04 08       	mov    %eax,0x804c3d0
 8048a32:	85 c0                	test   %eax,%eax
 8048a34:	75 53                	jne    8048a89 <main+0x95>
 8048a36:	8b 43 04             	mov    0x4(%ebx),%eax
 8048a39:	89 44 24 0c          	mov    %eax,0xc(%esp)
 8048a3d:	8b 03                	mov    (%ebx),%eax
 8048a3f:	89 44 24 08          	mov    %eax,0x8(%esp)
 8048a43:	c7 44 24 04 0a a1 04 	movl   $0x804a10a,0x4(%esp)
 8048a4a:	08
 8048a4b:	c7 04 24 01 00 00 00 	movl   $0x1,(%esp)
 8048a52:	e8 49 fe ff ff       	call   80488a0 <__printf_chk@plt>
 8048a57:	c7 04 24 08 00 00 00 	movl   $0x8,(%esp)
 8048a5e:	e8 dd fd ff ff       	call   8048840 <exit@plt>
 8048a63:	8b 03                	mov    (%ebx),%eax
 8048a65:	89 44 24 08          	mov    %eax,0x8(%esp)
 8048a69:	c7 44 24 04 27 a1 04 	movl   $0x804a127,0x4(%esp)
 8048a70:	08
 8048a71:	c7 04 24 01 00 00 00 	movl   $0x1,(%esp)
 8048a78:	e8 23 fe ff ff       	call   80488a0 <__printf_chk@plt>
 8048a7d:	c7 04 24 08 00 00 00 	movl   $0x8,(%esp)
 8048a84:	e8 b7 fd ff ff       	call   8048840 <exit@plt>
 8048a89:	e8 4d 06 00 00       	call   80490db <initialize_bomb>
 8048a8e:	c7 04 24 8c a1 04 08 	movl   $0x804a18c,(%esp)
 8048a95:	e8 66 fd ff ff       	call   8048800 <puts@plt>
 8048a9a:	c7 04 24 c8 a1 04 08 	movl   $0x804a1c8,(%esp)
 8048aa1:	e8 5a fd ff ff       	call   8048800 <puts@plt>
 8048aa6:	e8 f2 06 00 00       	call   804919d <read_line>
 8048aab:	89 04 24             	mov    %eax,(%esp)
 8048aae:	e8 ad 00 00 00       	call   8048b60 <phase_1>
 8048ab3:	e8 43 08 00 00       	call   80492fb <phase_defused>
 8048ab8:	c7 04 24 f4 a1 04 08 	movl   $0x804a1f4,(%esp)
 8048abf:	e8 3c fd ff ff       	call   8048800 <puts@plt>
 8048ac4:	e8 d4 06 00 00       	call   804919d <read_line>
 8048ac9:	89 04 24             	mov    %eax,(%esp)
 8048acc:	e8 b3 00 00 00       	call   8048b84 <phase_2>
 8048ad1:	e8 25 08 00 00       	call   80492fb <phase_defused>
 8048ad6:	c7 04 24 41 a1 04 08 	movl   $0x804a141,(%esp)
 8048add:	e8 1e fd ff ff       	call   8048800 <puts@plt>
 8048ae2:	e8 b6 06 00 00       	call   804919d <read_line>
 8048ae7:	89 04 24             	mov    %eax,(%esp)
 8048aea:	e8 e5 00 00 00       	call   8048bd4 <phase_3>
 8048aef:	e8 07 08 00 00       	call   80492fb <phase_defused>
 8048af4:	c7 04 24 5f a1 04 08 	movl   $0x804a15f,(%esp)
 8048afb:	e8 00 fd ff ff       	call   8048800 <puts@plt>
 8048b00:	e8 98 06 00 00       	call   804919d <read_line>
 8048b05:	89 04 24             	mov    %eax,(%esp)
 8048b08:	e8 7d 02 00 00       	call   8048d8a <phase_4>
 8048b0d:	e8 e9 07 00 00       	call   80492fb <phase_defused>
 8048b12:	c7 04 24 20 a2 04 08 	movl   $0x804a220,(%esp)
 8048b19:	e8 e2 fc ff ff       	call   8048800 <puts@plt>
 8048b1e:	e8 7a 06 00 00       	call   804919d <read_line>
 8048b23:	89 04 24             	mov    %eax,(%esp)
 8048b26:	e8 c1 02 00 00       	call   8048dec <phase_5>
 8048b2b:	e8 cb 07 00 00       	call   80492fb <phase_defused>
 8048b30:	c7 04 24 6e a1 04 08 	movl   $0x804a16e,(%esp)
 8048b37:	e8 c4 fc ff ff       	call   8048800 <puts@plt>
 8048b3c:	e8 5c 06 00 00       	call   804919d <read_line>
 8048b41:	89 04 24             	mov    %eax,(%esp)
 8048b44:	e8 ec 02 00 00       	call   8048e35 <phase_6>
 8048b49:	e8 ad 07 00 00       	call   80492fb <phase_defused>
 8048b4e:	b8 00 00 00 00       	mov    $0x0,%eax
 8048b53:	8b 5d fc             	mov    -0x4(%ebp),%ebx
 8048b56:	c9                   	leave
 8048b57:	c3                   	ret
 8048b58:	90                   	nop
 8048b59:	90                   	nop
 8048b5a:	90                   	nop
 8048b5b:	90                   	nop
 8048b5c:	90                   	nop
 8048b5d:	90                   	nop
 8048b5e:	90                   	nop
 8048b5f:	90                   	nop

08048b60 <phase_1>:
 8048b60:	83 ec 1c             	sub    $0x1c,%esp
 8048b63:	c7 44 24 04 44 a2 04 	movl   $0x804a244,0x4(%esp)
 8048b6a:	08
 8048b6b:	8b 44 24 20          	mov    0x20(%esp),%eax
 8048b6f:	89 04 24             	mov    %eax,(%esp)
 8048b72:	e8 ed 04 00 00       	call   8049064 <strings_not_equal>			#比较两个字符串是否相等
 8048b77:	85 c0                	test   %eax,%eax
 8048b79:	74 05                	je     8048b80 <phase_1+0x20>				#函数返回0,即字符串相等,就通过
 8048b7b:	e8 f6 05 00 00       	call   8049176 <explode_bomb>
 8048b80:	83 c4 1c             	add    $0x1c,%esp
 8048b83:	c3                   	ret

08048b84 <phase_2>:
 8048b84:	56                   	push   %esi
 8048b85:	53                   	push   %ebx
 8048b86:	83 ec 34             	sub    $0x34,%esp
 8048b89:	8d 44 24 18          	lea    0x18(%esp),%eax
 8048b8d:	89 44 24 04          	mov    %eax,0x4(%esp)
 8048b91:	8b 44 24 40          	mov    0x40(%esp),%eax
 8048b95:	89 04 24             	mov    %eax,(%esp)
 8048b98:	e8 0e 07 00 00       	call   80492ab <read_six_numbers>
 8048b9d:	83 7c 24 18 00       	cmpl   $0x0,0x18(%esp)						#m[0]=0
 8048ba2:	75 07                	jne    8048bab <phase_2+0x27>
 8048ba4:	83 7c 24 1c 01       	cmpl   $0x1,0x1c(%esp)						#m[1]=1
 8048ba9:	74 05                	je     8048bb0 <phase_2+0x2c>
 8048bab:	e8 c6 05 00 00       	call   8049176 <explode_bomb>

 8048bb0:	8d 5c 24 20          	lea    0x20(%esp),%ebx
 8048bb4:	8d 74 24 30          	lea    0x30(%esp),%esi						#%esi存放m[5]地址(遍历完成终点)
 8048bb8:	8b 43 f8             	mov    -0x8(%ebx),%eax
 8048bbb:	03 43 fc             	add    -0x4(%ebx),%eax						#temp=m[i]+m[i-1]
 8048bbe:	39 03                	cmp    %eax,(%ebx)
 8048bc0:	74 05                	je     8048bc7 <phase_2+0x43>				#判断m[i]=m[i-1]+m[i-2]是否成立
 8048bc2:	e8 af 05 00 00       	call   8049176 <explode_bomb>
 8048bc7:	83 c3 04             	add    $0x4,%ebx							#%ebx表示当前访问的地址(循环控制变量)
 8048bca:	39 f3                	cmp    %esi,%ebx
 8048bcc:	75 ea                	jne    8048bb8 <phase_2+0x34>
 8048bce:	83 c4 34             	add    $0x34,%esp
 8048bd1:	5b                   	pop    %ebx
 8048bd2:	5e                   	pop    %esi
 8048bd3:	c3                   	ret

08048bd4 <phase_3>:
 8048bd4:	83 ec 3c             	sub    $0x3c,%esp
 8048bd7:	8d 44 24 28          	lea    0x28(%esp),%eax					#第3个参数位置
 8048bdb:	89 44 24 10          	mov    %eax,0x10(%esp)
 8048bdf:	8d 44 24 2f          	lea    0x2f(%esp),%eax					#第2个参数位置
 8048be3:	89 44 24 0c          	mov    %eax,0xc(%esp)
 8048be7:	8d 44 24 24          	lea    0x24(%esp),%eax					#第1个参数位置
 8048beb:	89 44 24 08          	mov    %eax,0x8(%esp)
 8048bef:	c7 44 24 04 9e a2 04 	movl   $0x804a29e,0x4(%esp)				#"%d %c %d"读取数据的格式
 8048bf6:	08
 8048bf7:	8b 44 24 40          	mov    0x40(%esp),%eax					#读入数据存放的地址
 8048bfb:	89 04 24             	mov    %eax,(%esp)
 8048bfe:	e8 6d fc ff ff       	call   8048870 <__isoc99_sscanf@plt>
 8048c03:	83 f8 02             	cmp    $0x2,%eax						#要求读入数据个数>2
 8048c06:	7f 05                	jg     8048c0d <phase_3+0x39>
 8048c08:	e8 69 05 00 00       	call   8049176 <explode_bomb>
 8048c0d:	83 7c 24 24 07       	cmpl   $0x7,0x24(%esp)					#跳转决定值0<=n<=7,共8个可能值
 8048c12:	0f 87 fc 00 00 00    	ja     8048d14 <phase_3+0x140>
 8048c18:	8b 44 24 24          	mov    0x24(%esp),%eax
 8048c1c:	ff 24 85 c0 a2 04 08 	jmp    *0x804a2c0(,%eax,4)				#跳转表,在跳转表中找到目标地址并跳转

 8048c23:	b8 64 00 00 00       	mov    $0x64,%eax						#n=0
 8048c28:	81 7c 24 28 80 00 00 	cmpl   $0x80,0x28(%esp)
 8048c2f:	00
 8048c30:	0f 84 e8 00 00 00    	je     8048d1e <phase_3+0x14a>			#比较数字值是否正确
 8048c36:	e8 3b 05 00 00       	call   8049176 <explode_bomb>
 8048c3b:	b8 64 00 00 00       	mov    $0x64,%eax						#将正确字符值存入%eax,等待比较
 8048c40:	e9 d9 00 00 00       	jmp    8048d1e <phase_3+0x14a>

 8048c45:	b8 6f 00 00 00       	mov    $0x6f,%eax						#n=1
 8048c4a:	81 7c 24 28 35 01 00 	cmpl   $0x135,0x28(%esp)
 8048c51:	00
 8048c52:	0f 84 c6 00 00 00    	je     8048d1e <phase_3+0x14a>
 8048c58:	e8 19 05 00 00       	call   8049176 <explode_bomb>
 8048c5d:	b8 6f 00 00 00       	mov    $0x6f,%eax
 8048c62:	e9 b7 00 00 00       	jmp    8048d1e <phase_3+0x14a>

 8048c67:	b8 67 00 00 00       	mov    $0x67,%eax						#n=2
 8048c6c:	81 7c 24 28 48 03 00 	cmpl   $0x348,0x28(%esp)
 8048c73:	00
 8048c74:	0f 84 a4 00 00 00    	je     8048d1e <phase_3+0x14a>
 8048c7a:	e8 f7 04 00 00       	call   8049176 <explode_bomb>
 8048c7f:	b8 67 00 00 00       	mov    $0x67,%eax
 8048c84:	e9 95 00 00 00       	jmp    8048d1e <phase_3+0x14a>

 8048c89:	b8 6b 00 00 00       	mov    $0x6b,%eax						#n=3
 8048c8e:	81 7c 24 28 6d 01 00 	cmpl   $0x16d,0x28(%esp)
 8048c95:	00
 8048c96:	0f 84 82 00 00 00    	je     8048d1e <phase_3+0x14a>
 8048c9c:	e8 d5 04 00 00       	call   8049176 <explode_bomb>
 8048ca1:	b8 6b 00 00 00       	mov    $0x6b,%eax
 8048ca6:	eb 76                	jmp    8048d1e <phase_3+0x14a>

 8048ca8:	b8 75 00 00 00       	mov    $0x75,%eax						#n=4
 8048cad:	81 7c 24 28 d7 01 00 	cmpl   $0x1d7,0x28(%esp)
 8048cb4:	00
 8048cb5:	74 67                	je     8048d1e <phase_3+0x14a>
 8048cb7:	e8 ba 04 00 00       	call   8049176 <explode_bomb>
 8048cbc:	b8 75 00 00 00       	mov    $0x75,%eax
 8048cc1:	eb 5b                	jmp    8048d1e <phase_3+0x14a>

 8048cc3:	b8 72 00 00 00       	mov    $0x72,%eax						#n=5
 8048cc8:	81 7c 24 28 1b 03 00 	cmpl   $0x31b,0x28(%esp)
 8048ccf:	00
 8048cd0:	74 4c                	je     8048d1e <phase_3+0x14a>
 8048cd2:	e8 9f 04 00 00       	call   8049176 <explode_bomb>
 8048cd7:	b8 72 00 00 00       	mov    $0x72,%eax
 8048cdc:	eb 40                	jmp    8048d1e <phase_3+0x14a>

 8048cde:	b8 6e 00 00 00       	mov    $0x6e,%eax						#n=6
 8048ce3:	81 7c 24 28 04 02 00 	cmpl   $0x204,0x28(%esp)
 8048cea:	00
 8048ceb:	74 31                	je     8048d1e <phase_3+0x14a>
 8048ced:	e8 84 04 00 00       	call   8049176 <explode_bomb>
 8048cf2:	b8 6e 00 00 00       	mov    $0x6e,%eax
 8048cf7:	eb 25                	jmp    8048d1e <phase_3+0x14a>

 8048cf9:	b8 6f 00 00 00       	mov    $0x6f,%eax						#n=7
 8048cfe:	81 7c 24 28 b0 00 00 	cmpl   $0xb0,0x28(%esp)
 8048d05:	00
 8048d06:	74 16                	je     8048d1e <phase_3+0x14a>
 8048d08:	e8 69 04 00 00       	call   8049176 <explode_bomb>
 8048d0d:	b8 6f 00 00 00       	mov    $0x6f,%eax
 8048d12:	eb 0a                	jmp    8048d1e <phase_3+0x14a>

 8048d14:	e8 5d 04 00 00       	call   8049176 <explode_bomb>
 8048d19:	b8 6a 00 00 00       	mov    $0x6a,%eax
 8048d1e:	3a 44 24 2f          	cmp    0x2f(%esp),%al					#比较字符值是否正确
 8048d22:	74 05                	je     8048d29 <phase_3+0x155>
 8048d24:	e8 4d 04 00 00       	call   8049176 <explode_bomb>
 8048d29:	83 c4 3c             	add    $0x3c,%esp
 8048d2c:	c3                   	ret

08048d2d <func4>:
 8048d2d:	83 ec 1c             	sub    $0x1c,%esp
 8048d30:	89 5c 24 10          	mov    %ebx,0x10(%esp)
 8048d34:	89 74 24 14          	mov    %esi,0x14(%esp)
 8048d38:	89 7c 24 18          	mov    %edi,0x18(%esp)
 8048d3c:	8b 74 24 20          	mov    0x20(%esp),%esi				#%esi为n
 8048d40:	8b 5c 24 24          	mov    0x24(%esp),%ebx				#%ebx为x
 8048d44:	85 f6                	test   %esi,%esi					#n=0,到达最底层,返回0
 8048d46:	7e 2b                	jle    8048d73 <func4+0x46>
 8048d48:	83 fe 01             	cmp    $0x1,%esi
 8048d4b:	74 2b                	je     8048d78 <func4+0x4b>			#若n=1,返回%ebx
 8048d4d:	89 5c 24 04          	mov    %ebx,0x4(%esp)
 8048d51:	8d 46 ff             	lea    -0x1(%esi),%eax
 8048d54:	89 04 24             	mov    %eax,(%esp)
 8048d57:	e8 d1 ff ff ff       	call   8048d2d <func4>				#func4(n-1,x)
 8048d5c:	8d 3c 18             	lea    (%eax,%ebx,1),%edi			#%edi=func4(n-1,x)+x
 8048d5f:	89 5c 24 04          	mov    %ebx,0x4(%esp)
 8048d63:	83 ee 02             	sub    $0x2,%esi
 8048d66:	89 34 24             	mov    %esi,(%esp)
 8048d69:	e8 bf ff ff ff       	call   8048d2d <func4>				#func4(n-2,x)
 8048d6e:	8d 1c 07             	lea    (%edi,%eax,1),%ebx			#%ebx=func4(n-1,x)+func4(n-2,x)+x
 8048d71:	eb 05                	jmp    8048d78 <func4+0x4b>
 8048d73:	bb 00 00 00 00       	mov    $0x0,%ebx
 8048d78:	89 d8                	mov    %ebx,%eax
 8048d7a:	8b 5c 24 10          	mov    0x10(%esp),%ebx
 8048d7e:	8b 74 24 14          	mov    0x14(%esp),%esi
 8048d82:	8b 7c 24 18          	mov    0x18(%esp),%edi
 8048d86:	83 c4 1c             	add    $0x1c,%esp					#return %ebx
 8048d89:	c3                   	ret

08048d8a <phase_4>:
 8048d8a:	83 ec 2c             	sub    $0x2c,%esp
 8048d8d:	8d 44 24 18          	lea    0x18(%esp),%eax
 8048d91:	89 44 24 0c          	mov    %eax,0xc(%esp)
 8048d95:	8d 44 24 1c          	lea    0x1c(%esp),%eax
 8048d99:	89 44 24 08          	mov    %eax,0x8(%esp)
 8048d9d:	c7 44 24 04 83 a4 04 	movl   $0x804a483,0x4(%esp)				#输入格式"%d %d"
 8048da4:	08
 8048da5:	8b 44 24 30          	mov    0x30(%esp),%eax
 8048da9:	89 04 24             	mov    %eax,(%esp)
 8048dac:	e8 bf fa ff ff       	call   8048870 <__isoc99_sscanf@plt>	#scanf(check,x)
 8048db1:	83 f8 02             	cmp    $0x2,%eax						#输入的是两个数
 8048db4:	75 0e                	jne    8048dc4 <phase_4+0x3a>
 8048db6:	8b 44 24 18          	mov    0x18(%esp),%eax
 8048dba:	83 f8 01             	cmp    $0x1,%eax
 8048dbd:	7e 05                	jle    8048dc4 <phase_4+0x3a>
 8048dbf:	83 f8 04             	cmp    $0x4,%eax						#1<x<=4,x=2,3,4
 8048dc2:	7e 05                	jle    8048dc9 <phase_4+0x3f>
 8048dc4:	e8 ad 03 00 00       	call   8049176 <explode_bomb>
 8048dc9:	8b 44 24 18          	mov    0x18(%esp),%eax
 8048dcd:	89 44 24 04          	mov    %eax,0x4(%esp)
 8048dd1:	c7 04 24 09 00 00 00 	movl   $0x9,(%esp)
 8048dd8:	e8 50 ff ff ff       	call   8048d2d <func4>					#func4(n=9,x)
 8048ddd:	3b 44 24 1c          	cmp    0x1c(%esp),%eax					#投机取巧的方法,可以直接看答案
 8048de1:	74 05                	je     8048de8 <phase_4+0x5e>
 8048de3:	e8 8e 03 00 00       	call   8049176 <explode_bomb>
 8048de8:	83 c4 2c             	add    $0x2c,%esp
 8048deb:	c3                   	ret

08048dec <phase_5>:
 8048dec:	53                   	push   %ebx
 8048ded:	83 ec 18             	sub    $0x18,%esp
 8048df0:	8b 5c 24 20          	mov    0x20(%esp),%ebx
 8048df4:	89 1c 24             	mov    %ebx,(%esp)
 8048df7:	e8 4f 02 00 00       	call   804904b <string_length>
 8048dfc:	83 f8 06             	cmp    $0x6,%eax						#字符6位
 8048dff:	74 05                	je     8048e06 <phase_5+0x1a>
 8048e01:	e8 70 03 00 00       	call   8049176 <explode_bomb>
 8048e06:	ba 00 00 00 00       	mov    $0x0,%edx
 8048e0b:	b8 00 00 00 00       	mov    $0x0,%eax						#%eax为计数器,表示处理的位数i
 8048e10:	0f be 0c 03          	movsbl (%ebx,%eax,1),%ecx				#loop开始
 8048e14:	83 e1 0f             	and    $0xf,%ecx
 8048e17:	03 14 8d e0 a2 04 08 	add    0x804a2e0(,%ecx,4),%edx
 8048e1e:	83 c0 01             	add    $0x1,%eax						#循环控制变量i++
 8048e21:	83 f8 06             	cmp    $0x6,%eax
 8048e24:	75 ea                	jne    8048e10 <phase_5+0x24>			#loop结尾,查看循环控制变量是否到达
 8048e26:	83 fa 38             	cmp    $0x38,%edx
 8048e29:	74 05                	je     8048e30 <phase_5+0x44>			#与给定值相比较
 8048e2b:	e8 46 03 00 00       	call   8049176 <explode_bomb>
 8048e30:	83 c4 18             	add    $0x18,%esp
 8048e33:	5b                   	pop    %ebx
 8048e34:	c3                   	ret

08048e35 <phase_6>:
 8048e35:	56                   	push   %esi
 8048e36:	53                   	push   %ebx
 8048e37:	83 ec 44             	sub    $0x44,%esp
 8048e3a:	8d 44 24 10          	lea    0x10(%esp),%eax
 8048e3e:	89 44 24 04          	mov    %eax,0x4(%esp)
 8048e42:	8b 44 24 50          	mov    0x50(%esp),%eax
 8048e46:	89 04 24             	mov    %eax,(%esp)
 8048e49:	e8 5d 04 00 00       	call   80492ab <read_six_numbers>

 8048e4e:	be 00 00 00 00        	mov    $0x0,%esi						#initial esi=0
 8048e53:	8b 44 b4 10          	mov    0x10(%esp,%esi,4),%eax		#loop 外层(控制变量esi)
 8048e57:	83 e8 01             	sub    $0x1,%eax
 8048e5a:	83 f8 05             	cmp    $0x5,%eax
 8048e5d:	76 05                	jbe    8048e64 <phase_6+0x2f>			#eax<=6正常(控制变量ebx)
 8048e5f:	e8 12 03 00 00       	call   8049176 <explode_bomb>
 8048e64:	83 c6 01             	add    $0x1,%esi						#esi++
 8048e67:	83 fe 06             	cmp    $0x6,%esi
 8048e6a:	74 33                	je     8048e9f <phase_6+0x6a>			#esi=6,跳出循环
 8048e6c:	89 f3                	mov    %esi,%ebx						#esi!=6
 8048e6e:	8b 44 9c 10          	mov    0x10(%esp,%ebx,4),%eax			#loop 内层
 8048e72:	39 44 b4 0c          	cmp    %eax,0xc(%esp,%esi,4)
 8048e76:	75 05                	jne    8048e7d <phase_6+0x48>			#
 8048e78:	e8 f9 02 00 00       	call   8049176 <explode_bomb>
 8048e7d:	83 c3 01             	add    $0x1,%ebx						#ebx++
 8048e80:	83 fb 05             	cmp    $0x5,%ebx
 8048e83:	7e e9                	jle    8048e6e <phase_6+0x39>	  	 	#loop 内层 ebx:esi..5
 8048e85:	eb cc                	jmp    8048e53 <phase_6+0x1e>		#loop 外层 esi:0..5

 8048e87:	8b 52 08             	mov    0x8(%edx),%edx			#ecx>1:通过循环得到编号对应的数据地址
 8048e8a:	83 c0 01             	add    $0x1,%eax
 8048e8d:	39 c8                	cmp    %ecx,%eax						#loop2
 8048e8f:	75 f6                	jne    8048e87 <phase_6+0x52>
 8048e91:	89 54 b4 28          	mov    %edx,0x28(%esp,%esi,4)			#将编号对应的数据地址放入数组中
 8048e95:	83 c3 01             	add    $0x1,%ebx						#ebx++
 8048e98:	83 fb 06             	cmp    $0x6,%ebx
 8048e9b:	75 07                	jne    8048ea4 <phase_6+0x6f>			#ebx!=6,重复循环
 8048e9d:	eb 1c                	jmp    8048ebb <phase_6+0x86>			#ebx=6跳出
 8048e9f:	bb 00 00 00 00       	mov    $0x0,%ebx						#第二阶段开始:esi=6跳出循环后
 8048ea4:	89 de                	mov    %ebx,%esi
 8048ea6:	8b 4c 9c 10          	mov    0x10(%esp,%ebx,4),%ecx
 8048eaa:	b8 01 00 00 00       	mov    $0x1,%eax
 8048eaf:	ba 3c c1 04 08       	mov    $0x804c13c,%edx					#给定数据首地址放入%edx
 8048eb4:	83 f9 01             	cmp    $0x1,%ecx
 8048eb7:	7f ce                	jg     8048e87 <phase_6+0x52>			#ecx>1
 8048eb9:	eb d6                	jmp    8048e91 <phase_6+0x5c>			#ecx=1,没必要进入loop2

 8048ebb:	8b 5c 24 28          	mov    0x28(%esp),%ebx			#第三阶段开始:ebx=6跳出循环后
 8048ebf:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 8048ec3:	89 43 08             	mov    %eax,0x8(%ebx)			#*b[0]->next=*b[1]
 8048ec6:	8b 54 24 30          	mov    0x30(%esp),%edx
 8048eca:	89 50 08             	mov    %edx,0x8(%eax)			#*b[1]->next=*b[2]
 8048ecd:	8b 44 24 34          	mov    0x34(%esp),%eax
 8048ed1:	89 42 08             	mov    %eax,0x8(%edx)			#*b[2]->next=*b[3]
 8048ed4:	8b 54 24 38          	mov    0x38(%esp),%edx
 8048ed8:	89 50 08             	mov    %edx,0x8(%eax)			#*b[3]->next=*b[4]
 8048edb:	8b 44 24 3c          	mov    0x3c(%esp),%eax
 8048edf:	89 42 08             	mov    %eax,0x8(%edx)			#*b[4]->next=*b[5]
 8048ee2:	c7 40 08 00 00 00 00 	movl   $0x0,0x8(%eax)

 8048ee9:	be 05 00 00 00       	mov    $0x5,%esi					#loop(循环控制变量为%esi)
 8048eee:	8b 43 08             	mov    0x8(%ebx),%eax
 8048ef1:	8b 10                	mov    (%eax),%edx
 8048ef3:	39 13                	cmp    %edx,(%ebx)
 8048ef5:	7e 05                	jle    8048efc <phase_6+0xc7>		#要求(0x8(%ebx))<(%ebx),即递增
 8048ef7:	e8 7a 02 00 00       	call   8049176 <explode_bomb>
 8048efc:	8b 5b 08             	mov    0x8(%ebx),%ebx
 8048eff:	83 ee 01             	sub    $0x1,%esi
 8048f02:	75 ea                	jne    8048eee <phase_6+0xb9>
 8048f04:	83 c4 44             	add    $0x44,%esp
 8048f07:	5b                   	pop    %ebx
 8048f08:	5e                   	pop    %esi
 8048f09:	c3                   	ret

08048f0a <fun7>:
 8048f0a:	53                   	push   %ebx
 8048f0b:	83 ec 18             	sub    $0x18,%esp
 8048f0e:	8b 54 24 20          	mov    0x20(%esp),%edx			#读取参数1放入%edx(x)
 8048f12:	8b 4c 24 24          	mov    0x24(%esp),%ecx			#读取参数2放入%ecx(input)
 8048f16:	85 d2                	test   %edx,%edx
 8048f18:	74 37                	je     8048f51 <fun7+0x47>		#x为0,返回-1
 8048f1a:	8b 1a                	mov    (%edx),%ebx
 8048f1c:	39 cb                	cmp    %ecx,%ebx				#比较input和*x
 8048f1e:	7e 13                	jle    8048f33 <fun7+0x29>

 8048f20:	89 4c 24 04          	mov    %ecx,0x4(%esp)			#*x>input 参数2:input
 8048f24:	8b 42 04             	mov    0x4(%edx),%eax
 8048f27:	89 04 24             	mov    %eax,(%esp)				#参数1:(x+4)
 8048f2a:	e8 db ff ff ff       	call   8048f0a <fun7>
 8048f2f:	01 c0                	add    %eax,%eax
 8048f31:	eb 23                	jmp    8048f56 <fun7+0x4c>		#返回(2fun7())

 8048f33:	b8 00 00 00 00       	mov    $0x0,%eax				#*x<=input
 8048f38:	39 cb                	cmp    %ecx,%ebx
 8048f3a:	74 1a                	je     8048f56 <fun7+0x4c>		#*x=input,返回0
 8048f3c:	89 4c 24 04          	mov    %ecx,0x4(%esp)			#参数2:input
 8048f40:	8b 42 08             	mov    0x8(%edx),%eax
 8048f43:	89 04 24             	mov    %eax,(%esp)				#参数1:(x+8)
 8048f46:	e8 bf ff ff ff       	call   8048f0a <fun7>			#调用fun7()
 8048f4b:	8d 44 00 01          	lea    0x1(%eax,%eax,1),%eax
 8048f4f:	eb 05                	jmp    8048f56 <fun7+0x4c>		#返回(2fun7()+1)

 8048f51:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 8048f56:	83 c4 18             	add    $0x18,%esp
 8048f59:	5b                   	pop    %ebx
 8048f5a:	c3                   	ret

08048f5b <secret_phase>:
 8048f5b:	53                   	push   %ebx
 8048f5c:	83 ec 18             	sub    $0x18,%esp
 8048f5f:	e8 39 02 00 00       	call   804919d <read_line>
 8048f64:	c7 44 24 08 0a 00 00 	movl   $0xa,0x8(%esp)			#参数3
 8048f6b:	00
 8048f6c:	c7 44 24 04 00 00 00 	movl   $0x0,0x4(%esp)			#参数2
 8048f73:	00
 8048f74:	89 04 24             	mov    %eax,(%esp)				#参数1:read_line的返回值
 8048f77:	e8 64 f9 ff ff       	call   80488e0 <strtol@plt>
 8048f7c:	89 c3                	mov    %eax,%ebx
 8048f7e:	8d 40 ff             	lea    -0x1(%eax),%eax
 8048f81:	3d e8 03 00 00       	cmp    $0x3e8,%eax				#0x3e8=1000
 8048f86:	76 05                	jbe    8048f8d <secret_phase+0x32>	#strtol返回值<1000
 8048f88:	e8 e9 01 00 00       	call   8049176 <explode_bomb>
 8048f8d:	89 5c 24 04          	mov    %ebx,0x4(%esp)			#参数2:strtol的返回值(即为输入值input)
 8048f91:	c7 04 24 88 c0 04 08 	movl   $0x804c088,(%esp)		#*0x804c088="0x24"即36 参数1
 8048f98:	e8 6d ff ff ff       	call   8048f0a <fun7>
 8048f9d:	85 c0                	test   %eax,%eax
 8048f9f:	74 05                	je     8048fa6 <secret_phase+0x4b>	#fun7返回值得是0
 8048fa1:	e8 d0 01 00 00       	call   8049176 <explode_bomb>
 8048fa6:	c7 04 24 78 a2 04 08 	movl   $0x804a278,(%esp)			#输出隐藏关通过
 8048fad:	e8 4e f8 ff ff       	call   8048800 <puts@plt>
 8048fb2:	e8 44 03 00 00       	call   80492fb <phase_defused>
 8048fb7:	83 c4 18             	add    $0x18,%esp
 8048fba:	5b                   	pop    %ebx
 8048fbb:	c3                   	ret
 8048fbc:	90                   	nop
 8048fbd:	90                   	nop
 8048fbe:	90                   	nop
 8048fbf:	90                   	nop

08048fc0 <sig_handler>:
 8048fc0:	83 ec 1c             	sub    $0x1c,%esp
 8048fc3:	c7 04 24 20 a3 04 08 	movl   $0x804a320,(%esp)
 8048fca:	e8 31 f8 ff ff       	call   8048800 <puts@plt>
 8048fcf:	c7 04 24 03 00 00 00 	movl   $0x3,(%esp)
 8048fd6:	e8 d5 f7 ff ff       	call   80487b0 <sleep@plt>
 8048fdb:	c7 44 24 04 e2 a3 04 	movl   $0x804a3e2,0x4(%esp)
 8048fe2:	08
 8048fe3:	c7 04 24 01 00 00 00 	movl   $0x1,(%esp)
 8048fea:	e8 b1 f8 ff ff       	call   80488a0 <__printf_chk@plt>
 8048fef:	a1 c0 c3 04 08       	mov    0x804c3c0,%eax
 8048ff4:	89 04 24             	mov    %eax,(%esp)
 8048ff7:	e8 84 f7 ff ff       	call   8048780 <fflush@plt>
 8048ffc:	c7 04 24 01 00 00 00 	movl   $0x1,(%esp)
 8049003:	e8 a8 f7 ff ff       	call   80487b0 <sleep@plt>
 8049008:	c7 04 24 ea a3 04 08 	movl   $0x804a3ea,(%esp)
 804900f:	e8 ec f7 ff ff       	call   8048800 <puts@plt>
 8049014:	c7 04 24 10 00 00 00 	movl   $0x10,(%esp)
 804901b:	e8 20 f8 ff ff       	call   8048840 <exit@plt>

08049020 <invalid_phase>:
 8049020:	83 ec 1c             	sub    $0x1c,%esp
 8049023:	8b 44 24 20          	mov    0x20(%esp),%eax
 8049027:	89 44 24 08          	mov    %eax,0x8(%esp)
 804902b:	c7 44 24 04 f2 a3 04 	movl   $0x804a3f2,0x4(%esp)
 8049032:	08
 8049033:	c7 04 24 01 00 00 00 	movl   $0x1,(%esp)
 804903a:	e8 61 f8 ff ff       	call   80488a0 <__printf_chk@plt>
 804903f:	c7 04 24 08 00 00 00 	movl   $0x8,(%esp)
 8049046:	e8 f5 f7 ff ff       	call   8048840 <exit@plt>

0804904b <string_length>:
 804904b:	8b 54 24 04          	mov    0x4(%esp),%edx
 804904f:	b8 00 00 00 00       	mov    $0x0,%eax
 8049054:	80 3a 00             	cmpb   $0x0,(%edx)
 8049057:	74 09                	je     8049062 <string_length+0x17>
 8049059:	83 c0 01             	add    $0x1,%eax
 804905c:	80 3c 02 00          	cmpb   $0x0,(%edx,%eax,1)
 8049060:	75 f7                	jne    8049059 <string_length+0xe>
 8049062:	f3 c3                	repz ret

08049064 <strings_not_equal>:
 8049064:	83 ec 10             	sub    $0x10,%esp
 8049067:	89 5c 24 04          	mov    %ebx,0x4(%esp)
 804906b:	89 74 24 08          	mov    %esi,0x8(%esp)
 804906f:	89 7c 24 0c          	mov    %edi,0xc(%esp)
 8049073:	8b 5c 24 14          	mov    0x14(%esp),%ebx
 8049077:	8b 74 24 18          	mov    0x18(%esp),%esi
 804907b:	89 1c 24             	mov    %ebx,(%esp)
 804907e:	e8 c8 ff ff ff       	call   804904b <string_length>
 8049083:	89 c7                	mov    %eax,%edi
 8049085:	89 34 24             	mov    %esi,(%esp)
 8049088:	e8 be ff ff ff       	call   804904b <string_length>
 804908d:	ba 01 00 00 00       	mov    $0x1,%edx
 8049092:	39 c7                	cmp    %eax,%edi
 8049094:	75 33                	jne    80490c9 <strings_not_equal+0x65>
 8049096:	0f b6 03             	movzbl (%ebx),%eax
 8049099:	b2 00                	mov    $0x0,%dl
 804909b:	84 c0                	test   %al,%al
 804909d:	74 2a                	je     80490c9 <strings_not_equal+0x65>
 804909f:	b2 01                	mov    $0x1,%dl
 80490a1:	3a 06                	cmp    (%esi),%al
 80490a3:	75 24                	jne    80490c9 <strings_not_equal+0x65>
 80490a5:	b8 00 00 00 00       	mov    $0x0,%eax
 80490aa:	eb 08                	jmp    80490b4 <strings_not_equal+0x50>
 80490ac:	83 c0 01             	add    $0x1,%eax
 80490af:	3a 14 06             	cmp    (%esi,%eax,1),%dl
 80490b2:	75 10                	jne    80490c4 <strings_not_equal+0x60>
 80490b4:	0f b6 54 03 01       	movzbl 0x1(%ebx,%eax,1),%edx
 80490b9:	84 d2                	test   %dl,%dl
 80490bb:	75 ef                	jne    80490ac <strings_not_equal+0x48>
 80490bd:	ba 00 00 00 00       	mov    $0x0,%edx
 80490c2:	eb 05                	jmp    80490c9 <strings_not_equal+0x65>
 80490c4:	ba 01 00 00 00       	mov    $0x1,%edx
 80490c9:	89 d0                	mov    %edx,%eax
 80490cb:	8b 5c 24 04          	mov    0x4(%esp),%ebx
 80490cf:	8b 74 24 08          	mov    0x8(%esp),%esi
 80490d3:	8b 7c 24 0c          	mov    0xc(%esp),%edi
 80490d7:	83 c4 10             	add    $0x10,%esp
 80490da:	c3                   	ret

080490db <initialize_bomb>:
 80490db:	83 ec 1c             	sub    $0x1c,%esp
 80490de:	c7 44 24 04 c0 8f 04 	movl   $0x8048fc0,0x4(%esp)
 80490e5:	08
 80490e6:	c7 04 24 02 00 00 00 	movl   $0x2,(%esp)
 80490ed:	e8 ae f6 ff ff       	call   80487a0 <signal@plt>
 80490f2:	83 c4 1c             	add    $0x1c,%esp
 80490f5:	c3                   	ret

080490f6 <initialize_bomb_solve>:
 80490f6:	f3 c3                	repz ret

080490f8 <blank_line>:
 80490f8:	56                   	push   %esi
 80490f9:	53                   	push   %ebx
 80490fa:	83 ec 04             	sub    $0x4,%esp
 80490fd:	8b 74 24 10          	mov    0x10(%esp),%esi
 8049101:	eb 14                	jmp    8049117 <blank_line+0x1f>
 8049103:	e8 08 f8 ff ff       	call   8048910 <__ctype_b_loc@plt>
 8049108:	83 c6 01             	add    $0x1,%esi
 804910b:	0f be db             	movsbl %bl,%ebx
 804910e:	8b 00                	mov    (%eax),%eax
 8049110:	f6 44 58 01 20       	testb  $0x20,0x1(%eax,%ebx,2)
 8049115:	74 0e                	je     8049125 <blank_line+0x2d>
 8049117:	0f b6 1e             	movzbl (%esi),%ebx
 804911a:	84 db                	test   %bl,%bl
 804911c:	75 e5                	jne    8049103 <blank_line+0xb>
 804911e:	b8 01 00 00 00       	mov    $0x1,%eax
 8049123:	eb 05                	jmp    804912a <blank_line+0x32>
 8049125:	b8 00 00 00 00       	mov    $0x0,%eax
 804912a:	83 c4 04             	add    $0x4,%esp
 804912d:	5b                   	pop    %ebx
 804912e:	5e                   	pop    %esi
 804912f:	c3                   	ret

08049130 <skip>:
 8049130:	53                   	push   %ebx
 8049131:	83 ec 18             	sub    $0x18,%esp
 8049134:	a1 d0 c3 04 08       	mov    0x804c3d0,%eax
 8049139:	89 44 24 08          	mov    %eax,0x8(%esp)
 804913d:	c7 44 24 04 50 00 00 	movl   $0x50,0x4(%esp)
 8049144:	00
 8049145:	a1 cc c3 04 08       	mov    0x804c3cc,%eax
 804914a:	8d 04 80             	lea    (%eax,%eax,4),%eax
 804914d:	c1 e0 04             	shl    $0x4,%eax
 8049150:	05 e0 c3 04 08       	add    $0x804c3e0,%eax
 8049155:	89 04 24             	mov    %eax,(%esp)
 8049158:	e8 33 f6 ff ff       	call   8048790 <fgets@plt>
 804915d:	89 c3                	mov    %eax,%ebx
 804915f:	85 c0                	test   %eax,%eax
 8049161:	74 0c                	je     804916f <skip+0x3f>
 8049163:	89 04 24             	mov    %eax,(%esp)
 8049166:	e8 8d ff ff ff       	call   80490f8 <blank_line>
 804916b:	85 c0                	test   %eax,%eax
 804916d:	75 c5                	jne    8049134 <skip+0x4>
 804916f:	89 d8                	mov    %ebx,%eax
 8049171:	83 c4 18             	add    $0x18,%esp
 8049174:	5b                   	pop    %ebx
 8049175:	c3                   	ret

08049176 <explode_bomb>:
 8049176:	83 ec 1c             	sub    $0x1c,%esp
 8049179:	c7 04 24 03 a4 04 08 	movl   $0x804a403,(%esp)
 8049180:	e8 7b f6 ff ff       	call   8048800 <puts@plt>
 8049185:	c7 04 24 0c a4 04 08 	movl   $0x804a40c,(%esp)
 804918c:	e8 6f f6 ff ff       	call   8048800 <puts@plt>
 8049191:	c7 04 24 08 00 00 00 	movl   $0x8,(%esp)
 8049198:	e8 a3 f6 ff ff       	call   8048840 <exit@plt>

0804919d <read_line>:
 804919d:	83 ec 2c             	sub    $0x2c,%esp
 80491a0:	89 5c 24 20          	mov    %ebx,0x20(%esp)
 80491a4:	89 74 24 24          	mov    %esi,0x24(%esp)
 80491a8:	89 7c 24 28          	mov    %edi,0x28(%esp)
 80491ac:	e8 7f ff ff ff       	call   8049130 <skip>
 80491b1:	85 c0                	test   %eax,%eax
 80491b3:	75 6c                	jne    8049221 <read_line+0x84>
 80491b5:	a1 a4 c3 04 08       	mov    0x804c3a4,%eax
 80491ba:	39 05 d0 c3 04 08    	cmp    %eax,0x804c3d0
 80491c0:	75 18                	jne    80491da <read_line+0x3d>
 80491c2:	c7 04 24 23 a4 04 08 	movl   $0x804a423,(%esp)
 80491c9:	e8 32 f6 ff ff       	call   8048800 <puts@plt>
 80491ce:	c7 04 24 08 00 00 00 	movl   $0x8,(%esp)
 80491d5:	e8 66 f6 ff ff       	call   8048840 <exit@plt>
 80491da:	c7 04 24 41 a4 04 08 	movl   $0x804a441,(%esp)
 80491e1:	e8 0a f6 ff ff       	call   80487f0 <getenv@plt>
 80491e6:	85 c0                	test   %eax,%eax
 80491e8:	74 0c                	je     80491f6 <read_line+0x59>
 80491ea:	c7 04 24 00 00 00 00 	movl   $0x0,(%esp)
 80491f1:	e8 4a f6 ff ff       	call   8048840 <exit@plt>
 80491f6:	a1 a4 c3 04 08       	mov    0x804c3a4,%eax
 80491fb:	a3 d0 c3 04 08       	mov    %eax,0x804c3d0
 8049200:	e8 2b ff ff ff       	call   8049130 <skip>
 8049205:	85 c0                	test   %eax,%eax
 8049207:	75 18                	jne    8049221 <read_line+0x84>
 8049209:	c7 04 24 23 a4 04 08 	movl   $0x804a423,(%esp)
 8049210:	e8 eb f5 ff ff       	call   8048800 <puts@plt>
 8049215:	c7 04 24 00 00 00 00 	movl   $0x0,(%esp)
 804921c:	e8 1f f6 ff ff       	call   8048840 <exit@plt>
 8049221:	8b 15 cc c3 04 08    	mov    0x804c3cc,%edx
 8049227:	8d 1c 92             	lea    (%edx,%edx,4),%ebx
 804922a:	c1 e3 04             	shl    $0x4,%ebx
 804922d:	81 c3 e0 c3 04 08    	add    $0x804c3e0,%ebx
 8049233:	89 df                	mov    %ebx,%edi
 8049235:	b8 00 00 00 00       	mov    $0x0,%eax
 804923a:	b9 ff ff ff ff       	mov    $0xffffffff,%ecx
 804923f:	f2 ae                	repnz scas %es:(%edi),%al
 8049241:	f7 d1                	not    %ecx
 8049243:	83 e9 01             	sub    $0x1,%ecx
 8049246:	83 f9 4e             	cmp    $0x4e,%ecx
 8049249:	7e 37                	jle    8049282 <read_line+0xe5>
 804924b:	c7 04 24 4c a4 04 08 	movl   $0x804a44c,(%esp)
 8049252:	e8 a9 f5 ff ff       	call   8048800 <puts@plt>
 8049257:	a1 cc c3 04 08       	mov    0x804c3cc,%eax
 804925c:	8d 50 01             	lea    0x1(%eax),%edx
 804925f:	89 15 cc c3 04 08    	mov    %edx,0x804c3cc
 8049265:	6b c0 50             	imul   $0x50,%eax,%eax
 8049268:	05 e0 c3 04 08       	add    $0x804c3e0,%eax
 804926d:	ba 67 a4 04 08       	mov    $0x804a467,%edx
 8049272:	b9 04 00 00 00       	mov    $0x4,%ecx
 8049277:	89 c7                	mov    %eax,%edi
 8049279:	89 d6                	mov    %edx,%esi
 804927b:	f3 a5                	rep movsl %ds:(%esi),%es:(%edi)
 804927d:	e8 f4 fe ff ff       	call   8049176 <explode_bomb>
 8049282:	8d 04 92             	lea    (%edx,%edx,4),%eax
 8049285:	c1 e0 04             	shl    $0x4,%eax
 8049288:	c6 84 01 df c3 04 08 	movb   $0x0,0x804c3df(%ecx,%eax,1)
 804928f:	00
 8049290:	83 c2 01             	add    $0x1,%edx
 8049293:	89 15 cc c3 04 08    	mov    %edx,0x804c3cc
 8049299:	89 d8                	mov    %ebx,%eax
 804929b:	8b 5c 24 20          	mov    0x20(%esp),%ebx
 804929f:	8b 74 24 24          	mov    0x24(%esp),%esi
 80492a3:	8b 7c 24 28          	mov    0x28(%esp),%edi
 80492a7:	83 c4 2c             	add    $0x2c,%esp
 80492aa:	c3                   	ret

080492ab <read_six_numbers>:
 80492ab:	83 ec 2c             	sub    $0x2c,%esp
 80492ae:	8b 44 24 34          	mov    0x34(%esp),%eax
 80492b2:	8d 50 14             	lea    0x14(%eax),%edx
 80492b5:	89 54 24 1c          	mov    %edx,0x1c(%esp)
 80492b9:	8d 50 10             	lea    0x10(%eax),%edx
 80492bc:	89 54 24 18          	mov    %edx,0x18(%esp)
 80492c0:	8d 50 0c             	lea    0xc(%eax),%edx
 80492c3:	89 54 24 14          	mov    %edx,0x14(%esp)
 80492c7:	8d 50 08             	lea    0x8(%eax),%edx
 80492ca:	89 54 24 10          	mov    %edx,0x10(%esp)
 80492ce:	8d 50 04             	lea    0x4(%eax),%edx
 80492d1:	89 54 24 0c          	mov    %edx,0xc(%esp)
 80492d5:	89 44 24 08          	mov    %eax,0x8(%esp)
 80492d9:	c7 44 24 04 77 a4 04 	movl   $0x804a477,0x4(%esp)
 80492e0:	08
 80492e1:	8b 44 24 30          	mov    0x30(%esp),%eax
 80492e5:	89 04 24             	mov    %eax,(%esp)
 80492e8:	e8 83 f5 ff ff       	call   8048870 <__isoc99_sscanf@plt>
 80492ed:	83 f8 05             	cmp    $0x5,%eax
 80492f0:	7f 05                	jg     80492f7 <read_six_numbers+0x4c>
 80492f2:	e8 7f fe ff ff       	call   8049176 <explode_bomb>
 80492f7:	83 c4 2c             	add    $0x2c,%esp
 80492fa:	c3                   	ret

080492fb <phase_defused>:
 80492fb:	81 ec 8c 00 00 00    	sub    $0x8c,%esp
 8049301:	65 a1 14 00 00 00    	mov    %gs:0x14,%eax
 8049307:	89 44 24 7c          	mov    %eax,0x7c(%esp)
 804930b:	31 c0                	xor    %eax,%eax
 804930d:	83 3d cc c3 04 08 06 	cmpl   $0x6,0x804c3cc
 8049314:	75 72                	jne    8049388 <phase_defused+0x8d>	#若前6关都通过则进入,否则自动跳出
 8049316:	8d 44 24 2c          	lea    0x2c(%esp),%eax
 804931a:	89 44 24 10          	mov    %eax,0x10(%esp)
 804931e:	8d 44 24 28          	lea    0x28(%esp),%eax
 8049322:	89 44 24 0c          	mov    %eax,0xc(%esp)
 8049326:	8d 44 24 24          	lea    0x24(%esp),%eax
 804932a:	89 44 24 08          	mov    %eax,0x8(%esp)
 804932e:	c7 44 24 04 89 a4 04 	movl   $0x804a489,0x4(%esp)		#"%d %d %s",即两个数字后还要输入字符串
 8049335:	08
 8049336:	c7 04 24 d0 c4 04 08 	movl   $0x804c4d0,(%esp)
 804933d:	e8 2e f5 ff ff       	call   8048870 <__isoc99_sscanf@plt>	#第四关中同样出现了此段调用
 8049342:	83 f8 03             	cmp    $0x3,%eax
 8049345:	75 35                	jne    804937c <phase_defused+0x81>	#若第四关中输入个数不是3个,不触发
 8049347:	c7 44 24 04 92 a4 04 	movl   $0x804a492,0x4(%esp)			#第二个参数"DrEvil"
 804934e:	08
 804934f:	8d 44 24 2c          	lea    0x2c(%esp),%eax				#第一个参数
 8049353:	89 04 24             	mov    %eax,(%esp)
 8049356:	e8 09 fd ff ff       	call   8049064 <strings_not_equal>	#比较密码是否相等(重点关注)
 804935b:	85 c0                	test   %eax,%eax
 804935d:	75 1d                	jne    804937c <phase_defused+0x81>	#若第四关中输入的密码错误,不触发
 804935f:	c7 04 24 58 a3 04 08 	movl   $0x804a358,(%esp)
 8049366:	e8 95 f4 ff ff       	call   8048800 <puts@plt>
 804936b:	c7 04 24 80 a3 04 08 	movl   $0x804a380,(%esp)
 8049372:	e8 89 f4 ff ff       	call   8048800 <puts@plt>			#这一段是输出"找到隐藏关"的记录
 8049377:	e8 df fb ff ff       	call   8048f5b <secret_phase>		#进入隐藏关
 804937c:	c7 04 24 b8 a3 04 08 	movl   $0x804a3b8,(%esp)			#输出通过(未触发隐藏关)
 8049383:	e8 78 f4 ff ff       	call   8048800 <puts@plt>
 8049388:	8b 44 24 7c          	mov    0x7c(%esp),%eax
 804938c:	65 33 05 14 00 00 00 	xor    %gs:0x14,%eax
 8049393:	74 05                	je     804939a <phase_defused+0x9f>
 8049395:	e8 36 f4 ff ff       	call   80487d0 <__stack_chk_fail@plt>
 804939a:	81 c4 8c 00 00 00    	add    $0x8c,%esp
 80493a0:	c3                   	ret
 80493a1:	90                   	nop
 80493a2:	90                   	nop
 80493a3:	90                   	nop
 80493a4:	90                   	nop
 80493a5:	90                   	nop
 80493a6:	90                   	nop
 80493a7:	90                   	nop
 80493a8:	90                   	nop
 80493a9:	90                   	nop
 80493aa:	90                   	nop
 80493ab:	90                   	nop
 80493ac:	90                   	nop
 80493ad:	90                   	nop
 80493ae:	90                   	nop
 80493af:	90                   	nop

080493b0 <rio_readlineb>:
 80493b0:	55                   	push   %ebp
 80493b1:	57                   	push   %edi
 80493b2:	56                   	push   %esi
 80493b3:	53                   	push   %ebx
 80493b4:	83 ec 3c             	sub    $0x3c,%esp
 80493b7:	89 c3                	mov    %eax,%ebx
 80493b9:	83 f9 01             	cmp    $0x1,%ecx
 80493bc:	0f 86 bb 00 00 00    	jbe    804947d <rio_readlineb+0xcd>
 80493c2:	89 4c 24 1c          	mov    %ecx,0x1c(%esp)
 80493c6:	89 54 24 18          	mov    %edx,0x18(%esp)
 80493ca:	bd 01 00 00 00       	mov    $0x1,%ebp
 80493cf:	8d 78 0c             	lea    0xc(%eax),%edi
 80493d2:	eb 3c                	jmp    8049410 <rio_readlineb+0x60>
 80493d4:	c7 44 24 08 00 20 00 	movl   $0x2000,0x8(%esp)
 80493db:	00
 80493dc:	89 7c 24 04          	mov    %edi,0x4(%esp)
 80493e0:	8b 03                	mov    (%ebx),%eax
 80493e2:	89 04 24             	mov    %eax,(%esp)
 80493e5:	e8 86 f3 ff ff       	call   8048770 <read@plt>
 80493ea:	89 43 04             	mov    %eax,0x4(%ebx)
 80493ed:	85 c0                	test   %eax,%eax
 80493ef:	79 14                	jns    8049405 <rio_readlineb+0x55>
 80493f1:	e8 9a f4 ff ff       	call   8048890 <__errno_location@plt>
 80493f6:	83 38 04             	cmpl   $0x4,(%eax)
 80493f9:	74 15                	je     8049410 <rio_readlineb+0x60>
 80493fb:	90                   	nop
 80493fc:	8d 74 26 00          	lea    0x0(%esi,%eiz,1),%esi
 8049400:	e9 a0 00 00 00       	jmp    80494a5 <rio_readlineb+0xf5>
 8049405:	85 c0                	test   %eax,%eax
 8049407:	0f 84 9f 00 00 00    	je     80494ac <rio_readlineb+0xfc>
 804940d:	89 7b 08             	mov    %edi,0x8(%ebx)
 8049410:	8b 73 04             	mov    0x4(%ebx),%esi
 8049413:	85 f6                	test   %esi,%esi
 8049415:	7e bd                	jle    80493d4 <rio_readlineb+0x24>
 8049417:	85 f6                	test   %esi,%esi
 8049419:	0f 85 96 00 00 00    	jne    80494b5 <rio_readlineb+0x105>
 804941f:	c7 44 24 0c 01 00 00 	movl   $0x1,0xc(%esp)
 8049426:	00
 8049427:	89 74 24 08          	mov    %esi,0x8(%esp)
 804942b:	8b 43 08             	mov    0x8(%ebx),%eax
 804942e:	89 44 24 04          	mov    %eax,0x4(%esp)
 8049432:	8d 44 24 2f          	lea    0x2f(%esp),%eax
 8049436:	89 04 24             	mov    %eax,(%esp)
 8049439:	e8 e2 f3 ff ff       	call   8048820 <__memcpy_chk@plt>
 804943e:	01 73 08             	add    %esi,0x8(%ebx)
 8049441:	29 73 04             	sub    %esi,0x4(%ebx)
 8049444:	83 fe 01             	cmp    $0x1,%esi
 8049447:	75 18                	jne    8049461 <rio_readlineb+0xb1>
 8049449:	0f b6 44 24 2f       	movzbl 0x2f(%esp),%eax
 804944e:	8b 54 24 18          	mov    0x18(%esp),%edx
 8049452:	88 02                	mov    %al,(%edx)
 8049454:	83 c2 01             	add    $0x1,%edx
 8049457:	89 54 24 18          	mov    %edx,0x18(%esp)
 804945b:	3c 0a                	cmp    $0xa,%al
 804945d:	75 13                	jne    8049472 <rio_readlineb+0xc2>
 804945f:	eb 25                	jmp    8049486 <rio_readlineb+0xd6>
 8049461:	89 e8                	mov    %ebp,%eax
 8049463:	85 f6                	test   %esi,%esi
 8049465:	75 28                	jne    804948f <rio_readlineb+0xdf>
 8049467:	83 f8 01             	cmp    $0x1,%eax
 804946a:	75 1a                	jne    8049486 <rio_readlineb+0xd6>
 804946c:	8d 74 26 00          	lea    0x0(%esi,%eiz,1),%esi
 8049470:	eb 24                	jmp    8049496 <rio_readlineb+0xe6>
 8049472:	83 c5 01             	add    $0x1,%ebp
 8049475:	3b 6c 24 1c          	cmp    0x1c(%esp),%ebp
 8049479:	75 95                	jne    8049410 <rio_readlineb+0x60>
 804947b:	eb 09                	jmp    8049486 <rio_readlineb+0xd6>
 804947d:	89 54 24 18          	mov    %edx,0x18(%esp)
 8049481:	bd 01 00 00 00       	mov    $0x1,%ebp
 8049486:	8b 44 24 18          	mov    0x18(%esp),%eax
 804948a:	c6 00 00             	movb   $0x0,(%eax)
 804948d:	eb 0c                	jmp    804949b <rio_readlineb+0xeb>
 804948f:	bd ff ff ff ff       	mov    $0xffffffff,%ebp
 8049494:	eb 05                	jmp    804949b <rio_readlineb+0xeb>
 8049496:	bd 00 00 00 00       	mov    $0x0,%ebp
 804949b:	89 e8                	mov    %ebp,%eax
 804949d:	83 c4 3c             	add    $0x3c,%esp
 80494a0:	5b                   	pop    %ebx
 80494a1:	5e                   	pop    %esi
 80494a2:	5f                   	pop    %edi
 80494a3:	5d                   	pop    %ebp
 80494a4:	c3                   	ret
 80494a5:	be ff ff ff ff       	mov    $0xffffffff,%esi
 80494aa:	eb 05                	jmp    80494b1 <rio_readlineb+0x101>
 80494ac:	be 00 00 00 00       	mov    $0x0,%esi
 80494b1:	89 e8                	mov    %ebp,%eax
 80494b3:	eb ae                	jmp    8049463 <rio_readlineb+0xb3>
 80494b5:	8b 43 08             	mov    0x8(%ebx),%eax
 80494b8:	0f b6 00             	movzbl (%eax),%eax
 80494bb:	88 44 24 2f          	mov    %al,0x2f(%esp)
 80494bf:	83 43 08 01          	addl   $0x1,0x8(%ebx)
 80494c3:	83 6b 04 01          	subl   $0x1,0x4(%ebx)
 80494c7:	eb 80                	jmp    8049449 <rio_readlineb+0x99>

080494c9 <sigalrm_handler>:
 80494c9:	83 ec 1c             	sub    $0x1c,%esp
 80494cc:	c7 44 24 0c 00 00 00 	movl   $0x0,0xc(%esp)
 80494d3:	00
 80494d4:	c7 44 24 08 b0 a4 04 	movl   $0x804a4b0,0x8(%esp)
 80494db:	08
 80494dc:	c7 44 24 04 01 00 00 	movl   $0x1,0x4(%esp)
 80494e3:	00
 80494e4:	a1 a0 c3 04 08       	mov    0x804c3a0,%eax
 80494e9:	89 04 24             	mov    %eax,(%esp)
 80494ec:	e8 cf f3 ff ff       	call   80488c0 <__fprintf_chk@plt>
 80494f1:	c7 04 24 01 00 00 00 	movl   $0x1,(%esp)
 80494f8:	e8 43 f3 ff ff       	call   8048840 <exit@plt>

080494fd <submitr>:
 80494fd:	55                   	push   %ebp
 80494fe:	57                   	push   %edi
 80494ff:	56                   	push   %esi
 8049500:	53                   	push   %ebx
 8049501:	81 ec 7c a0 00 00    	sub    $0xa07c,%esp
 8049507:	8b 9c 24 90 a0 00 00 	mov    0xa090(%esp),%ebx
 804950e:	8b 84 24 98 a0 00 00 	mov    0xa098(%esp),%eax
 8049515:	89 44 24 30          	mov    %eax,0x30(%esp)
 8049519:	8b 94 24 9c a0 00 00 	mov    0xa09c(%esp),%edx
 8049520:	89 54 24 34          	mov    %edx,0x34(%esp)
 8049524:	8b 8c 24 a0 a0 00 00 	mov    0xa0a0(%esp),%ecx
 804952b:	89 4c 24 38          	mov    %ecx,0x38(%esp)
 804952f:	8b ac 24 a4 a0 00 00 	mov    0xa0a4(%esp),%ebp
 8049536:	8b 84 24 a8 a0 00 00 	mov    0xa0a8(%esp),%eax
 804953d:	89 44 24 28          	mov    %eax,0x28(%esp)
 8049541:	65 8b 15 14 00 00 00 	mov    %gs:0x14,%edx
 8049548:	89 94 24 6c a0 00 00 	mov    %edx,0xa06c(%esp)
 804954f:	31 d2                	xor    %edx,%edx
 8049551:	c7 44 24 44 00 00 00 	movl   $0x0,0x44(%esp)
 8049558:	00
 8049559:	c7 44 24 08 00 00 00 	movl   $0x0,0x8(%esp)
 8049560:	00
 8049561:	c7 44 24 04 01 00 00 	movl   $0x1,0x4(%esp)
 8049568:	00
 8049569:	c7 04 24 02 00 00 00 	movl   $0x2,(%esp)
 8049570:	e8 3b f3 ff ff       	call   80488b0 <socket@plt>
 8049575:	89 44 24 2c          	mov    %eax,0x2c(%esp)
 8049579:	85 c0                	test   %eax,%eax
 804957b:	79 52                	jns    80495cf <submitr+0xd2>
 804957d:	8b 4c 24 28          	mov    0x28(%esp),%ecx
 8049581:	c7 01 45 72 72 6f    	movl   $0x6f727245,(%ecx)
 8049587:	c7 41 04 72 3a 20 43 	movl   $0x43203a72,0x4(%ecx)
 804958e:	c7 41 08 6c 69 65 6e 	movl   $0x6e65696c,0x8(%ecx)
 8049595:	c7 41 0c 74 20 75 6e 	movl   $0x6e752074,0xc(%ecx)
 804959c:	c7 41 10 61 62 6c 65 	movl   $0x656c6261,0x10(%ecx)
 80495a3:	c7 41 14 20 74 6f 20 	movl   $0x206f7420,0x14(%ecx)
 80495aa:	c7 41 18 63 72 65 61 	movl   $0x61657263,0x18(%ecx)
 80495b1:	c7 41 1c 74 65 20 73 	movl   $0x73206574,0x1c(%ecx)
 80495b8:	c7 41 20 6f 63 6b 65 	movl   $0x656b636f,0x20(%ecx)
 80495bf:	66 c7 41 24 74 00    	movw   $0x74,0x24(%ecx)
 80495c5:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 80495ca:	e9 e8 06 00 00       	jmp    8049cb7 <submitr+0x7ba>
 80495cf:	89 1c 24             	mov    %ebx,(%esp)
 80495d2:	e8 f9 f2 ff ff       	call   80488d0 <gethostbyname@plt>
 80495d7:	85 c0                	test   %eax,%eax
 80495d9:	75 70                	jne    804964b <submitr+0x14e>
 80495db:	8b 44 24 28          	mov    0x28(%esp),%eax
 80495df:	c7 00 45 72 72 6f    	movl   $0x6f727245,(%eax)
 80495e5:	c7 40 04 72 3a 20 44 	movl   $0x44203a72,0x4(%eax)
 80495ec:	c7 40 08 4e 53 20 69 	movl   $0x6920534e,0x8(%eax)
 80495f3:	c7 40 0c 73 20 75 6e 	movl   $0x6e752073,0xc(%eax)
 80495fa:	c7 40 10 61 62 6c 65 	movl   $0x656c6261,0x10(%eax)
 8049601:	c7 40 14 20 74 6f 20 	movl   $0x206f7420,0x14(%eax)
 8049608:	c7 40 18 72 65 73 6f 	movl   $0x6f736572,0x18(%eax)
 804960f:	c7 40 1c 6c 76 65 20 	movl   $0x2065766c,0x1c(%eax)
 8049616:	c7 40 20 73 65 72 76 	movl   $0x76726573,0x20(%eax)
 804961d:	c7 40 24 65 72 20 61 	movl   $0x61207265,0x24(%eax)
 8049624:	c7 40 28 64 64 72 65 	movl   $0x65726464,0x28(%eax)
 804962b:	66 c7 40 2c 73 73    	movw   $0x7373,0x2c(%eax)
 8049631:	c6 40 2e 00          	movb   $0x0,0x2e(%eax)
 8049635:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 8049639:	89 04 24             	mov    %eax,(%esp)
 804963c:	e8 bf f2 ff ff       	call   8048900 <close@plt>
 8049641:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 8049646:	e9 6c 06 00 00       	jmp    8049cb7 <submitr+0x7ba>
 804964b:	8d 9c 24 54 a0 00 00 	lea    0xa054(%esp),%ebx
 8049652:	c7 84 24 54 a0 00 00 	movl   $0x0,0xa054(%esp)
 8049659:	00 00 00 00
 804965d:	c7 84 24 58 a0 00 00 	movl   $0x0,0xa058(%esp)
 8049664:	00 00 00 00
 8049668:	c7 84 24 5c a0 00 00 	movl   $0x0,0xa05c(%esp)
 804966f:	00 00 00 00
 8049673:	c7 84 24 60 a0 00 00 	movl   $0x0,0xa060(%esp)
 804967a:	00 00 00 00
 804967e:	66 c7 84 24 54 a0 00 	movw   $0x2,0xa054(%esp)
 8049685:	00 02 00
 8049688:	c7 44 24 0c 0c 00 00 	movl   $0xc,0xc(%esp)
 804968f:	00
 8049690:	8b 50 0c             	mov    0xc(%eax),%edx
 8049693:	89 54 24 08          	mov    %edx,0x8(%esp)
 8049697:	8b 40 10             	mov    0x10(%eax),%eax
 804969a:	8b 00                	mov    (%eax),%eax
 804969c:	89 44 24 04          	mov    %eax,0x4(%esp)
 80496a0:	8d 84 24 58 a0 00 00 	lea    0xa058(%esp),%eax
 80496a7:	89 04 24             	mov    %eax,(%esp)
 80496aa:	e8 61 f1 ff ff       	call   8048810 <__memmove_chk@plt>
 80496af:	0f b7 84 24 94 a0 00 	movzwl 0xa094(%esp),%eax
 80496b6:	00
 80496b7:	66 c1 c8 08          	ror    $0x8,%ax
 80496bb:	66 89 84 24 56 a0 00 	mov    %ax,0xa056(%esp)
 80496c2:	00
 80496c3:	c7 44 24 08 10 00 00 	movl   $0x10,0x8(%esp)
 80496ca:	00
 80496cb:	89 5c 24 04          	mov    %ebx,0x4(%esp)
 80496cf:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 80496d3:	89 04 24             	mov    %eax,(%esp)
 80496d6:	e8 15 f2 ff ff       	call   80488f0 <connect@plt>
 80496db:	85 c0                	test   %eax,%eax
 80496dd:	79 62                	jns    8049741 <submitr+0x244>
 80496df:	8b 54 24 28          	mov    0x28(%esp),%edx
 80496e3:	c7 02 45 72 72 6f    	movl   $0x6f727245,(%edx)
 80496e9:	c7 42 04 72 3a 20 55 	movl   $0x55203a72,0x4(%edx)
 80496f0:	c7 42 08 6e 61 62 6c 	movl   $0x6c62616e,0x8(%edx)
 80496f7:	c7 42 0c 65 20 74 6f 	movl   $0x6f742065,0xc(%edx)
 80496fe:	c7 42 10 20 63 6f 6e 	movl   $0x6e6f6320,0x10(%edx)
 8049705:	c7 42 14 6e 65 63 74 	movl   $0x7463656e,0x14(%edx)
 804970c:	c7 42 18 20 74 6f 20 	movl   $0x206f7420,0x18(%edx)
 8049713:	c7 42 1c 74 68 65 20 	movl   $0x20656874,0x1c(%edx)
 804971a:	c7 42 20 73 65 72 76 	movl   $0x76726573,0x20(%edx)
 8049721:	66 c7 42 24 65 72    	movw   $0x7265,0x24(%edx)
 8049727:	c6 42 26 00          	movb   $0x0,0x26(%edx)
 804972b:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 804972f:	89 04 24             	mov    %eax,(%esp)
 8049732:	e8 c9 f1 ff ff       	call   8048900 <close@plt>
 8049737:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 804973c:	e9 76 05 00 00       	jmp    8049cb7 <submitr+0x7ba>
 8049741:	ba ff ff ff ff       	mov    $0xffffffff,%edx
 8049746:	89 ef                	mov    %ebp,%edi
 8049748:	b8 00 00 00 00       	mov    $0x0,%eax
 804974d:	89 d1                	mov    %edx,%ecx
 804974f:	f2 ae                	repnz scas %es:(%edi),%al
 8049751:	89 cb                	mov    %ecx,%ebx
 8049753:	f7 d3                	not    %ebx
 8049755:	8b 7c 24 30          	mov    0x30(%esp),%edi
 8049759:	89 d1                	mov    %edx,%ecx
 804975b:	f2 ae                	repnz scas %es:(%edi),%al
 804975d:	89 4c 24 3c          	mov    %ecx,0x3c(%esp)
 8049761:	8b 7c 24 34          	mov    0x34(%esp),%edi
 8049765:	89 d1                	mov    %edx,%ecx
 8049767:	f2 ae                	repnz scas %es:(%edi),%al
 8049769:	89 ce                	mov    %ecx,%esi
 804976b:	f7 d6                	not    %esi
 804976d:	8b 7c 24 38          	mov    0x38(%esp),%edi
 8049771:	89 d1                	mov    %edx,%ecx
 8049773:	f2 ae                	repnz scas %es:(%edi),%al
 8049775:	2b 74 24 3c          	sub    0x3c(%esp),%esi
 8049779:	29 ce                	sub    %ecx,%esi
 804977b:	8d 44 5b fd          	lea    -0x3(%ebx,%ebx,2),%eax
 804977f:	8d 44 06 7b          	lea    0x7b(%esi,%eax,1),%eax
 8049783:	3d 00 20 00 00       	cmp    $0x2000,%eax
 8049788:	76 7b                	jbe    8049805 <submitr+0x308>
 804978a:	8b 44 24 28          	mov    0x28(%esp),%eax
 804978e:	c7 00 45 72 72 6f    	movl   $0x6f727245,(%eax)
 8049794:	c7 40 04 72 3a 20 52 	movl   $0x52203a72,0x4(%eax)
 804979b:	c7 40 08 65 73 75 6c 	movl   $0x6c757365,0x8(%eax)
 80497a2:	c7 40 0c 74 20 73 74 	movl   $0x74732074,0xc(%eax)
 80497a9:	c7 40 10 72 69 6e 67 	movl   $0x676e6972,0x10(%eax)
 80497b0:	c7 40 14 20 74 6f 6f 	movl   $0x6f6f7420,0x14(%eax)
 80497b7:	c7 40 18 20 6c 61 72 	movl   $0x72616c20,0x18(%eax)
 80497be:	c7 40 1c 67 65 2e 20 	movl   $0x202e6567,0x1c(%eax)
 80497c5:	c7 40 20 49 6e 63 72 	movl   $0x72636e49,0x20(%eax)
 80497cc:	c7 40 24 65 61 73 65 	movl   $0x65736165,0x24(%eax)
 80497d3:	c7 40 28 20 53 55 42 	movl   $0x42555320,0x28(%eax)
 80497da:	c7 40 2c 4d 49 54 52 	movl   $0x5254494d,0x2c(%eax)
 80497e1:	c7 40 30 5f 4d 41 58 	movl   $0x58414d5f,0x30(%eax)
 80497e8:	c7 40 34 42 55 46 00 	movl   $0x465542,0x34(%eax)
 80497ef:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 80497f3:	89 04 24             	mov    %eax,(%esp)
 80497f6:	e8 05 f1 ff ff       	call   8048900 <close@plt>
 80497fb:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 8049800:	e9 b2 04 00 00       	jmp    8049cb7 <submitr+0x7ba>
 8049805:	8d 94 24 54 40 00 00 	lea    0x4054(%esp),%edx
 804980c:	b9 00 08 00 00       	mov    $0x800,%ecx
 8049811:	b8 00 00 00 00       	mov    $0x0,%eax
 8049816:	89 d7                	mov    %edx,%edi
 8049818:	f3 ab                	rep stos %eax,%es:(%edi)
 804981a:	89 ef                	mov    %ebp,%edi
 804981c:	b9 ff ff ff ff       	mov    $0xffffffff,%ecx
 8049821:	f2 ae                	repnz scas %es:(%edi),%al
 8049823:	f7 d1                	not    %ecx
 8049825:	89 ce                	mov    %ecx,%esi
 8049827:	83 ee 01             	sub    $0x1,%esi
 804982a:	0f 84 99 04 00 00    	je     8049cc9 <submitr+0x7cc>
 8049830:	89 d3                	mov    %edx,%ebx
 8049832:	0f b6 45 00          	movzbl 0x0(%ebp),%eax
 8049836:	3c 2a                	cmp    $0x2a,%al
 8049838:	74 24                	je     804985e <submitr+0x361>
 804983a:	3c 2d                	cmp    $0x2d,%al
 804983c:	74 20                	je     804985e <submitr+0x361>
 804983e:	3c 2e                	cmp    $0x2e,%al
 8049840:	74 1c                	je     804985e <submitr+0x361>
 8049842:	3c 5f                	cmp    $0x5f,%al
 8049844:	74 18                	je     804985e <submitr+0x361>
 8049846:	8d 50 d0             	lea    -0x30(%eax),%edx
 8049849:	80 fa 09             	cmp    $0x9,%dl
 804984c:	76 10                	jbe    804985e <submitr+0x361>
 804984e:	8d 50 bf             	lea    -0x41(%eax),%edx
 8049851:	80 fa 19             	cmp    $0x19,%dl
 8049854:	76 08                	jbe    804985e <submitr+0x361>
 8049856:	8d 50 9f             	lea    -0x61(%eax),%edx
 8049859:	80 fa 19             	cmp    $0x19,%dl
 804985c:	77 07                	ja     8049865 <submitr+0x368>
 804985e:	88 03                	mov    %al,(%ebx)
 8049860:	83 c3 01             	add    $0x1,%ebx
 8049863:	eb 69                	jmp    80498ce <submitr+0x3d1>
 8049865:	3c 20                	cmp    $0x20,%al
 8049867:	75 08                	jne    8049871 <submitr+0x374>
 8049869:	c6 03 2b             	movb   $0x2b,(%ebx)
 804986c:	83 c3 01             	add    $0x1,%ebx
 804986f:	eb 5d                	jmp    80498ce <submitr+0x3d1>
 8049871:	8d 50 e0             	lea    -0x20(%eax),%edx
 8049874:	80 fa 5f             	cmp    $0x5f,%dl
 8049877:	76 04                	jbe    804987d <submitr+0x380>
 8049879:	3c 09                	cmp    $0x9,%al
 804987b:	75 62                	jne    80498df <submitr+0x3e2>
 804987d:	0f b6 c0             	movzbl %al,%eax
 8049880:	89 44 24 10          	mov    %eax,0x10(%esp)
 8049884:	c7 44 24 0c bc a5 04 	movl   $0x804a5bc,0xc(%esp)
 804988b:	08
 804988c:	c7 44 24 08 08 00 00 	movl   $0x8,0x8(%esp)
 8049893:	00
 8049894:	c7 44 24 04 01 00 00 	movl   $0x1,0x4(%esp)
 804989b:	00
 804989c:	8d 94 24 64 a0 00 00 	lea    0xa064(%esp),%edx
 80498a3:	89 14 24             	mov    %edx,(%esp)
 80498a6:	e8 75 f0 ff ff       	call   8048920 <__sprintf_chk@plt>
 80498ab:	0f b6 84 24 64 a0 00 	movzbl 0xa064(%esp),%eax
 80498b2:	00
 80498b3:	88 03                	mov    %al,(%ebx)
 80498b5:	0f b6 84 24 65 a0 00 	movzbl 0xa065(%esp),%eax
 80498bc:	00
 80498bd:	88 43 01             	mov    %al,0x1(%ebx)
 80498c0:	0f b6 84 24 66 a0 00 	movzbl 0xa066(%esp),%eax
 80498c7:	00
 80498c8:	88 43 02             	mov    %al,0x2(%ebx)
 80498cb:	83 c3 03             	add    $0x3,%ebx
 80498ce:	83 c5 01             	add    $0x1,%ebp
 80498d1:	83 ee 01             	sub    $0x1,%esi
 80498d4:	0f 85 58 ff ff ff    	jne    8049832 <submitr+0x335>
 80498da:	e9 ea 03 00 00       	jmp    8049cc9 <submitr+0x7cc>
 80498df:	8b 7c 24 28          	mov    0x28(%esp),%edi
 80498e3:	be d4 a4 04 08       	mov    $0x804a4d4,%esi
 80498e8:	b8 43 00 00 00       	mov    $0x43,%eax
 80498ed:	f7 c7 01 00 00 00    	test   $0x1,%edi
 80498f3:	74 1a                	je     804990f <submitr+0x412>
 80498f5:	0f b6 05 d4 a4 04 08 	movzbl 0x804a4d4,%eax
 80498fc:	88 07                	mov    %al,(%edi)
 80498fe:	8b 7c 24 28          	mov    0x28(%esp),%edi
 8049902:	83 c7 01             	add    $0x1,%edi
 8049905:	be d5 a4 04 08       	mov    $0x804a4d5,%esi
 804990a:	b8 42 00 00 00       	mov    $0x42,%eax
 804990f:	f7 c7 02 00 00 00    	test   $0x2,%edi
 8049915:	74 0f                	je     8049926 <submitr+0x429>
 8049917:	0f b7 16             	movzwl (%esi),%edx
 804991a:	66 89 17             	mov    %dx,(%edi)
 804991d:	83 c7 02             	add    $0x2,%edi
 8049920:	83 c6 02             	add    $0x2,%esi
 8049923:	83 e8 02             	sub    $0x2,%eax
 8049926:	89 c1                	mov    %eax,%ecx
 8049928:	c1 e9 02             	shr    $0x2,%ecx
 804992b:	f3 a5                	rep movsl %ds:(%esi),%es:(%edi)
 804992d:	ba 00 00 00 00       	mov    $0x0,%edx
 8049932:	a8 02                	test   $0x2,%al
 8049934:	74 0b                	je     8049941 <submitr+0x444>
 8049936:	0f b7 16             	movzwl (%esi),%edx
 8049939:	66 89 17             	mov    %dx,(%edi)
 804993c:	ba 02 00 00 00       	mov    $0x2,%edx
 8049941:	a8 01                	test   $0x1,%al
 8049943:	74 07                	je     804994c <submitr+0x44f>
 8049945:	0f b6 04 16          	movzbl (%esi,%edx,1),%eax
 8049949:	88 04 17             	mov    %al,(%edi,%edx,1)
 804994c:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 8049950:	89 04 24             	mov    %eax,(%esp)
 8049953:	e8 a8 ef ff ff       	call   8048900 <close@plt>
 8049958:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 804995d:	e9 55 03 00 00       	jmp    8049cb7 <submitr+0x7ba>
 8049962:	89 fd                	mov    %edi,%ebp
 8049964:	8b 7c 24 2c          	mov    0x2c(%esp),%edi
 8049968:	89 5c 24 08          	mov    %ebx,0x8(%esp)
 804996c:	89 74 24 04          	mov    %esi,0x4(%esp)
 8049970:	89 3c 24             	mov    %edi,(%esp)
 8049973:	e8 e8 ee ff ff       	call   8048860 <write@plt>
 8049978:	85 c0                	test   %eax,%eax
 804997a:	7f 0f                	jg     804998b <submitr+0x48e>
 804997c:	e8 0f ef ff ff       	call   8048890 <__errno_location@plt>
 8049981:	83 38 04             	cmpl   $0x4,(%eax)
 8049984:	75 0f                	jne    8049995 <submitr+0x498>
 8049986:	b8 00 00 00 00       	mov    $0x0,%eax
 804998b:	01 c6                	add    %eax,%esi
 804998d:	29 c3                	sub    %eax,%ebx
 804998f:	75 d7                	jne    8049968 <submitr+0x46b>
 8049991:	85 ed                	test   %ebp,%ebp
 8049993:	79 66                	jns    80499fb <submitr+0x4fe>
 8049995:	8b 54 24 28          	mov    0x28(%esp),%edx
 8049999:	c7 02 45 72 72 6f    	movl   $0x6f727245,(%edx)
 804999f:	c7 42 04 72 3a 20 43 	movl   $0x43203a72,0x4(%edx)
 80499a6:	c7 42 08 6c 69 65 6e 	movl   $0x6e65696c,0x8(%edx)
 80499ad:	c7 42 0c 74 20 75 6e 	movl   $0x6e752074,0xc(%edx)
 80499b4:	c7 42 10 61 62 6c 65 	movl   $0x656c6261,0x10(%edx)
 80499bb:	c7 42 14 20 74 6f 20 	movl   $0x206f7420,0x14(%edx)
 80499c2:	c7 42 18 77 72 69 74 	movl   $0x74697277,0x18(%edx)
 80499c9:	c7 42 1c 65 20 74 6f 	movl   $0x6f742065,0x1c(%edx)
 80499d0:	c7 42 20 20 74 68 65 	movl   $0x65687420,0x20(%edx)
 80499d7:	c7 42 24 20 73 65 72 	movl   $0x72657320,0x24(%edx)
 80499de:	c7 42 28 76 65 72 00 	movl   $0x726576,0x28(%edx)
 80499e5:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 80499e9:	89 04 24             	mov    %eax,(%esp)
 80499ec:	e8 0f ef ff ff       	call   8048900 <close@plt>
 80499f1:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 80499f6:	e9 bc 02 00 00       	jmp    8049cb7 <submitr+0x7ba>
 80499fb:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 80499ff:	89 44 24 48          	mov    %eax,0x48(%esp)
 8049a03:	c7 44 24 4c 00 00 00 	movl   $0x0,0x4c(%esp)
 8049a0a:	00
 8049a0b:	8d 44 24 54          	lea    0x54(%esp),%eax
 8049a0f:	89 44 24 50          	mov    %eax,0x50(%esp)
 8049a13:	b9 00 20 00 00       	mov    $0x2000,%ecx
 8049a18:	8d 94 24 54 20 00 00 	lea    0x2054(%esp),%edx
 8049a1f:	8d 44 24 48          	lea    0x48(%esp),%eax
 8049a23:	e8 88 f9 ff ff       	call   80493b0 <rio_readlineb>
 8049a28:	85 c0                	test   %eax,%eax
 8049a2a:	7f 7a                	jg     8049aa6 <submitr+0x5a9>
 8049a2c:	8b 54 24 28          	mov    0x28(%esp),%edx
 8049a30:	c7 02 45 72 72 6f    	movl   $0x6f727245,(%edx)
 8049a36:	c7 42 04 72 3a 20 43 	movl   $0x43203a72,0x4(%edx)
 8049a3d:	c7 42 08 6c 69 65 6e 	movl   $0x6e65696c,0x8(%edx)
 8049a44:	c7 42 0c 74 20 75 6e 	movl   $0x6e752074,0xc(%edx)
 8049a4b:	c7 42 10 61 62 6c 65 	movl   $0x656c6261,0x10(%edx)
 8049a52:	c7 42 14 20 74 6f 20 	movl   $0x206f7420,0x14(%edx)
 8049a59:	c7 42 18 72 65 61 64 	movl   $0x64616572,0x18(%edx)
 8049a60:	c7 42 1c 20 66 69 72 	movl   $0x72696620,0x1c(%edx)
 8049a67:	c7 42 20 73 74 20 68 	movl   $0x68207473,0x20(%edx)
 8049a6e:	c7 42 24 65 61 64 65 	movl   $0x65646165,0x24(%edx)
 8049a75:	c7 42 28 72 20 66 72 	movl   $0x72662072,0x28(%edx)
 8049a7c:	c7 42 2c 6f 6d 20 73 	movl   $0x73206d6f,0x2c(%edx)
 8049a83:	c7 42 30 65 72 76 65 	movl   $0x65767265,0x30(%edx)
 8049a8a:	66 c7 42 34 72 00    	movw   $0x72,0x34(%edx)
 8049a90:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 8049a94:	89 04 24             	mov    %eax,(%esp)
 8049a97:	e8 64 ee ff ff       	call   8048900 <close@plt>
 8049a9c:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 8049aa1:	e9 11 02 00 00       	jmp    8049cb7 <submitr+0x7ba>
 8049aa6:	8d 84 24 54 80 00 00 	lea    0x8054(%esp),%eax
 8049aad:	89 44 24 10          	mov    %eax,0x10(%esp)
 8049ab1:	8d 44 24 44          	lea    0x44(%esp),%eax
 8049ab5:	89 44 24 0c          	mov    %eax,0xc(%esp)
 8049ab9:	8d 84 24 54 60 00 00 	lea    0x6054(%esp),%eax
 8049ac0:	89 44 24 08          	mov    %eax,0x8(%esp)
 8049ac4:	c7 44 24 04 c3 a5 04 	movl   $0x804a5c3,0x4(%esp)
 8049acb:	08
 8049acc:	8d 84 24 54 20 00 00 	lea    0x2054(%esp),%eax
 8049ad3:	89 04 24             	mov    %eax,(%esp)
 8049ad6:	e8 95 ed ff ff       	call   8048870 <__isoc99_sscanf@plt>
 8049adb:	8b 44 24 44          	mov    0x44(%esp),%eax
 8049adf:	3d c8 00 00 00       	cmp    $0xc8,%eax
 8049ae4:	0f 84 d3 00 00 00    	je     8049bbd <submitr+0x6c0>
 8049aea:	8d 94 24 54 80 00 00 	lea    0x8054(%esp),%edx
 8049af1:	89 54 24 14          	mov    %edx,0x14(%esp)
 8049af5:	89 44 24 10          	mov    %eax,0x10(%esp)
 8049af9:	c7 44 24 0c 18 a5 04 	movl   $0x804a518,0xc(%esp)
 8049b00:	08
 8049b01:	c7 44 24 08 ff ff ff 	movl   $0xffffffff,0x8(%esp)
 8049b08:	ff
 8049b09:	c7 44 24 04 01 00 00 	movl   $0x1,0x4(%esp)
 8049b10:	00
 8049b11:	8b 54 24 28          	mov    0x28(%esp),%edx
 8049b15:	89 14 24             	mov    %edx,(%esp)
 8049b18:	e8 03 ee ff ff       	call   8048920 <__sprintf_chk@plt>
 8049b1d:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 8049b21:	89 04 24             	mov    %eax,(%esp)
 8049b24:	e8 d7 ed ff ff       	call   8048900 <close@plt>
 8049b29:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 8049b2e:	e9 84 01 00 00       	jmp    8049cb7 <submitr+0x7ba>
 8049b33:	b9 00 20 00 00       	mov    $0x2000,%ecx
 8049b38:	8d 94 24 54 20 00 00 	lea    0x2054(%esp),%edx
 8049b3f:	8d 44 24 48          	lea    0x48(%esp),%eax
 8049b43:	e8 68 f8 ff ff       	call   80493b0 <rio_readlineb>
 8049b48:	85 c0                	test   %eax,%eax
 8049b4a:	7f 71                	jg     8049bbd <submitr+0x6c0>
 8049b4c:	8b 54 24 28          	mov    0x28(%esp),%edx
 8049b50:	c7 02 45 72 72 6f    	movl   $0x6f727245,(%edx)
 8049b56:	c7 42 04 72 3a 20 43 	movl   $0x43203a72,0x4(%edx)
 8049b5d:	c7 42 08 6c 69 65 6e 	movl   $0x6e65696c,0x8(%edx)
 8049b64:	c7 42 0c 74 20 75 6e 	movl   $0x6e752074,0xc(%edx)
 8049b6b:	c7 42 10 61 62 6c 65 	movl   $0x656c6261,0x10(%edx)
 8049b72:	c7 42 14 20 74 6f 20 	movl   $0x206f7420,0x14(%edx)
 8049b79:	c7 42 18 72 65 61 64 	movl   $0x64616572,0x18(%edx)
 8049b80:	c7 42 1c 20 68 65 61 	movl   $0x61656820,0x1c(%edx)
 8049b87:	c7 42 20 64 65 72 73 	movl   $0x73726564,0x20(%edx)
 8049b8e:	c7 42 24 20 66 72 6f 	movl   $0x6f726620,0x24(%edx)
 8049b95:	c7 42 28 6d 20 73 65 	movl   $0x6573206d,0x28(%edx)
 8049b9c:	c7 42 2c 72 76 65 72 	movl   $0x72657672,0x2c(%edx)
 8049ba3:	c6 42 30 00          	movb   $0x0,0x30(%edx)
 8049ba7:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 8049bab:	89 04 24             	mov    %eax,(%esp)
 8049bae:	e8 4d ed ff ff       	call   8048900 <close@plt>
 8049bb3:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 8049bb8:	e9 fa 00 00 00       	jmp    8049cb7 <submitr+0x7ba>
 8049bbd:	80 bc 24 54 20 00 00 	cmpb   $0xd,0x2054(%esp)
 8049bc4:	0d
 8049bc5:	0f 85 68 ff ff ff    	jne    8049b33 <submitr+0x636>
 8049bcb:	80 bc 24 55 20 00 00 	cmpb   $0xa,0x2055(%esp)
 8049bd2:	0a
 8049bd3:	0f 85 5a ff ff ff    	jne    8049b33 <submitr+0x636>
 8049bd9:	80 bc 24 56 20 00 00 	cmpb   $0x0,0x2056(%esp)
 8049be0:	00
 8049be1:	0f 85 4c ff ff ff    	jne    8049b33 <submitr+0x636>
 8049be7:	b9 00 20 00 00       	mov    $0x2000,%ecx
 8049bec:	8d 94 24 54 20 00 00 	lea    0x2054(%esp),%edx
 8049bf3:	8d 44 24 48          	lea    0x48(%esp),%eax
 8049bf7:	e8 b4 f7 ff ff       	call   80493b0 <rio_readlineb>
 8049bfc:	85 c0                	test   %eax,%eax
 8049bfe:	7f 78                	jg     8049c78 <submitr+0x77b>
 8049c00:	8b 54 24 28          	mov    0x28(%esp),%edx
 8049c04:	c7 02 45 72 72 6f    	movl   $0x6f727245,(%edx)
 8049c0a:	c7 42 04 72 3a 20 43 	movl   $0x43203a72,0x4(%edx)
 8049c11:	c7 42 08 6c 69 65 6e 	movl   $0x6e65696c,0x8(%edx)
 8049c18:	c7 42 0c 74 20 75 6e 	movl   $0x6e752074,0xc(%edx)
 8049c1f:	c7 42 10 61 62 6c 65 	movl   $0x656c6261,0x10(%edx)
 8049c26:	c7 42 14 20 74 6f 20 	movl   $0x206f7420,0x14(%edx)
 8049c2d:	c7 42 18 72 65 61 64 	movl   $0x64616572,0x18(%edx)
 8049c34:	c7 42 1c 20 73 74 61 	movl   $0x61747320,0x1c(%edx)
 8049c3b:	c7 42 20 74 75 73 20 	movl   $0x20737574,0x20(%edx)
 8049c42:	c7 42 24 6d 65 73 73 	movl   $0x7373656d,0x24(%edx)
 8049c49:	c7 42 28 61 67 65 20 	movl   $0x20656761,0x28(%edx)
 8049c50:	c7 42 2c 66 72 6f 6d 	movl   $0x6d6f7266,0x2c(%edx)
 8049c57:	c7 42 30 20 73 65 72 	movl   $0x72657320,0x30(%edx)
 8049c5e:	c7 42 34 76 65 72 00 	movl   $0x726576,0x34(%edx)
 8049c65:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 8049c69:	89 04 24             	mov    %eax,(%esp)
 8049c6c:	e8 8f ec ff ff       	call   8048900 <close@plt>
 8049c71:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 8049c76:	eb 3f                	jmp    8049cb7 <submitr+0x7ba>
 8049c78:	8d 84 24 54 20 00 00 	lea    0x2054(%esp),%eax
 8049c7f:	89 44 24 04          	mov    %eax,0x4(%esp)
 8049c83:	8b 54 24 28          	mov    0x28(%esp),%edx
 8049c87:	89 14 24             	mov    %edx,(%esp)
 8049c8a:	e8 51 eb ff ff       	call   80487e0 <strcpy@plt>
 8049c8f:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 8049c93:	89 04 24             	mov    %eax,(%esp)
 8049c96:	e8 65 ec ff ff       	call   8048900 <close@plt>
 8049c9b:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 8049ca0:	8b 54 24 28          	mov    0x28(%esp),%edx
 8049ca4:	80 3a 4f             	cmpb   $0x4f,(%edx)
 8049ca7:	75 0e                	jne    8049cb7 <submitr+0x7ba>
 8049ca9:	80 7a 01 4b          	cmpb   $0x4b,0x1(%edx)
 8049cad:	75 08                	jne    8049cb7 <submitr+0x7ba>
 8049caf:	80 7a 02 01          	cmpb   $0x1,0x2(%edx)
 8049cb3:	19 c0                	sbb    %eax,%eax
 8049cb5:	f7 d0                	not    %eax
 8049cb7:	8b 8c 24 6c a0 00 00 	mov    0xa06c(%esp),%ecx
 8049cbe:	65 33 0d 14 00 00 00 	xor    %gs:0x14,%ecx
 8049cc5:	74 78                	je     8049d3f <submitr+0x842>
 8049cc7:	eb 71                	jmp    8049d3a <submitr+0x83d>
 8049cc9:	8d 84 24 54 40 00 00 	lea    0x4054(%esp),%eax
 8049cd0:	89 44 24 1c          	mov    %eax,0x1c(%esp)
 8049cd4:	8b 44 24 38          	mov    0x38(%esp),%eax
 8049cd8:	89 44 24 18          	mov    %eax,0x18(%esp)
 8049cdc:	8b 54 24 34          	mov    0x34(%esp),%edx
 8049ce0:	89 54 24 14          	mov    %edx,0x14(%esp)
 8049ce4:	8b 4c 24 30          	mov    0x30(%esp),%ecx
 8049ce8:	89 4c 24 10          	mov    %ecx,0x10(%esp)
 8049cec:	c7 44 24 0c 48 a5 04 	movl   $0x804a548,0xc(%esp)
 8049cf3:	08
 8049cf4:	c7 44 24 08 00 20 00 	movl   $0x2000,0x8(%esp)
 8049cfb:	00
 8049cfc:	c7 44 24 04 01 00 00 	movl   $0x1,0x4(%esp)
 8049d03:	00
 8049d04:	8d bc 24 54 20 00 00 	lea    0x2054(%esp),%edi
 8049d0b:	89 3c 24             	mov    %edi,(%esp)
 8049d0e:	e8 0d ec ff ff       	call   8048920 <__sprintf_chk@plt>
 8049d13:	b8 00 00 00 00       	mov    $0x0,%eax
 8049d18:	b9 ff ff ff ff       	mov    $0xffffffff,%ecx
 8049d1d:	f2 ae                	repnz scas %es:(%edi),%al
 8049d1f:	f7 d1                	not    %ecx
 8049d21:	8d 79 ff             	lea    -0x1(%ecx),%edi
 8049d24:	89 fb                	mov    %edi,%ebx
 8049d26:	8d b4 24 54 20 00 00 	lea    0x2054(%esp),%esi
 8049d2d:	85 ff                	test   %edi,%edi
 8049d2f:	0f 85 2d fc ff ff    	jne    8049962 <submitr+0x465>
 8049d35:	e9 c1 fc ff ff       	jmp    80499fb <submitr+0x4fe>
 8049d3a:	e8 91 ea ff ff       	call   80487d0 <__stack_chk_fail@plt>
 8049d3f:	81 c4 7c a0 00 00    	add    $0xa07c,%esp
 8049d45:	5b                   	pop    %ebx
 8049d46:	5e                   	pop    %esi
 8049d47:	5f                   	pop    %edi
 8049d48:	5d                   	pop    %ebp
 8049d49:	c3                   	ret

08049d4a <init_timeout>:
 8049d4a:	53                   	push   %ebx
 8049d4b:	83 ec 18             	sub    $0x18,%esp
 8049d4e:	8b 5c 24 20          	mov    0x20(%esp),%ebx
 8049d52:	85 db                	test   %ebx,%ebx
 8049d54:	74 26                	je     8049d7c <init_timeout+0x32>
 8049d56:	c7 44 24 04 c9 94 04 	movl   $0x80494c9,0x4(%esp)
 8049d5d:	08
 8049d5e:	c7 04 24 0e 00 00 00 	movl   $0xe,(%esp)
 8049d65:	e8 36 ea ff ff       	call   80487a0 <signal@plt>
 8049d6a:	85 db                	test   %ebx,%ebx
 8049d6c:	b8 00 00 00 00       	mov    $0x0,%eax
 8049d71:	0f 48 d8             	cmovs  %eax,%ebx
 8049d74:	89 1c 24             	mov    %ebx,(%esp)
 8049d77:	e8 44 ea ff ff       	call   80487c0 <alarm@plt>
 8049d7c:	83 c4 18             	add    $0x18,%esp
 8049d7f:	5b                   	pop    %ebx
 8049d80:	c3                   	ret

08049d81 <init_driver>:
 8049d81:	57                   	push   %edi
 8049d82:	56                   	push   %esi
 8049d83:	53                   	push   %ebx
 8049d84:	83 ec 40             	sub    $0x40,%esp
 8049d87:	8b 74 24 50          	mov    0x50(%esp),%esi
 8049d8b:	65 a1 14 00 00 00    	mov    %gs:0x14,%eax
 8049d91:	89 44 24 3c          	mov    %eax,0x3c(%esp)
 8049d95:	31 c0                	xor    %eax,%eax
 8049d97:	c7 44 24 04 01 00 00 	movl   $0x1,0x4(%esp)
 8049d9e:	00
 8049d9f:	c7 04 24 0d 00 00 00 	movl   $0xd,(%esp)
 8049da6:	e8 f5 e9 ff ff       	call   80487a0 <signal@plt>
 8049dab:	c7 44 24 04 01 00 00 	movl   $0x1,0x4(%esp)
 8049db2:	00
 8049db3:	c7 04 24 1d 00 00 00 	movl   $0x1d,(%esp)
 8049dba:	e8 e1 e9 ff ff       	call   80487a0 <signal@plt>
 8049dbf:	c7 44 24 04 01 00 00 	movl   $0x1,0x4(%esp)
 8049dc6:	00
 8049dc7:	c7 04 24 1d 00 00 00 	movl   $0x1d,(%esp)
 8049dce:	e8 cd e9 ff ff       	call   80487a0 <signal@plt>
 8049dd3:	c7 44 24 08 00 00 00 	movl   $0x0,0x8(%esp)
 8049dda:	00
 8049ddb:	c7 44 24 04 01 00 00 	movl   $0x1,0x4(%esp)
 8049de2:	00
 8049de3:	c7 04 24 02 00 00 00 	movl   $0x2,(%esp)
 8049dea:	e8 c1 ea ff ff       	call   80488b0 <socket@plt>
 8049def:	89 c3                	mov    %eax,%ebx
 8049df1:	85 c0                	test   %eax,%eax
 8049df3:	79 4e                	jns    8049e43 <init_driver+0xc2>
 8049df5:	c7 06 45 72 72 6f    	movl   $0x6f727245,(%esi)
 8049dfb:	c7 46 04 72 3a 20 43 	movl   $0x43203a72,0x4(%esi)
 8049e02:	c7 46 08 6c 69 65 6e 	movl   $0x6e65696c,0x8(%esi)
 8049e09:	c7 46 0c 74 20 75 6e 	movl   $0x6e752074,0xc(%esi)
 8049e10:	c7 46 10 61 62 6c 65 	movl   $0x656c6261,0x10(%esi)
 8049e17:	c7 46 14 20 74 6f 20 	movl   $0x206f7420,0x14(%esi)
 8049e1e:	c7 46 18 63 72 65 61 	movl   $0x61657263,0x18(%esi)
 8049e25:	c7 46 1c 74 65 20 73 	movl   $0x73206574,0x1c(%esi)
 8049e2c:	c7 46 20 6f 63 6b 65 	movl   $0x656b636f,0x20(%esi)
 8049e33:	66 c7 46 24 74 00    	movw   $0x74,0x24(%esi)
 8049e39:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 8049e3e:	e9 33 01 00 00       	jmp    8049f76 <init_driver+0x1f5>
 8049e43:	c7 04 24 d4 a5 04 08 	movl   $0x804a5d4,(%esp)
 8049e4a:	e8 81 ea ff ff       	call   80488d0 <gethostbyname@plt>
 8049e4f:	85 c0                	test   %eax,%eax
 8049e51:	75 68                	jne    8049ebb <init_driver+0x13a>
 8049e53:	c7 06 45 72 72 6f    	movl   $0x6f727245,(%esi)
 8049e59:	c7 46 04 72 3a 20 44 	movl   $0x44203a72,0x4(%esi)
 8049e60:	c7 46 08 4e 53 20 69 	movl   $0x6920534e,0x8(%esi)
 8049e67:	c7 46 0c 73 20 75 6e 	movl   $0x6e752073,0xc(%esi)
 8049e6e:	c7 46 10 61 62 6c 65 	movl   $0x656c6261,0x10(%esi)
 8049e75:	c7 46 14 20 74 6f 20 	movl   $0x206f7420,0x14(%esi)
 8049e7c:	c7 46 18 72 65 73 6f 	movl   $0x6f736572,0x18(%esi)
 8049e83:	c7 46 1c 6c 76 65 20 	movl   $0x2065766c,0x1c(%esi)
 8049e8a:	c7 46 20 73 65 72 76 	movl   $0x76726573,0x20(%esi)
 8049e91:	c7 46 24 65 72 20 61 	movl   $0x61207265,0x24(%esi)
 8049e98:	c7 46 28 64 64 72 65 	movl   $0x65726464,0x28(%esi)
 8049e9f:	66 c7 46 2c 73 73    	movw   $0x7373,0x2c(%esi)
 8049ea5:	c6 46 2e 00          	movb   $0x0,0x2e(%esi)
 8049ea9:	89 1c 24             	mov    %ebx,(%esp)
 8049eac:	e8 4f ea ff ff       	call   8048900 <close@plt>
 8049eb1:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 8049eb6:	e9 bb 00 00 00       	jmp    8049f76 <init_driver+0x1f5>
 8049ebb:	8d 7c 24 2c          	lea    0x2c(%esp),%edi
 8049ebf:	c7 44 24 2c 00 00 00 	movl   $0x0,0x2c(%esp)
 8049ec6:	00
 8049ec7:	c7 44 24 30 00 00 00 	movl   $0x0,0x30(%esp)
 8049ece:	00
 8049ecf:	c7 44 24 34 00 00 00 	movl   $0x0,0x34(%esp)
 8049ed6:	00
 8049ed7:	c7 44 24 38 00 00 00 	movl   $0x0,0x38(%esp)
 8049ede:	00
 8049edf:	66 c7 44 24 2c 02 00 	movw   $0x2,0x2c(%esp)
 8049ee6:	c7 44 24 0c 0c 00 00 	movl   $0xc,0xc(%esp)
 8049eed:	00
 8049eee:	8b 50 0c             	mov    0xc(%eax),%edx
 8049ef1:	89 54 24 08          	mov    %edx,0x8(%esp)
 8049ef5:	8b 40 10             	mov    0x10(%eax),%eax
 8049ef8:	8b 00                	mov    (%eax),%eax
 8049efa:	89 44 24 04          	mov    %eax,0x4(%esp)
 8049efe:	8d 44 24 30          	lea    0x30(%esp),%eax
 8049f02:	89 04 24             	mov    %eax,(%esp)
 8049f05:	e8 06 e9 ff ff       	call   8048810 <__memmove_chk@plt>
 8049f0a:	66 c7 44 24 2e 3b 6e 	movw   $0x6e3b,0x2e(%esp)
 8049f11:	c7 44 24 08 10 00 00 	movl   $0x10,0x8(%esp)
 8049f18:	00
 8049f19:	89 7c 24 04          	mov    %edi,0x4(%esp)
 8049f1d:	89 1c 24             	mov    %ebx,(%esp)
 8049f20:	e8 cb e9 ff ff       	call   80488f0 <connect@plt>
 8049f25:	85 c0                	test   %eax,%eax
 8049f27:	79 37                	jns    8049f60 <init_driver+0x1df>
 8049f29:	c7 44 24 10 d4 a5 04 	movl   $0x804a5d4,0x10(%esp)
 8049f30:	08
 8049f31:	c7 44 24 0c 94 a5 04 	movl   $0x804a594,0xc(%esp)
 8049f38:	08
 8049f39:	c7 44 24 08 ff ff ff 	movl   $0xffffffff,0x8(%esp)
 8049f40:	ff
 8049f41:	c7 44 24 04 01 00 00 	movl   $0x1,0x4(%esp)
 8049f48:	00
 8049f49:	89 34 24             	mov    %esi,(%esp)
 8049f4c:	e8 cf e9 ff ff       	call   8048920 <__sprintf_chk@plt>
 8049f51:	89 1c 24             	mov    %ebx,(%esp)
 8049f54:	e8 a7 e9 ff ff       	call   8048900 <close@plt>
 8049f59:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 8049f5e:	eb 16                	jmp    8049f76 <init_driver+0x1f5>
 8049f60:	89 1c 24             	mov    %ebx,(%esp)
 8049f63:	e8 98 e9 ff ff       	call   8048900 <close@plt>
 8049f68:	66 c7 06 4f 4b       	movw   $0x4b4f,(%esi)
 8049f6d:	c6 46 02 00          	movb   $0x0,0x2(%esi)
 8049f71:	b8 00 00 00 00       	mov    $0x0,%eax
 8049f76:	8b 54 24 3c          	mov    0x3c(%esp),%edx
 8049f7a:	65 33 15 14 00 00 00 	xor    %gs:0x14,%edx
 8049f81:	74 05                	je     8049f88 <init_driver+0x207>
 8049f83:	e8 48 e8 ff ff       	call   80487d0 <__stack_chk_fail@plt>
 8049f88:	83 c4 40             	add    $0x40,%esp
 8049f8b:	5b                   	pop    %ebx
 8049f8c:	5e                   	pop    %esi
 8049f8d:	5f                   	pop    %edi
 8049f8e:	c3                   	ret

08049f8f <driver_post>:
 8049f8f:	53                   	push   %ebx
 8049f90:	83 ec 28             	sub    $0x28,%esp
 8049f93:	8b 44 24 30          	mov    0x30(%esp),%eax
 8049f97:	8b 54 24 34          	mov    0x34(%esp),%edx
 8049f9b:	8b 5c 24 3c          	mov    0x3c(%esp),%ebx
 8049f9f:	83 7c 24 38 00       	cmpl   $0x0,0x38(%esp)
 8049fa4:	74 28                	je     8049fce <driver_post+0x3f>
 8049fa6:	89 54 24 08          	mov    %edx,0x8(%esp)
 8049faa:	c7 44 24 04 e7 a5 04 	movl   $0x804a5e7,0x4(%esp)
 8049fb1:	08
 8049fb2:	c7 04 24 01 00 00 00 	movl   $0x1,(%esp)
 8049fb9:	e8 e2 e8 ff ff       	call   80488a0 <__printf_chk@plt>
 8049fbe:	66 c7 03 4f 4b       	movw   $0x4b4f,(%ebx)
 8049fc3:	c6 43 02 00          	movb   $0x0,0x2(%ebx)
 8049fc7:	b8 00 00 00 00       	mov    $0x0,%eax
 8049fcc:	eb 49                	jmp    804a017 <driver_post+0x88>
 8049fce:	85 c0                	test   %eax,%eax
 8049fd0:	74 37                	je     804a009 <driver_post+0x7a>
 8049fd2:	80 38 00             	cmpb   $0x0,(%eax)
 8049fd5:	74 32                	je     804a009 <driver_post+0x7a>
 8049fd7:	89 5c 24 18          	mov    %ebx,0x18(%esp)
 8049fdb:	89 54 24 14          	mov    %edx,0x14(%esp)
 8049fdf:	c7 44 24 10 fe a5 04 	movl   $0x804a5fe,0x10(%esp)
 8049fe6:	08
 8049fe7:	89 44 24 0c          	mov    %eax,0xc(%esp)
 8049feb:	c7 44 24 08 02 a6 04 	movl   $0x804a602,0x8(%esp)
 8049ff2:	08
 8049ff3:	c7 44 24 04 6e 3b 00 	movl   $0x3b6e,0x4(%esp)
 8049ffa:	00
 8049ffb:	c7 04 24 d4 a5 04 08 	movl   $0x804a5d4,(%esp)
 804a002:	e8 f6 f4 ff ff       	call   80494fd <submitr>
 804a007:	eb 0e                	jmp    804a017 <driver_post+0x88>
 804a009:	66 c7 03 4f 4b       	movw   $0x4b4f,(%ebx)
 804a00e:	c6 43 02 00          	movb   $0x0,0x2(%ebx)
 804a012:	b8 00 00 00 00       	mov    $0x0,%eax
 804a017:	83 c4 28             	add    $0x28,%esp
 804a01a:	5b                   	pop    %ebx
 804a01b:	c3                   	ret
 804a01c:	90                   	nop
 804a01d:	90                   	nop
 804a01e:	90                   	nop
 804a01f:	90                   	nop

0804a020 <__libc_csu_init>:
 804a020:	55                   	push   %ebp
 804a021:	57                   	push   %edi
 804a022:	31 ff                	xor    %edi,%edi
 804a024:	56                   	push   %esi
 804a025:	53                   	push   %ebx
 804a026:	e8 35 e9 ff ff       	call   8048960 <__x86.get_pc_thunk.bx>
 804a02b:	81 c3 c9 1f 00 00    	add    $0x1fc9,%ebx
 804a031:	83 ec 1c             	sub    $0x1c,%esp
 804a034:	8b 6c 24 30          	mov    0x30(%esp),%ebp
 804a038:	8d b3 20 ff ff ff    	lea    -0xe0(%ebx),%esi
 804a03e:	e8 e1 e6 ff ff       	call   8048724 <_init>
 804a043:	8d 83 20 ff ff ff    	lea    -0xe0(%ebx),%eax
 804a049:	29 c6                	sub    %eax,%esi
 804a04b:	c1 fe 02             	sar    $0x2,%esi
 804a04e:	85 f6                	test   %esi,%esi
 804a050:	74 27                	je     804a079 <__libc_csu_init+0x59>
 804a052:	8d b6 00 00 00 00    	lea    0x0(%esi),%esi
 804a058:	8b 44 24 38          	mov    0x38(%esp),%eax
 804a05c:	89 2c 24             	mov    %ebp,(%esp)
 804a05f:	89 44 24 08          	mov    %eax,0x8(%esp)
 804a063:	8b 44 24 34          	mov    0x34(%esp),%eax
 804a067:	89 44 24 04          	mov    %eax,0x4(%esp)
 804a06b:	ff 94 bb 20 ff ff ff 	call   *-0xe0(%ebx,%edi,4)
 804a072:	83 c7 01             	add    $0x1,%edi
 804a075:	39 f7                	cmp    %esi,%edi
 804a077:	75 df                	jne    804a058 <__libc_csu_init+0x38>
 804a079:	83 c4 1c             	add    $0x1c,%esp
 804a07c:	5b                   	pop    %ebx
 804a07d:	5e                   	pop    %esi
 804a07e:	5f                   	pop    %edi
 804a07f:	5d                   	pop    %ebp
 804a080:	c3                   	ret
 804a081:	eb 0d                	jmp    804a090 <__libc_csu_fini>
 804a083:	90                   	nop
 804a084:	90                   	nop
 804a085:	90                   	nop
 804a086:	90                   	nop
 804a087:	90                   	nop
 804a088:	90                   	nop
 804a089:	90                   	nop
 804a08a:	90                   	nop
 804a08b:	90                   	nop
 804a08c:	90                   	nop
 804a08d:	90                   	nop
 804a08e:	90                   	nop
 804a08f:	90                   	nop

0804a090 <__libc_csu_fini>:
 804a090:	f3 c3                	repz ret
 804a092:	90                   	nop
 804a093:	90                   	nop
 804a094:	90                   	nop
 804a095:	90                   	nop
 804a096:	90                   	nop
 804a097:	90                   	nop
 804a098:	90                   	nop
 804a099:	90                   	nop
 804a09a:	90                   	nop
 804a09b:	90                   	nop
 804a09c:	90                   	nop
 804a09d:	90                   	nop
 804a09e:	90                   	nop
 804a09f:	90                   	nop

0804a0a0 <__do_global_ctors_aux>:
 804a0a0:	55                   	push   %ebp
 804a0a1:	89 e5                	mov    %esp,%ebp
 804a0a3:	53                   	push   %ebx
 804a0a4:	83 ec 04             	sub    $0x4,%esp
 804a0a7:	a1 14 bf 04 08       	mov    0x804bf14,%eax
 804a0ac:	83 f8 ff             	cmp    $0xffffffff,%eax
 804a0af:	74 13                	je     804a0c4 <__do_global_ctors_aux+0x24>
 804a0b1:	bb 14 bf 04 08       	mov    $0x804bf14,%ebx
 804a0b6:	66 90                	xchg   %ax,%ax
 804a0b8:	83 eb 04             	sub    $0x4,%ebx
 804a0bb:	ff d0                	call   *%eax
 804a0bd:	8b 03                	mov    (%ebx),%eax
 804a0bf:	83 f8 ff             	cmp    $0xffffffff,%eax
 804a0c2:	75 f4                	jne    804a0b8 <__do_global_ctors_aux+0x18>
 804a0c4:	83 c4 04             	add    $0x4,%esp
 804a0c7:	5b                   	pop    %ebx
 804a0c8:	5d                   	pop    %ebp
 804a0c9:	c3                   	ret

Disassembly of section .fini:

0804a0cc <_fini>:
 804a0cc:	53                   	push   %ebx
 804a0cd:	83 ec 08             	sub    $0x8,%esp
 804a0d0:	e8 8b e8 ff ff       	call   8048960 <__x86.get_pc_thunk.bx>
 804a0d5:	81 c3 1f 1f 00 00    	add    $0x1f1f,%ebx
 804a0db:	e8 90 e8 ff ff       	call   8048970 <__do_global_dtors_aux>
 804a0e0:	83 c4 08             	add    $0x8,%esp
 804a0e3:	5b                   	pop    %ebx
 804a0e4:	c3                   	ret

下面我附上自己的实验报告

实验报告

Bomb lab实验

湖南大学信息科学与工程学院

计科21XX wolf (学号20210801XXXX)

目录

前言

<Phase_1>字符串比较

<Phase_2>循环

<Phase_3>分支语句与跳转表

<Phase_4>递归调用

<func_4>递归函数体分析

<phase_5>字符串末尾累加

<phase_6>链表

<secret_phase>二叉检索树(BinarySearchTree)

<phase_defused>寻找隐藏关入口

<secret_phase>隐藏关

<fun7>检索目标元素

深度拓展与思考:

进一步思考树结构的实现:

<撒花完结>

附录:自己写的各部分phase的c代码

void phase_1()

void phase_2()

void phase_3()

int func4(int n, int x)

void phase_4()

void phase_6()

int fun7(int *x, int input)

void secret_phase()

前言

bomb实验,感觉十分有趣。它非常考验对于汇编代码的理解,很考验读汇编代码的能力与写汇编代码的能力。这个实验十分推荐自己独立完成,可以独立完成之后再去CSDN上校对自己的思路与寻求更新的思路,会有一种茅塞顿开的领悟之感。下面总结了几点感悟。

1、总的来说,给的汇编代码有很多,甚至有很多汇编代码段。但对于解题来说,不是每一个汇编代码段我们都要细看(当然如果是为了加深对于汇编的理解,也可以认真研究)。比如说一些把名字能够很好表示含义的函数,如phase1中的<strings_not_equal>函数和phase2中的<read_six_numbers>函数等,光是看名字就可以比较有效地理解其意义,就没必要细看了(当然有时还是看几眼防止逻辑上正反的问题)。

2、单是针对解题而言,一个方法是先关注<explode_bomb>段。既然我们的目标是不要爆炸,那么我可以在所有引向爆炸的路上避免,即可。

3、题目中往往藏着提示,根据这些提示可以很快找到方向,比如phase1根据strings可以马上发现我们要研究的对象是字符串,而phase2根据six numbers可以很快发现我们要研究的是6个数字。这样一来我们就可以很快地找到思路,避免对着冗长的汇编代码发呆。

4、感到纸笔演算比较困难?不妨借助强大的gdb功能进行推算。

5、熟悉循环结构,熟悉循环控制变量,熟悉函数调用时的堆栈空间变化,这将为解题带来很大帮助。

6、熟悉一些常见的数据结构的汇编级实现,如二叉检索树、链表等,这是必要的基础理解。

7、对于递归函数,弄清楚其某一层的意思,总结出递归表达式,写出c代码,这样可以加深我们的理解。

8、有条件应对每一段汇编代码写出相对应的c代码。

<Phase_1>字符串比较

(1)首先关注导致爆炸的关键代码段

 8048b77:   85 c0                   test   %eax,%eax
 8048b79:   74 05                   je     8048b80 <phase_1+0x20>
 8048b7b:   e8 f6 05 00 00          call   8049176 <explode_bomb>

不难发现,导致爆炸的原因是没有je,如果je了,就会跳转到安全的地方。若%eax值为0,test将其相与,若结果为0,则成功跳转。这个%eax是<strings_not_equal>函数的返回值,故其实我们要比较两个字符串是否相等,其中一个应该是我们输入的,另外一个是题目保存在某个地址的。我们的目标就是找到题目把这个答案保存在哪里。

既然这个函数是比较两个字符串的相等与否,那必然会把两个字符串所在地址传到函数中。关注到前面的这句话

 8048b63:   c7 44 24 04 44 a2 04    movl   $0x804a244,0x4(%esp)

发现将一个小可爱放到了0x4(%esp),如果比较敏感的话,这里恰好是调用函数传参的地方。那就没得跑了,这个0x804a244如无意外就应该是答案所在的地址。我们以s类型查看该地址,发现确实就是答案。

至此我们得到phase1的答案

I am for medical liability at the federal level.

我们输入答案,验证通过。

<Phase_2>循环

这道题一开始我花了太多时间去研究<read_six_numbers>函数体了,后来发现其实不是很有这个必要。包括还犯了一个错误就是没有借助Linux强大的gdb功能进行推算,试图纯用纸笔和人脑进行计算,这真的是愚蠢至极。

这道题的提示实际上就藏在<read_six_numbers>这个函数的名字中,顾名思义,就是我们输入6个数字,程序对这6个数字进行验证。那我们的目标就是找出这6个数字。再结合之前总结的“找到什么导致爆炸”,我们很容易关注到这个代码段。

 8048b9d:   83 7c 24 18 00          cmpl   $0x0,0x18(%esp)
 8048ba2:   75 07                   jne    8048bab <phase_2+0x27>
 8048ba4:   83 7c 24 1c 01          cmpl   $0x1,0x1c(%esp)
 8048ba9:   74 05                   je     8048bb0 <phase_2+0x2c>
 8048bab:   e8 c6 05 00 00          call   8049176 <explode_bomb>

M[0x18(%esp)]在和0比较,如果不相等,会导致跳转并爆炸,那0x18(%esp)肯定为0;

M[0x1c(%esp)]在和1比较,如果相等,就会跳转到爆炸后的安全代码段,否则爆炸,所以0x1c(%esp)为1;

那么既然用来作为比较,肯定这两个值都是我们输入的关键值,假设我们输入的数值为数组m的数。我们猜测M[0x18(%esp)]和M[0x1c(%esp)]为m[1]和m[2](即我们输入的第一个和第二个数值),即我们尝试输入0,1,2,3,4,5

发现我们在 0x8048bab这个点没有爆炸,那么我们的猜测是正确的,前两个数分别是0,1。

然后关注到这个jne指令,如果不满足%esi里的值等于%ebx里的值,那么会回到mov指令的地方。这说明了两点。第一,这里有一个循环;第二,mov前的两个lea应该进行了一个初始化。由前面M[0x18(%esp)]和M[0x1c(%esp)]为m[1]和m[2],这里M[0x20(%esp)]应该是m[3](即第三个数),mov    -0x8(%ebx),%eax和add    -0x4(%ebx),%eax这两步很好理解,就是在把前两个进行累加并放在%eax中,和M[%ebx]进行比较,需要相等。

 8048bb0:   8d 5c 24 20             lea    0x20(%esp),%ebx
 8048bb4:   8d 74 24 30             lea    0x30(%esp),%esi
 8048bb8:   8b 43 f8                mov    -0x8(%ebx),%eax
 8048bbb:   03 43 fc                add    -0x4(%ebx),%eax
 8048bbe:   39 03                   cmp    %eax,(%ebx)
 8048bc0:   74 05                   je     8048bc7 <phase_2+0x43>
 8048bc2:   e8 af 05 00 00          call   8049176 <explode_bomb>
 8048bc7:   83 c3 04                add    $0x4,%ebx
 8048bca:   39 f3                   cmp    %esi,%ebx
 8048bcc:   75 ea                   jne    8048bb8 <phase_2+0x34>
 8048bce:   83 c4 34                add    $0x34,%esp
 8048bd1:   5b                      pop    %ebx
 8048bd2:   5e                      pop    %esi
 8048bd3:   c3                      ret

也就是说,第三个数是前两个数的加和。再关注到add    $0x4,%ebx这一步,这是在将处理地址增加,也就是现在%ebx中保存m[4]的地址了。从而实现了循环的传递。

这里的 cmp    %esi,%ebx是循环的跳出判定,其实可以看到%esi内存放的0x30(%esp)正好是六个数的数组的结束地址,这就很好地解释了这个循环。

根据上述分析,随着循环进行,答案依次为0,1,1,2,3,5。是一个斐波那契数列。

我们输入答案,验证通过。

<Phase_3>分支语句与跳转表

首先关注这一段调用scanf函数前的前置工作,实际上干的事情就是把scanf(“%d”,&a)中的几个地址参数&a给确定好,我们看到关键的有这三个0x28(%esp)、0x2f(%esp)、0x24(%esp)。而这三个在向调用函数传递的位置也是连续的0x10(%esp)、0xc(%esp)、0x8(%esp)。也就是说,把读入进来的数分别存放在这三个位置上。

再根据我们对scanf的了解,应该还要传递读取的方式。movl   $0x804a29e,0x4(%esp)应该干的就是这个事情,我们可以用字符的形式查看这个地址0x804a29e

可以发现我们需要输入的是一个整数,一个字符和一个整数,中间以空格隔开。

 8048bd7:   8d 44 24 28             lea    0x28(%esp),%eax
 8048bdb:   89 44 24 10             mov    %eax,0x10(%esp)
 8048bdf:   8d 44 24 2f             lea    0x2f(%esp),%eax
 8048be3:   89 44 24 0c             mov    %eax,0xc(%esp)
 8048be7:   8d 44 24 24             lea    0x24(%esp),%eax
 8048beb:   89 44 24 08             mov    %eax,0x8(%esp)
 8048bef:   c7 44 24 04 9e a2 04    movl   $0x804a29e,0x4(%esp)
 8048bf6:   08
 8048bf7:   8b 44 24 40             mov    0x40(%esp),%eax
 8048bfb:   89 04 24                mov    %eax,(%esp)
 8048bfe:   e8 6d fc ff ff          call   8048870 <__isoc99_sscanf@plt>

上面关注了我们输入的形式,接下来继续阅读代码,尝试解出这三个值。

 8048bfe:   e8 6d fc ff ff          call   8048870 <__isoc99_sscanf@plt>
 8048c03:   83 f8 02                cmp    $0x2,%eax
 8048c06:   7f 05                   jg     8048c0d <phase_3+0x39>
 8048c08:   e8 69 05 00 00          call   8049176 <explode_bomb>
 8048c0d:   83 7c 24 24 07          cmpl   $0x7,0x24(%esp)
 8048c12:   0f 87 fc 00 00 00       ja     8048d14 <phase_3+0x140>

根据这一段逻辑,这里要避开两个炸弹,要求的条件是call函数返回后%eax内的值>2且0x24(%esp)<=7,这里0x24(%esp)内存放的应该是跳转的数n,所以从这里可以看出这个case语句应该有0~7这8个选项,跳转表有8个终点。

我们假定这个0x24(%esp)里存放的是我们第一个读入的数,我们尝试输入一个5,发现它真的被存在%eax内,可以确定第一个输入的数决定跳转地址。

看到这一句话,关注到这应该是一个跳转表。

 8048c1c:   ff 24 85 c0 a2 04 08    jmp    *0x804a2c0(,%eax,4)

而跳转表的首地址应该是0x804a2c0。

我们看一看跳转表(其实可以根据上面推断出应该有8个,但为了不缺漏,我们可以直接查看10个,更加方便)

这样我们就拿到了跳转表的终点地址。

接下来的8个这样的结构,实际上是多个case分支的下要干的事情以及判定。

 8048c23:   b8 64 00 00 00          mov    $0x64,%eax
 8048c28:   81 7c 24 28 80 00 00    cmpl   $0x80,0x28(%esp)
 8048c2f:   00
 8048c30:   0f 84 e8 00 00 00       je     8048d1e <phase_3+0x14a>
 8048c36:   e8 3b 05 00 00          call   8049176 <explode_bomb>
 8048c3b:   b8 64 00 00 00          mov    $0x64,%eax
 8048c40:   e9 d9 00 00 00          jmp    8048d1e <phase_3+0x14a>

我们以第一个举例,首先0x28(%esp)要等于0x80,然后再关注所有case分支最终跳转的汇合点。不难发现这里还要比较%eax的值和0x2f(%esp)保存的值是否相等。

总结来说,对于我们输入的一组数据n,c,m。这里分别判定了在n分支下c和m是否为给定值。对于这个分支,是c=0x64,m=0x80,也就是字符为d,数为128。

 8048d1e:   3a 44 24 2f             cmp    0x2f(%esp),%al
 8048d22:   74 05                   je     8048d29 <phase_3+0x155>
 8048d24:   e8 4d 04 00 00          call   8049176 <explode_bomb>
 8048d29:   83 c4 3c                add    $0x3c,%esp
 8048d2c:   c3                      ret

我们输入0 d 128进行验证,发现验证正确。

同理,另外7组跳转表也可以一一得出相应的答案。本题一共8组答案,任意一组输入都为正确。

n

C(hex)

M(hex)

c

m

0

0x64

0x80

d

128

1

0x6f

0x135

o

309

2

0x67

0x348

g

840

3

0x6b

0x16d

k

365

4

0x75

0x1d7

u

471

5

0x72

0x31b

r

795

6

0x6e

0x204

n

516

7

0x6f

0xb0

o

176

最终答案即为

n

c

m

0

d

128

1

o

309

2

g

840

3

k

365

4

u

471

5

r

795

6

n

516

7

o

176

<Phase_4>递归调用

这道题与上一道题的代码有很大的相似之处。

像是这一段

 8048d8d:   8d 44 24 18             lea    0x18(%esp),%eax
 8048d91:   89 44 24 0c             mov    %eax,0xc(%esp)
 8048d95:   8d 44 24 1c             lea    0x1c(%esp),%eax
 8048d99:   89 44 24 08             mov    %eax,0x8(%esp)
 8048d9d:   c7 44 24 04 83 a4 04    movl   $0x804a483,0x4(%esp)

和这一段

 8048dac:   e8 bf fa ff ff          call   8048870 <__isoc99_sscanf@plt>

分别是传递用scanf所读取数的存放位置,和scanf函数本身。这个思路我们在上一道题就已经看到过了。第一件事情肯定是查看这个地址,获取读入的类型。

可见这次是读入两个整数。

这一点也可以从下面看出来,这里%eax是scanf函数的返回值,也就是读入数的个数,若这个个数不为2,就会爆炸。

 8048db1:   83 f8 02                cmp    $0x2,%eax
 8048db4:   75 0e                   jne    8048dc4 <phase_4+0x3a>

接着由以下两句,%eax存的是我们输入的第二个值,我们称它为x。

 8048db6:   8b 44 24 18             mov    0x18(%esp),%eax
 8048dba:   83 f8 01                cmp    $0x1,%eax

再关注到这里对x的两个限制。有1<x<=4,所以x有3个可能的取值,分别是1,2,3。

 8048dba:   83 f8 01                cmp    $0x1,%eax
 8048dbd:   7e 05                   jle    8048dc4 <phase_4+0x3a>
 8048dbf:   83 f8 04                cmp    $0x4,%eax 
 8048dc2:   7e 05                   jle    8048dc9 <phase_4+0x3f>
 8048dc4:   e8 ad 03 00 00          call   8049176 <explode_bomb>

接下来有一个取巧的方法,就是让电脑帮我们计算出结果,我们再直接拿。

关注到这一句话,这里将我们输入的第一个数(我们称它为check)和%eax比较,若相等则正确否则爆炸。那么如果我们直接在这一步break,再使用info r查看%eax的值,不就可以轻轻松松取得答案了嘛。

 8048ddd:   3b 44 24 1c             cmp    0x1c(%esp),%eax

下面以x=2为例,按照这个思路操作一下。

可以得出结果为176,代入之后成功,说明我们的想法是正确的。

<func_4>递归函数体分析

当然,出于对自己的要求以及对func4函数的尊敬,我还是看了一遍func4函数。

下面是一些分析。

(1)主函数

Phase_4中这一段,很详细地描述了func_4函数的两个参数,(%esp)也就是第一个参数,是9,也就是递归层数,我们称作n;0x4(%esp)也就是第二个参数,是x。

所以func_4(n,x)

 8048dc9:   8b 44 24 18             mov    0x18(%esp),%eax
 8048dcd:   89 44 24 04             mov    %eax,0x4(%esp)
 8048dd1:   c7 04 24 09 00 00 00    movl   $0x9,(%esp)
 8048dd8:   e8 50 ff ff ff          call   8048d2d <func4>

接下来真正进入func_4函数

(2)寄存器保护

首先,开头的这三步

 8048d30:   89 5c 24 10             mov    %ebx,0x10(%esp)
 8048d34:   89 74 24 14             mov    %esi,0x14(%esp)
 8048d38:   89 7c 24 18             mov    %edi,0x18(%esp)

和结尾的这三步

 8048d7a:   8b 5c 24 10             mov    0x10(%esp),%ebx
 8048d7e:   8b 74 24 14             mov    0x14(%esp),%esi
 8048d82:   8b 7c 24 18             mov    0x18(%esp),%edi

将三个寄存器里的值先放在主存中保存,在函数结束之后再放回寄存器内,这是因为在这个函数中,这几个寄存器要被用到,这是一种保护的措施。这是一种在函数调用间很常见的步骤,在本题的具体的原因还有待研究。

(3)传参的保存

接下来关注这一句(建立)

 8048d2d:   83 ec 1c                sub    $0x1c,%esp

和这两句(传参保存)

 8048d3c:   8b 74 24 20             mov    0x20(%esp),%esi
 8048d40:   8b 5c 24 24             mov    0x24(%esp),%ebx  

可以发现,%ebx存的是x,%esi存的是n。

(4)递归边界条件

接下来是递归的边界条件。

第一个条件,test是判0,若n=0,返回0。

 8048d44:   85 f6                   test   %esi,%esi
 8048d46:   7e 2b                   jle    8048d73 <func4+0x46>

第二个条件,若n=1,返回%ebx内的值,也就是x。

 8048d48:   83 fe 01                cmp    $0x1,%esi
 8048d4b:   74 2b                   je     8048d78 <func4+0x4b>

(5)递归函数执行部分

再接下来是递归函数的执行部分。

这是第一段,计算func4(n-1,x)+x并保存在%edi内

 8048d4d:   89 5c 24 04             mov    %ebx,0x4(%esp)
 8048d51:   8d 46 ff                lea    -0x1(%esi),%eax
 8048d54:   89 04 24                mov    %eax,(%esp)
 8048d57:   e8 d1 ff ff ff          call   8048d2d <func4>
 8048d5c:   8d 3c 18                lea    (%eax,%ebx,1),%edi

下面是第二段,计算func4(n-2,x),再和%edi相加,保存在%ebx内。

 8048d5f:   89 5c 24 04             mov    %ebx,0x4(%esp)
 8048d63:   83 ee 02                sub    $0x2,%esi
 8048d66:   89 34 24                mov    %esi,(%esp)
 8048d69:   e8 bf ff ff ff          call   8048d2d <func4>
 8048d6e:   8d 1c 07                lea    (%edi,%eax,1),%ebx

最后若n不是0或1,返回%ebx的值。

(5)总结

总的来看,就是计算了func4(n-1,x)+func4(n-2,x)+x的值并返回;若n=0,返回0;若n=1,返回x。知道了这个,我们就可以写一段c程序来模拟这件事,并靠自己得出结果。

#include <iostream>
using namespace std;
int result(int n, int x)
{
  if (n == 0)
    return 0;
  if (n == 1)
    return x;
  return (result(n - 1, x) + result(n - 2, x) + x);
}
int main()
{
  int x;
  x = 4;
  cout << result(9, x) << endl;
  return 0;
}

最后输出的结果就是check的值。证明我们推断正确。

所以本题的答案如下。

Check

x

176

2

264

3

352

4

<phase_5>字符串末尾累加

首先分析题目。

(1)比较字符个数

首先关注到第一个炸弹点,字符个数,这里的string_length猜测是返回了我们输入字符的个数,且必须要等于6,也就是说限定了我们必须输入6位字符。

 8048df7:   e8 4f 02 00 00          call   804904b <string_length>
 8048dfc:   83 f8 06                cmp    $0x6,%eax
 8048dff:   74 05                   je     8048e06 <phase_5+0x1a>
 8048e01:   e8 70 03 00 00          call   8049176 <explode_bomb>

(2)赋初值、各寄存器含义、以及初探循环

这里给寄存器%eax赋了初值0,给寄存器%edx赋了初值0。

 8048e06:   ba 00 00 00 00          mov    $0x0,%edx
 8048e0b:   b8 00 00 00 00          mov    $0x0,%eax

结合后面%eax寄存器自增以及与6比较并跳转(如下),不难发现%eax应该承担着一个循环控制变量i的作用。而与6相比较,不难发现这其实是一个遍历我们输入字符串各个位置的循环,总共执行6次。

 8048e1e:   83 c0 01                add    $0x1,%eax
 8048e21:   83 f8 06                cmp    $0x6,%eax
 8048e24:   75 ea                   jne    8048e10 <phase_5+0x24>

再结合跳出循环后%edx与固定值相比较,我们不难发现,实际上这个%edx是一个累加器。而第i重循环的作用也正是不断地给这个累加器加上一个特定的值,这个特定的值与我们输入的字符串的第i位有关。

 8048e26:   83 fa 38                cmp    $0x38,%edx
 8048e29:   74 05                   je     8048e30 <phase_5+0x44>
 8048e2b:   e8 46 03 00 00          call   8049176 <explode_bomb>

(3)循环执行体

其实循环执行体很简单,就只有如下几句,它想干的事情是这样的。s[i]的末4位与0xf相与,结果以整数形式存储,记作r。(s[i]本应该是8位,这里实际上取了它的末4位,结果共有16种,即0~15)。访问(基地址0x804a2e0+4*r)这个地址,记作target_address,把这个地址上的值累加到寄存器%edx上。这就结束了。

 8048e10:   0f be 0c 03             movsbl (%ebx,%eax,1),%ecx
 8048e14:   83 e1 0f                and    $0xf,%ecx
 8048e17:   03 14 8d e0 a2 04 08    add    0x804a2e0(,%ecx,4),%edx

(4)累加结果比较

最后%edx与0x38,也就是十进制下的56比较,要求%ebx内的值等于它。

分析完题目之后,我们要来解题了。要知道输入什么字符能最终得到正确的累加结果。我们可以先查看所有(基地址0x804a2e0+4*r)关于r从0到15的结果。如下。

查阅ASCII码表后,我们可以总结出下表。

可能字符

字符ascii码末4位

Target_address

单次累加值

Bin

Hex

(space)

0

@

P

p

0000

0

Bias+0

2

!

1

A

Q

a

q

0001

1

Bias+0x4

10

2

B

R

b

r

0010

2

Bias+0x8

6

#

3

C

S

c

s

0011

3

Bias+0xc

1

$

4

D

T

d

t

0100

4

Bias+10

12

%

5

E

U

e

u

0101

5

Bias+0x14

16

&

6

F

V

f

v

0110

6

Bias+0x18

9

.

7

G

W

g

w

0111

7

Bias+0x1c

3

(

8

H

X

h

x

1000

8

Bias+20

4

)

9

I

Y

i

y

1001

9

Bias+0x24

7

*

:

J

Z

j

z

1010

a

Bias+0x28

14

+

;

K

[

k

{

1011

b

Bias+0x2c

5

<

L

/

l

|

1100

c

Bias+30

11

=

M

]

m

}

1101

d

Bias+0x34

8

>

N

^

n

1110

e

Bias+0x38

15

?

O

o

1111

f

Bias+0x3c

13

以本题要求最后6个字符的累加值为56,我们可以取BJMBJM这个字符串,因为B对应6,而J对应14,M对应8,加和正好为56。

由此我们可以看到,这道题的答案应该有很多组,只要按照上表其最终累加结果为56即可。我们不再一一列出。

附上使用BJMBJM验证的结果。

可见我们的推论是正确的。

<phase_6>链表

总述:

有六个节点,每个节点中已预先存储了一个值。要求我们按照顺序输入节点编号,来保证其中结点的值依次递增。

首先,我们来对代码进行静态的分析。

(1)读入节点编号

08048e35 <phase_6>:
 8048e35:	56                   	push   %esi
 8048e36:	53                   	push   %ebx
 8048e37:	83 ec 44             	sub    $0x44,%esp
 8048e3a:	8d 44 24 10          	lea    0x10(%esp),%eax
 8048e3e:	89 44 24 04          	mov    %eax,0x4(%esp)
 8048e42:	8b 44 24 50          	mov    0x50(%esp),%eax
 8048e46:	89 04 24             	mov    %eax,(%esp)
 8048e49:	e8 5d 04 00 00       	call   80492ab <read_six_numbers>

这里没有什么可说的,就是读入节点编号。

(2)第一阶段:合规性检验

确保六个数字符合规定。规定是指,不超过6,不重复,即必须是1、2、3、4、5、6的排列。

 8048e4e:	be 00 00 00 00        	mov    $0x0,%esi						#initial esi=0
 8048e53:	8b 44 b4 10          	mov    0x10(%esp,%esi,4),%eax		#loop 外层(控制变量esi)
 8048e57:	83 e8 01             	sub    $0x1,%eax
 8048e5a:	83 f8 05             	cmp    $0x5,%eax
 8048e5d:	76 05                	jbe    8048e64 <phase_6+0x2f>			#eax<=6正常(控制变量ebx)
 8048e5f:	e8 12 03 00 00       	call   8049176 <explode_bomb>
 8048e64:	83 c6 01             	add    $0x1,%esi						#esi++
 8048e67:	83 fe 06             	cmp    $0x6,%esi
 8048e6a:	74 33                	je     8048e9f <phase_6+0x6a>			#esi=6,跳出循环
 8048e6c:	89 f3                	mov    %esi,%ebx						#esi!=6
 8048e6e:	8b 44 9c 10          	mov    0x10(%esp,%ebx,4),%eax			#loop 内层
 8048e72:	39 44 b4 0c          	cmp    %eax,0xc(%esp,%esi,4)
 8048e76:	75 05                	jne    8048e7d <phase_6+0x48>			#
 8048e78:	e8 f9 02 00 00       	call   8049176 <explode_bomb>
 8048e7d:	83 c3 01             	add    $0x1,%ebx						#ebx++
 8048e80:	83 fb 05             	cmp    $0x5,%ebx
 8048e83:	7e e9                	jle    8048e6e <phase_6+0x39>	  	 	#loop 内层 ebx:esi..5
 8048e85:	eb cc                	jmp    8048e53 <phase_6+0x1e>		#loop 外层 esi:0..5

这部分代码,使用c++可以写成如下形式。

有一个循环的嵌套,其中,外层循环的控制变量为%esi,内层循环的控制变量为%ebx

 if (a[0] > 6)
        bomb();
    for (int i = 1; i < 6; i++)
    {
        if (a[i] > 6)
            bomb();
        for (int j = i; j < 6; j++)
        {
            if (a[j] == a[i - 1])
                bomb();
        }
    }

(3)第二阶段:排序

 8048e87:	8b 52 08             	mov    0x8(%edx),%edx			#ecx>1:通过循环得到编号对应的数据地址
 8048e8a:	83 c0 01             	add    $0x1,%eax
 8048e8d:	39 c8                	cmp    %ecx,%eax						#loop2
 8048e8f:	75 f6                	jne    8048e87 <phase_6+0x52>
 8048e91:	89 54 b4 28          	mov    %edx,0x28(%esp,%esi,4)			#将编号对应的数据地址放入数组中
 8048e95:	83 c3 01             	add    $0x1,%ebx						#ebx++
 8048e98:	83 fb 06             	cmp    $0x6,%ebx
 8048e9b:	75 07                	jne    8048ea4 <phase_6+0x6f>			#ebx!=6,重复循环
 8048e9d:	eb 1c                	jmp    8048ebb <phase_6+0x86>			#ebx=6跳出
 8048e9f:	bb 00 00 00 00       	mov    $0x0,%ebx						#第二阶段开始:esi=6跳出循环后
 8048ea4:	89 de                	mov    %ebx,%esi
 8048ea6:	8b 4c 9c 10          	mov    0x10(%esp,%ebx,4),%ecx
 8048eaa:	b8 01 00 00 00       	mov    $0x1,%eax
 8048eaf:	ba 3c c1 04 08       	mov    $0x804c13c,%edx					#给定数据首地址放入%edx
 8048eb4:	83 f9 01             	cmp    $0x1,%ecx
 8048eb7:	7f ce                	jg     8048e87 <phase_6+0x52>			#ecx>1
 8048eb9:	eb d6                	jmp    8048e91 <phase_6+0x5c>			#ecx=1,没必要进入loop2

注意到有给定一个地址,我们发现循环loop2在不断访问(%edx+8),遂查看这些地址。

注意到给定地址0x804c13c储存在%edx内,而在%ecx>1时,会通过循环不断将(%edx+8)所对应的值赋值给%edx。实际上,我们查看每一个地址的(%edx+8)会发现,这实际上是一个链表型的结构,每两个结构之间相邻12个字节,而这12个字节被用来存3样东西。(%edx+8)也就是储存的第三项数据,实际上就是下一结构的地址。这一段是循环loop2的解释。

为方便说明,我们约定如下:

0x10(%esp,%ebx,4)开始的,为我们输入的六个元素按顺序排列,约定为数组a[]

0x28(%esp,%esi,4)为新数组,约定为b[]

所以这里我们可以看出来是通过循环访问(循环控制变量为%ebx)输入的编号a[i].对于特定的一次编号i,若其为1,则就将链表结构的第一个节点的地址0x804c13c移至一个新的数组b[i];若不为1,则通过循环loop2(上面解释过)找到这个编号i对对应的节点,将其地址(0x804c148、0x804c154、0x804c160、0x804c16c、0x804c178中的一个)移至b[i]。

使用c来更直观地表述如下。

for (int i = 0; i < 6; i++)
    {
        if (a[i] > 1) // 实际上这句可以不要,放这里可以看得更清晰一点
        {
            for (int j = 1; j < a[i]; j++)
            {
                head = head->next;
            }
            b[i] = &head;
        }
    }

这实际上是一个排序的过程。

(4)第三阶段:复写下一状态(链表重组)

 8048ebb:	8b 5c 24 28          	mov    0x28(%esp),%ebx			#第三阶段开始:ebx=6跳出循环后
 8048ebf:	8b 44 24 2c          	mov    0x2c(%esp),%eax
 8048ec3:	89 43 08             	mov    %eax,0x8(%ebx)			#*b[0]->next=*b[1]
 8048ec6:	8b 54 24 30          	mov    0x30(%esp),%edx
 8048eca:	89 50 08             	mov    %edx,0x8(%eax)			#*b[1]->next=*b[2]
 8048ecd:	8b 44 24 34          	mov    0x34(%esp),%eax
 8048ed1:	89 42 08             	mov    %eax,0x8(%edx)			#*b[2]->next=*b[3]
 8048ed4:	8b 54 24 38          	mov    0x38(%esp),%edx
 8048ed8:	89 50 08             	mov    %edx,0x8(%eax)			#*b[3]->next=*b[4]
 8048edb:	8b 44 24 3c          	mov    0x3c(%esp),%eax
 8048edf:	89 42 08             	mov    %eax,0x8(%edx)			#*b[4]->next=*b[5]
 8048ee2:	c7 40 08 00 00 00 00 	movl   $0x0,0x8(%eax)

这一部分根据上一阶段的排序结果来对链表节点进行重组,按照我们输入的数组a[]的顺序来重新排列链表节点的顺序。

(5)检验数据域递增性

最后,查看输入顺序是否正确,即在按照我们输入的数组a[]进行重新排列后,链表内节点的data域是否递增。

 8048ee9:	be 05 00 00 00       	mov    $0x5,%esi					#loop(循环控制变量为%esi)
 8048eee:	8b 43 08             	mov    0x8(%ebx),%eax
 8048ef1:	8b 10                	mov    (%eax),%edx
 8048ef3:	39 13                	cmp    %edx,(%ebx)
 8048ef5:	7e 05                	jle    8048efc <phase_6+0xc7>		#要求(0x8(%ebx))<(%ebx),即递增
 8048ef7:	e8 7a 02 00 00       	call   8049176 <explode_bomb>
 8048efc:	8b 5b 08             	mov    0x8(%ebx),%ebx
 8048eff:	83 ee 01             	sub    $0x1,%esi
 8048f02:	75 ea                	jne    8048eee <phase_6+0xb9>
 8048f04:	83 c4 44             	add    $0x44,%esp
 8048f07:	5b                   	pop    %ebx
 8048f08:	5e                   	pop    %esi
 8048f09:	c3                   	ret

用c来更清晰地表示:

    // 第四阶段:检验数据域递增性
    struct node *head;
    for (int i = 5; i > 0; i--)
    {
        if (head->data > head->next->data)
            bomb();
    }

(6)node类型分析

事实上,如果我们对这个节点进行一个查看,截图如下。

不难发现其实节点有三个域,第一个是数据域,存储的是值的大小;第二个是编号域,反应的是节点的编号(实际上用处不大);第三个是next域,是指针类型,指向下一个节点的地址。这是一个典型的链表结构。

根据上述分析,若要输入正确的顺序,我们必须得知道每个节点的数据域是多少。

查看每个节点的数据域,我们发现它们按顺序分别是0xf8、0x12e、0x3e、0x19e、0x2d6、0x277。排序过后的编码应该为3、1、2、4、6、5.输入验证,发现正确。

<secret_phase>二叉检索树(BinarySearchTree)

前言:这道题比较难看出来,是一个二叉检索树并且寻找目标节点的编号。最终实现的目标是我们输入一个数input,它所在的位置与题目中所规定的相符合。

<phase_defused>寻找隐藏关入口

关注到main函数部分,每次在调用相应的phase之后都会调用<phase_defused>,猜测可能跟隐藏关卡相关,所以必须要对这一段函数进行研究。

(下图为main函数的phase_3、4在完成档次验证后都调用了<phase_defused>)

下面查看<phase_defused>代码

080492fb <phase_defused>:
 80492fb:	81 ec 8c 00 00 00    	sub    $0x8c,%esp
 8049301:	65 a1 14 00 00 00    	mov    %gs:0x14,%eax
 8049307:	89 44 24 7c          	mov    %eax,0x7c(%esp)
 804930b:	31 c0                	xor    %eax,%eax
 804930d:	83 3d cc c3 04 08 06 	cmpl   $0x6,0x804c3cc
 8049314:	75 72                	jne    8049388 <phase_defused+0x8d>	#若前6关都通过则进入,否则自动跳出
 8049316:	8d 44 24 2c          	lea    0x2c(%esp),%eax
 804931a:	89 44 24 10          	mov    %eax,0x10(%esp)
 804931e:	8d 44 24 28          	lea    0x28(%esp),%eax
 8049322:	89 44 24 0c          	mov    %eax,0xc(%esp)
 8049326:	8d 44 24 24          	lea    0x24(%esp),%eax
 804932a:	89 44 24 08          	mov    %eax,0x8(%esp)
 804932e:	c7 44 24 04 89 a4 04 	movl   $0x804a489,0x4(%esp)		#"%d %d %s",即两个数字后还要输入字符串
 8049335:	08
 8049336:	c7 04 24 d0 c4 04 08 	movl   $0x804c4d0,(%esp)
 804933d:	e8 2e f5 ff ff       	call   8048870 <__isoc99_sscanf@plt>	#第四关中同样出现了此段调用
 8049342:	83 f8 03             	cmp    $0x3,%eax
 8049345:	75 35                	jne    804937c <phase_defused+0x81>	#若第四关中输入个数不是3个,不触发

发现在<phase_defused>内有一个判定,若前6关都通过才会触发隐藏关卡,否则跳过。触发隐藏关卡之后,首先判定第四关中输入的是不是两个整数与一个字符串。我们知道,第四关的答案是两个整数,但是如果要进入隐藏关卡,这里需要在两个整数之后再输入一个字符串。

(查看输入格式的截图)

这里将我们在第四关中输入的字符串作为第一个参数,将给定字符串(也就是答案)作为第二个参数,传递给字符串相等性判定函数。若我们输入的与给定值一样,则会向终端输出信息,并进入隐藏关卡。进入隐藏关卡后,调用<secret_phase>段。

 8049347:	c7 44 24 04 92 a4 04 	movl   $0x804a492,0x4(%esp)			#第二个参数"DrEvil"
 804934e:	08
 804934f:	8d 44 24 2c          	lea    0x2c(%esp),%eax				#第一个参数
 8049353:	89 04 24             	mov    %eax,(%esp)
 8049356:	e8 09 fd ff ff       	call   8049064 <strings_not_equal>	#比较密码是否相等(重点关注)
 804935b:	85 c0                	test   %eax,%eax
 804935d:	75 1d                	jne    804937c <phase_defused+0x81>	#若第四关中输入的密码错误,不触发
 804935f:	c7 04 24 58 a3 04 08 	movl   $0x804a358,(%esp)
 8049366:	e8 95 f4 ff ff       	call   8048800 <puts@plt>
 804936b:	c7 04 24 80 a3 04 08 	movl   $0x804a380,(%esp)
 8049372:	e8 89 f4 ff ff       	call   8048800 <puts@plt>			#这一段是输出"找到隐藏关"的记录
 8049377:	e8 df fb ff ff       	call   8048f5b <secret_phase>		#进入隐藏关
 804937c:	c7 04 24 b8 a3 04 08 	movl   $0x804a3b8,(%esp)			#输出通过(未触发隐藏关)
 8049383:	e8 78 f4 ff ff       	call   8048800 <puts@plt>
 8049388:	8b 44 24 7c          	mov    0x7c(%esp),%eax
 804938c:	65 33 05 14 00 00 00 	xor    %gs:0x14,%eax
 8049393:	74 05                	je     804939a <phase_defused+0x9f>
 8049395:	e8 36 f4 ff ff       	call   80487d0 <__stack_chk_fail@plt>
 804939a:	81 c4 8c 00 00 00    	add    $0x8c,%esp

(查看给定密码的截图)

(在第四关中输入正确的密码后,向终端提示已经成功进入隐藏关卡)

<secret_phase>隐藏关

在这一段中,首先从终端读入字符串,通过strtol函数将字符串转换为长整型数。

Strol的原型函数为long int strtol(const char *nptr,char **endptr,int base);其中第一个参数为待转换的字符串首地址,第二个参数为转换的首地址,第三个参数为转换的进制(范围为2至36)这里是0xa,即转换为十进制。

若我们输入的就是数值,通过strol函数返回的值即为我们输入的数值,不作改变。我们称它为input。而后,input作为第二个参数传递入fun7函数,给定地址作为第一个参数传递入fun7。

08048f5b <secret_phase>:
 8048f5b:	53                   	push   %ebx
 8048f5c:	83 ec 18             	sub    $0x18,%esp
 8048f5f:	e8 39 02 00 00       	call   804919d <read_line>
 8048f64:	c7 44 24 08 0a 00 00 	movl   $0xa,0x8(%esp)			#参数3
 8048f6b:	00
 8048f6c:	c7 44 24 04 00 00 00 	movl   $0x0,0x4(%esp)			#参数2
 8048f73:	00
 8048f74:	89 04 24             	mov    %eax,(%esp)				#参数1:read_line的返回值
 8048f77:	e8 64 f9 ff ff       	call   80488e0 <strtol@plt>
 8048f7c:	89 c3                	mov    %eax,%ebx
 8048f7e:	8d 40 ff             	lea    -0x1(%eax),%eax
 8048f81:	3d e8 03 00 00       	cmp    $0x3e8,%eax				#0x3e8=1000
 8048f86:	76 05                	jbe    8048f8d <secret_phase+0x32>	#strtol返回值<1000
 8048f88:	e8 e9 01 00 00       	call   8049176 <explode_bomb>
 8048f8d:	89 5c 24 04          	mov    %ebx,0x4(%esp)			#参数2:strtol的返回值(即为输入值input)
 8048f91:	c7 04 24 88 c0 04 08 	movl   $0x804c088,(%esp)		#*0x804c088="0x24"即36 参数1
 8048f98:	e8 6d ff ff ff       	call   8048f0a <fun7>
 8048f9d:	85 c0                	test   %eax,%eax
 8048f9f:	74 05                	je     8048fa6 <secret_phase+0x4b>	#fun7返回值得是0
 8048fa1:	e8 d0 01 00 00       	call   8049176 <explode_bomb>
 8048fa6:	c7 04 24 78 a2 04 08 	movl   $0x804a278,(%esp)			#输出隐藏关通过
 8048fad:	e8 4e f8 ff ff       	call   8048800 <puts@plt>
 8048fb2:	e8 44 03 00 00       	call   80492fb <phase_defused>
 8048fb7:	83 c4 18             	add    $0x18,%esp
 8048fba:	5b                   	pop    %ebx
 8048fbb:	c3                   	ret

(查看给定地址值)

(查看最后会输出什么[不必要,纯粹为了好玩])

最后期待的是fun7返回的是0,这样就能够正确解出。

<fun7>检索目标元素

发现%ecx中一直存放我们之前输入的input值,从未被改变过。根据传入指针x所对应的值*x的值与input的关系来确定下一步的走向。有如下递归关系:

递归边界为x=0,即访问到最低地址,就返回-1(错误),事实上永远不可能访问到这个地方,因为这一段代码不是程序能够访问到的。

08048f0a <fun7>:
 8048f0a:	53                   	push   %ebx
 8048f0b:	83 ec 18             	sub    $0x18,%esp
 8048f0e:	8b 54 24 20          	mov    0x20(%esp),%edx			#读取参数1放入%edx(x)
 8048f12:	8b 4c 24 24          	mov    0x24(%esp),%ecx			#读取参数2放入%ecx(input)
 8048f16:	85 d2                	test   %edx,%edx
 8048f18:	74 37                	je     8048f51 <fun7+0x47>		#x为0,返回-1
 8048f1a:	8b 1a                	mov    (%edx),%ebx
 8048f1c:	39 cb                	cmp    %ecx,%ebx				#比较input和*x
 8048f1e:	7e 13                	jle    8048f33 <fun7+0x29>

 8048f20:	89 4c 24 04          	mov    %ecx,0x4(%esp)			#*x>input 参数2:input
 8048f24:	8b 42 04             	mov    0x4(%edx),%eax
 8048f27:	89 04 24             	mov    %eax,(%esp)				#参数1:(x+4)
 8048f2a:	e8 db ff ff ff       	call   8048f0a <fun7>
 8048f2f:	01 c0                	add    %eax,%eax
 8048f31:	eb 23                	jmp    8048f56 <fun7+0x4c>		#返回(2fun7())

 8048f33:	b8 00 00 00 00       	mov    $0x0,%eax				#*x<=input
 8048f38:	39 cb                	cmp    %ecx,%ebx
 8048f3a:	74 1a                	je     8048f56 <fun7+0x4c>		#*x=input,返回0
 8048f3c:	89 4c 24 04          	mov    %ecx,0x4(%esp)			#参数2:input
 8048f40:	8b 42 08             	mov    0x8(%edx),%eax
 8048f43:	89 04 24             	mov    %eax,(%esp)				#参数1:(x+8)
 8048f46:	e8 bf ff ff ff       	call   8048f0a <fun7>			#调用fun7()
 8048f4b:	8d 44 00 01          	lea    0x1(%eax,%eax,1),%eax
 8048f4f:	eb 05                	jmp    8048f56 <fun7+0x4c>		#返回(2fun7()+1)

 8048f51:	b8 ff ff ff ff       	mov    $0xffffffff,%eax
 8048f56:	83 c4 18             	add    $0x18,%esp
 8048f59:	5b                   	pop    %ebx
 8048f5a:	c3                   	ret

就解这一道题而言,实际上十分轻松。因为要求返回0,我们只需要第一次进入这个递归结构的时候,就让input=x,它就退出并返回0了。在之前的<secret_phase>中我们已经查看过*0x804c088的值为0x24,即为36,所以这道题答案就是36,输入答案即可得到正确的结果。隐藏关卡就结束了。

深度拓展与思考:

事实上,之前的学长学姐和本级的同学有遇到要求返回值不是0的情况,这个时候就需要代入进去递归一下了。

此时有几个需要考虑的点:

  1. 最深层的那一层递归返回的结果肯定是0;
  2. 根据需要的结果来确定递归的层数以及所走路线。

举例说明:

若要求返回2,则一定是fun7(x,input)=2fun7(x+4)=2fun7(x+4+8)+1,即第一层是*x<input的,返回2fun7(x+4);而第二层是*x>input,返回2fun7(x+8)+1;第三层是*x=input,返回0。在这种情况下只需要查看*(*(x+4)+8)即可找到正确的答案。

进一步思考树结构的实现:

实际上,本题为二叉检索树,上面我是将其作为一个数组去计算的,虽然也能做出最终的结果,但是显然不容易理解,下面我将从二叉检索树的角度重新理解本题。

本质上,如果我们以12字节为步长查看从0x804c088开始的地址空间,我们会发现这实际上是一个链表结构,每个节点都有三个域。第一位的是数据域,第二、三位是指针域,分别指向左孩子和右孩子的地址。

对于一个节点地址x来说,x为其数据域,(x+4)为其左孩子指针域,(x+8)为其右孩子指针域。所以上面我们在*x<input时访问(x+8),即访问其右孩子,这是根据二叉检索树的性质,该节点右边的肯定比该节点的数据要大。若*x>input也是同理的,本质上我们就是在模拟进行这个二叉检索树的检索过程。

如根据上面查看到的结果,我可以画出该二叉检索树的示意图如下。

研究到这个层面,就能够比较有效地解决问题较为复杂的问题了。

比如有同学遇到的要求fun7返回6,那么就可以看作是

即答案为0x23,十进制下为35。

解释原因也比较简单。

Fun7(x,input)=2*fun7(x+4,input)=2*[fun7(*(x+4)+8,input)+1]

=2*{2*fun7(*(*(x+4)+8)+8,input)+1]+1}=2*(2*(0+1)+1)=6

那么*(*(x+4)+8)+8就应该是最终的地址,也就是我们应该的输入值input

因为input=*(*(x+4)+8)+8时才会返回0。

而根据上面这张图,就是先访问左孩子,再访问两次右孩子。

<撒花完结>

将所有答案保存进ans.txt内

(红框内可去掉,该题多解,只取一组即可)

(本来第四组也可以多解,但是要进入隐藏关,就只写了一组)

运行,可以得到所有炸弹都被成功拆除的提示。

至此,bomb-lab算是正式结束了。

附录:自己写的各部分phase的c代码(仅供参考看懂意思,不可运行)

void bomb()
{
}

void phase_1()
{
    string s_ori = "I am for medical liability at the federal level.";
    string s_input;
    scanf("%s", &s_input);
    if (strings_not_equal(s_input, s_ori))
        bomb();
}

void phase_2()
{
    int m[6];
    scanf("%d %d %d %d %d %d", &m[0], &m[1], &m[2], &m[3], &m[4], &m[5]);
    if (m[0] != 0)
        bomb();
    if (m[1] != 1)
        bomb();
    for (int i = 2; i <= 5; i++)
    {
        int temp = m[i - 1] + m[i - 2];
        if (temp != m[i])
            bomb();
    }
}

void phase_3()
{
    int n;
    char c;
    int m;
    if (scanf("%d %c %d", n, c, m) <= 2)
        bomb();
    if (n > 7)
        bomb();
    char temp;
    switch (n)
    {
    case 0:
        if (m != 0x80)
            bomb();
        temp = 0x64;
        break;
    case 1:
        if (m != 0x135)
            bomb();
        temp = 0x6f;
        break;
    case 2:
        if (m != 0x348)
            bomb();
        temp = 0x67;
        break;
    case 3:
        if (m != 0x16d)
            bomb();
        temp = 0x6b;
        break;
    case 4:
        if (m != 0x1d7)
            bomb();
        temp = 0x75;
        break;
    case 5:
        if (m != 0x31b)
            bomb();
        temp = 0x72;
        break;
    case 6:
        if (m != 0x204)
            bomb();
        temp = 0x6e;
        break;
    case 7:
        if (m != 0xb0)
            bomb();
        temp = 0x6f;
        break;
    }
    if (temp != c)
        bomb();
}

int func4(int n, int x)
{
    if (n == 0)
        return 0;
    if (n == 1)
        return x;
    return (result(n - 1, x) + result(n - 2, x) + x);
}

void phase_4()
{
    int check, x;
    if (scanf("%d %d", check, x) != 2)
        bomb();
    if (x <= 1)
        bomb();
    if (x > 4)
        bomb();
    if (func4(9, x) != check)
        bomb();
}
void phase_5()
{
    string s;
    scanf("%s", s);
    if (string_length(s) != 6)
        bomb();
    int total = 0;
    for (int i = 0; i < 6; i++)
    {
        total += m[s[i] & 0xf];
    }
    if (total != 0x38)
        bomb();
}

void phase_6()
{
    int a[6];
    scanf("%d %d %d %d %d %d", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]);
    //  第一阶段:合规性检验
    if (a[0] > 6)
        bomb();
    for (int i = 1; i < 6; i++)
    {
        if (a[i] > 6)
            bomb();
        for (int j = i; j < 6; j++)
        {
            if (a[j] == a[i - 1])
                bomb();
        }
    }
    // 第二阶段:排序
    struct node
    {
        int data;
        int number;
        node *next;
    } struct node head;
    for (int i = 0; i < 6; i++)
    {
        if (a[i] > 1) // 实际上这句可以不要,放这里可以看得更清晰一点
        {
            for (int j = 1; j < a[i]; j++)
            {
                head = head->next;
            }
            b[i] = &head;
        }
    }
    // 第三阶段:复写下一状态
    *b[0]->next = *b[1];
    *b[1]->next = *b[2];
    *b[2]->next = *b[3];
    *b[3]->next = *b[4];
    *b[4]->next = *b[5];
    // 第四阶段:检验数据域递增性
    struct node *head;
    for (int i = 5; i > 0; i--)
    {
        if (head->data > head->next->data)
            bomb();
    }
}
int fun7(int *x, int input)
{
    if (x == 0)
        return -1;
    if (*x > input)
        return 2 * fun7(x + 4, input); // 在左孩子中寻找
    else
    {
        if (*x == input) // 寻找到了
            return 0;
        else                                   //*x<input
            return 2 * fun7(x + 8, input) + 1; // 在右孩子中寻找
    }
}

void secret_phase()
{
    readline();
    long input = strtol(readline(), 0x0, 0xa);
    if (input > 1000)
        bomb();
    if (fun7(0x804c088, input))
        bomb();
}

;