📄 i386-linux.elf.shell-fold.s
字号:
/*; i386-linux.elf.shell-fold.S -- Linux program entry point & decompressor (shell script);; This file is part of the UPX executable compressor.;; Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer; Copyright (C) 1996-2007 Laszlo Molnar; Copyright (C) 2000-2007 John F. Reiser; All Rights Reserved.;; UPX and the UCL library are free software; you can redistribute them; and/or modify them under the terms of the GNU General Public License as; published by the Free Software Foundation; either version 2 of; the License, or (at your option) any later version.;; This program is distributed in the hope that it will be useful,; but WITHOUT ANY WARRANTY; without even the implied warranty of; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License; along with this program; see the file COPYING.; If not, write to the Free Software Foundation, Inc.,; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.;; Markus F.X.J. Oberhumer Laszlo Molnar; <mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>;; John F. Reiser; <jreiser@users.sourceforge.net>;*/#include "arch/i386/macros.S"#define PAGE_SIZE ( 1<<12)#define szElf32_Ehdr 0x34#define szElf32_Phdr 8*4#define e_entry (16 + 2*2 + 4)#define szl_info 12#define szp_info 12#define a_type 0#define a_val 4#define sz_auxv 8fold_begin: // In: %ebx= uncDst; edx= &b_info cprSrc; ebp = &decompress// Move argc,argv,envp down to make room for complete Elf_auxv table.// Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM// because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)// give not quite everything. It is simpler and smaller code for us// to generate a "complete" table where Elf_auxv[k -1].a_type = k.// ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance#define AT_NULL 0#define AT_IGNORE 1#define AT_PHDR 3#define AT_NUMBER (5+ 37)// 2002-11-09 glibc-2.2.90 AT_IGNOREPPC==22 plus 5 for future growth// 2006-05-15 glibc-2.4-4 AT_L3_CACHESHAPE==37 mov esi, esp sub esp, sz_auxv * AT_NUMBER // more than 128 bytes mov edi, espdo_auxv: // entry: %esi=src = &argc; %edi=dst. exit: %edi= &AT_NULL // cldL10: // move argc+argv lodsd stosd test eax,eax jne L10L20: // move envp lodsd stosd test eax,eax jne L20// complete Elf_auxv table full of AT_IGNORE push edi // save base of resulting table inc eax // convert 0 to AT_IGNORE push 2 * (AT_NUMBER -1) // less than 128 pop ecx rep stosd dec eax // convert AT_IGNORE into AT_NULL stosd // terminate Elf_auxv stosd pop edi // base of resulting tableL30: // distribute existing Elf32_auxv into new table lodsd test eax,eax // AT_NULL ? xchg eax,ecx // edx is busy, do not use lodsd je L40 cmp ecx, AT_NUMBER jae L30 mov [a_type - sz_auxv + sz_auxv*ecx + edi], ecx mov [a_val - sz_auxv + sz_auxv*ecx + edi], eax jmp L30L40:#define OVERHEAD 2048#define MAX_ELF_HDR 512 sub esp, MAX_ELF_HDR + OVERHEAD xchg eax, ebx // eax= uncDst mov ecx, [ edx] // sz_unc mov ebx, [4+ edx] // sz_cpr mov esi, eax // extra copy of uncDst pusha // (AT_table,uncDst,f_decpr,&ehdr,{sz_cpr,cprSrc},{sz_unc,uncDst}).extern upx_main call upx_main // entry = upx_main(...) pop ecx // junk push eax // save entry address popa // edi= entry address; esi= uncDst add esp, MAX_ELF_HDR + OVERHEAD // remove temp space pop ecx // argc pop edx // $0 filename, to become argv[0] push edx // restore $0 filename inc ecx push esi // &uncompressed shell script sub esi, 3 mov word ptr [esi], 0x632d // "-c" inc ecx push esi // &"-c" inc ecx push edx // argv[0] is duplicate of $0 push ecx // new argc push edi // save entry address// _dl_start and company (ld-linux.so.2) assumes that it has virgin stack,// and does not initialize all its stack local variables to zero.// Ulrich Drepper (drepper@cyngus.com) has refused to fix the bugs.// See GNU wwwgnats libc/1165 .#define N_STKCLR (0x100 + MAX_ELF_HDR + OVERHEAD)/4 lea edi, [esp - 4*N_STKCLR] pusha // values will be zeroed mov ebx,esp // save mov esp,edi // Linux does not grow stack below esp mov ecx, N_STKCLR xor eax,eax rep stosd mov esp,ebx // restore// Because the decompressed shell script occupies low memory anyway,// there isn't much payback to unmapping the compressed script and// ourselves the stub. We would need a place to put the escape hatch// "int $0x80; popa; ret", and some kernels do not allow execution// on the stack. So, we would have to dirty a page of the shell// or of /lib/ld-linux.so. It's simpler just to omit the unmapping. popa ret#define __NR_mmap 90mmap: .globl mmap push ebx lea ebx, [2*4 + esp] push __NR_mmap pop eax int 0x80 pop ebx ret// vi:ts=8:et:nowrap
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -