stack stringsとは

stack stringsのメモ

ソースコード。Hello Worldの文字列を一文字ずつ配列に代入している。


#include <stdio.h>

int main(void)
{
    char str[12];

    str[0] = 'H';
    str[1] = 'e';
    str[2] = 'l';
    str[3] = 'l';
    str[4] = 'o';
    str[5] = ' ';
    str[6] = 'W';
    str[7] = 'o';
    str[8] = 'r';
    str[9] = 'l';
    str[10] = 'd';
    str[11] = '\0';

    printf("%s\n", str);

    return 0;
}

実行結果


$ gcc -o stackstrings.out stackstrings.c 
$ 
$ ./stackstrings.out 
Hello World

stringsコマンドの実行結果。


$ strings stackstrings.out
/lib64/ld-linux-x86-64.so.2
libc.so.6
puts
__stack_chk_fail
__libc_start_main
__gmon_start__
GLIBC_2.4
GLIBC_2.2.5
UH-H
UH-H
[]A\A]A^A_
;*3$
$ strings stackstrings.out | grep Hello
$ strings stackstrings.out | grep World


Hello Worldという文字列が見つからない。これはHello Worldを連続した文字列としてではなく、一文字ずつ配列に代入しているため。stringsコマンドはデフォルトでは4文字未満の文字列は出力しない。

該当箇所の逆アセンブル。


mov     [rbp+s], 48h    ; H
mov     [rbp+var_1F], 65h ; e
mov     [rbp+var_1E], 6Ch ; l
mov     [rbp+var_1D], 6Ch ; l
mov     [rbp+var_1C], 6Fh ; o
mov     [rbp+var_1B], 20h
mov     [rbp+var_1A], 57h ; W
mov     [rbp+var_19], 6Fh ; o
mov     [rbp+var_18], 72h ; r
mov     [rbp+var_17], 6Ch ; l
mov     [rbp+var_16], 64h ; d
mov     [rbp+var_15], 0
lea     rax, [rbp+s]
mov     rdi, rax        ; s
call    _puts

参考
https://www.fireeye.com/blog/threat-research/2016/06/automatically-extracting-obfuscated-strings.html

Leave a Reply

Your email address will not be published. Required fields are marked *