首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >炸弹实验室阶段5: 6字符字符串替换查找表,strings_not_equal

炸弹实验室阶段5: 6字符字符串替换查找表,strings_not_equal
EN

Stack Overflow用户
提问于 2014-02-26 13:20:03
回答 2查看 3.4K关注 0票数 1

有人能给我解释一下这些函数到底是做什么的吗?我有一个断点设置为at<+35>,如箭头所示,这就是我迷路的地方。到目前为止,我只知道这个阶段接受一个长度为6的字符串,但是我并不确切地知道movsblmovzbl函数中发生了什么。我并不期待答案,但如果能有一些见解,我将不胜感激。

如果这个问题以前被回答过,请不要批评我,或者将我重定向到另一个类似的问题。我已经看过所有这些了,但我仍然不明白这是怎么回事。

代码语言:javascript
运行
复制
Dump of assembler code for function phase_5:
           0x08048edc <+0>:     push   %ebp
           0x08048edd <+1>:     mov    %esp,%ebp
           0x08048edf <+3>:     push   %edi
           0x08048ee0 <+4>:     push   %esi
           0x08048ee1 <+5>:     push   %ebx
           0x08048ee2 <+6>:     sub    $0x2c,%esp
           0x08048ee5 <+9>:     mov    0x8(%ebp),%eax
           0x08048ee8 <+12>:    mov    %eax,(%esp)
           0x08048eeb <+15>:    call   0x80490a0 <string_length>
           0x08048ef0 <+20>:    cmp    $0x6,%eax
           0x08048ef3 <+23>:    je     0x8048efa <phase_5+30>
           0x08048ef5 <+25>:    call   0x8049341 <explode_bomb>
           0x08048efa <+30>:    mov    $0x0,%eax
        => 0x08048eff <+35>:    lea    -0x1f(%ebp),%ecx
           0x08048f02 <+38>:    mov    $0x804a4e0,%edx
           0x08048f07 <+43>:    mov    0x8(%ebp),%ebx
           0x08048f0a <+46>:    movsbl (%ebx,%eax,1),%esi
           0x08048f0e <+50>:    and    $0xf,%esi
           0x08048f11 <+53>:    movzbl (%edx,%esi,1),%esi
           0x08048f15 <+57>:    mov    %esi,%ebx
           0x08048f17 <+59>:    mov    %bl,(%ecx,%eax,1)
           0x08048f1a <+62>:    add    $0x1,%eax
           0x08048f1d <+65>:    cmp    $0x6,%eax
           0x08048f20 <+68>:    jne    0x8048f07 <phase_5+43>
           0x08048f22 <+70>:    movb   $0x0,-0x19(%ebp)
           0x08048f26 <+74>:    movl   $0x804a4b7,0x4(%esp)
           0x08048f2e <+82>:    lea    -0x1f(%ebp),%eax
           0x08048f31 <+85>:    mov    %eax,(%esp)
           0x08048f34 <+88>:    call   0x80490bb <strings_not_equal>
           0x08048f39 <+93>:    test   %eax,%eax
           0x08048f3b <+95>:    je     0x8048f42 <phase_5+102>
           0x08048f3d <+97>:    call   0x8049341 <explode_bomb>
           0x08048f42 <+102>:   add    $0x2c,%esp
           0x08048f45 <+105>:   pop    %ebx
           0x08048f46 <+106>:   pop    %esi
           0x08048f47 <+107>:   pop    %edi
           0x08048f48 <+108>:   pop    %ebp
           0x08048f49 <+109>:   ret    
        End of assembler dump.
EN

回答 2

Stack Overflow用户

发布于 2014-02-28 05:27:48

这是函数的反编译。

代码语言:javascript
运行
复制
/**
 *         + 8: arg0
 *         + 4: Return Address
 * EBP       0: Old EBP
 *         - 4: Saved EDI
 *         - 8: Saved ESI
 *         -12: Saved EBX
 * 
 *         -25: NUL character
 *         -31: Beginning of 6-char string
 * 
 * ESP+4 = -52: argument 1 for callees
 * ESP+0 = -56: argument 0 for callees
 */

u8 GBL0[16] = {,,,,,,,,,,,,,,,};/* ADDRESS 0x804a4e0 */
u8 GBL1[]   = {,,,,,,'\0'};     /* ADDRESS 0x804a4b7 */

phase_5(i8* arg0){
    i8   PAD0[12];/* ADDRESS EBP-0x18 */
    u8   LOC0[7]; /* ADDRESS EBP-0x1f */
    i8   PAD1[25];/* ADDRESS EBP-0x38 = ESP+0 */
                  /* The range [EBP-56, EBP-48) corresponds to
                     the range [ESP+0,  ESP+8)  and is used to
                     place arguments for function calls. */
    register int eax;/* In EAX */

    if(string_length(arg0) != 6){
        explode_bomb();
    }

    for(eax=0;eax<6;eax++){
        LOC0[eax] = GBL0[arg0[eax] & 0xF];
    }

    LOC0[6] = '\0';/* ADDRESS EBP-0x19 */

    if(eax = strings_not_equal(LOC0, GBL1)){
        explode_bomb();
    }

    return eax;/* Maybe? */
}

从本质上讲,当且仅当参数是6个字符的“字符串”,并且成功地将其替换为等于某个密码的6个字符的字符串时,它才不会爆炸炸弹。

票数 3
EN

Stack Overflow用户

发布于 2018-10-04 06:12:41

movzbw:字节(8位)到字(16位)

movzwl:字(16位)到长(32位)

movzbl:字节(8位)到长(32位)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22032475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档