Challenge RE #21

Challenge #21 description it’s quite simple

This is easy. What does the following code do?

We can assume this will be easy.

Analysis

Here’s the assembly code we need to analyze

f1:
        push    r12
        push    rbp
        mov     rbp, rdi
        push    rbx
        mov     rbx, rsi

        ;; strlen(rdi);
        call    strlen

        ;; strlen(rbx);
        mov     rdi, rbx
        mov     r12, rax
        call    strlen

        ;; size_1 -= size_2;
        sub     r12, rax

        mov     rsi, rbx
        lea     rdi, [rbp+0+r12]
        call    strcmp

        pop     rbx
        test    eax, eax
        pop     rbp
        sete    al
        pop     r12
        ret

) We have two calls to strlen and one to strcmp. With this in mind we can assume we receive two strings as arguments of our function.

Right after the calls to strlen we have the following instruction

sub r12, rax

In r12 we stored the result of our first call to strlen, so with this instruction we are computing the difference in length of these two strings. The following three instructions perform a comparison in size of strings rbx and [rbp+0+r12].

mov     rsi, rbx
lea     rdi, [rbp+0+r12]
call    strcmp

In r12 we have the result of the difference, so if for str1 we have str1_size, and for str2 we have str2_size, then in r12 we have str1_size - str2_size. Hence these three instructions can be expressed in this way

size_t s1 = strlen(str1);
size_t s2 = strlen(str2);

strcmp((str1+(s1-s2)), str2);

Our last step it’s quite simple also, in case our comparison with strcmp was 0 we return 1, otherwise we return 0.

Formal description

The function takes two strings as arguments and return 1 if one string it’s the suffix of the other, and 0 otherwise.

Conclusion

Coming from the frustration with challenge #19, making this one was quite easy.