有人可以帮助理解这个汇编代码来尝试逆向工程吗?

时间:2017-09-09 06:14:17

标签: c assembly

这是一个disas函数,它接受输入并阻止炸弹爆炸。

0x00000000004011ca <+0>:     sub    $0x8,%rsp                 #reserve 8 bytes on stack
0x00000000004011ce <+4>:     cmpb   $0x37,0x1(%rdi)           #compare 0x37 ('7') with second character of input
0x00000000004011d2 <+8>:     jne    0x4011df <phase_1+21>     #explode bomb if not equal
0x00000000004011d4 <+10>:    cmpb   $0x5d,0x2(%rdi)           #compare 0x5d (']') with third character of input
0x00000000004011d8 <+14>:    jne    0x4011df <phase_1+21>     #explode bomb if not equal
0x00000000004011da <+16>:    cmpb   $0x5a,(%rdi)              #compare 0x5a ('Z') with first character of input
0x00000000004011dd <+19>:    je     0x4011ed <phase_1+35>     #if all equal, skip bomb explosion
0x00000000004011df <+21>:    callq  0x401c01 <bomb_ignition>  #bomb explode
0x00000000004011e4 <+26>:    mov    $0xffffffffffffffff,%rax  #rax = -1
0x00000000004011eb <+33>:    jmp    0x401200 <phase_1+54>     #end 
0x00000000004011ed <+35>:    movsbl 0xf(%rdi),%eax            //need help here
0x00000000004011f1 <+39>:    add    $0x1b,%eax
0x00000000004011f4 <+42>:    movsbl 0xe(%rdi),%edx
0x00000000004011f8 <+46>:    cmp    %edx,%eax
0x00000000004011fa <+48>:    sete   %al
0x00000000004011fd <+51>:    movzbl %al,%eax
0x0000000000401200 <+54>:    add    $0x8,%rsp
0x0000000000401204 <+58>:    retq 

我注释了我认为它对#所做的事情。如果我错了,请告诉我。我需要帮助弄清楚它在第一个movsbl之后和之后做了什么。从阅读开始,我认为它将%rdi延长了15,然后将其放入%eax。然后增加27.对于什么,我不知道。然后它将%rdi延长14并将其放入%edx。它比较,如果相等,则设置标志%al?然后将%al移至%eax。然后清除堆栈空间。然后返回。

在我理解任何事情的任何地方我都出错了吗?有人可以澄清一下movsbl在做什么吗?任何帮助都表示赞赏。感谢

1 个答案:

答案 0 :(得分:1)

movsbl 0xf(%rdi),%eax

movsbl使用 s ign扩展名移动字节为长,因此int8_t会提升为int32_t;即

int32_t eax = *((int8_t *)(rdi + 0xf));

这意味着signed value as interpreted according to the two's complement stays the same,如果int8_t持有, -1int32_t也会-1。但是,如果解释为无符号,则相应的值将为0xFF0xFFFFFFFF,这些值显然不同。未签名的促销会改为零扩展,因此在此使用movzbl会将0xFF扩展为0x000000FF;零扩展确保扩展后的无符号值是相同的

然后另一个不太明显的指示是

sete   %al

等于

uint8_t al = <previous comparison equal/set zero flag> ? 1: 0;

设置al不会重置eaxrax中的其余位,因此,指令

movzbl %al,%eax

使用 z ero扩展程序将字节移动到long,即无符号促销:

uint32_t eax = (uint8_t)al;

这基本上将rax中的所有高阶位8- 63 归零,因为设置eax也会重置高阶位。

默认返回值在累加器中,因此该函数返回10以及所有intN_tuintN_t,其中N为8,16,32,对于原型中的返回类型,64将起作用。