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