2012-08-16 3 views
2

저는 Linux 용 PE 프로세스 로더를 사용하고 있습니다. 내 생각에 나는 기초를 털어 놓았다. 내가 사용하는 코드의 대부분은 binfmt_elf.cbinfmt_aout.c입니다. 내 테스트 실행 파일에 대한 수 (FASM 형식) 간단하다 :.text가 실행 중 메모리를 덮어 쓰는 중임

format PE GUI 4.0 
entry main 

section '.text' code readable executable 
main: 
    mov eax, 4 
    add eax, 5 
    ret 

이 프로그램 (math1)는 32 비트를 컴파일하고, VM 내가 (주 분투 12.04)에서 실행하고있어 32 비트이기도합니다. 로더를 커널 모듈로 컴파일하고 insmod으로 설치했습니다. 로더가 지금까지 작동하는 것처럼 보입니다. 가능한 모든 단계에서 오류 코드를 확인했습니다. 시작 주소가 0x401000 인 코드 섹션은 mmap이고 그 주소는 start_thread()입니다. 명령 행에 ./math1.exe과 같이 입력하면 내 로더가 실제로 호출됩니다. 그래서, 모든 계획에 따라 간다면, 나는 반환 값 9 때마다 얻을해야합니다. 그러나 실행하는 대신에 math1 segfaults 때마다, 그래서 나는 그것을 열어 gdb 무슨 일이 있었는지 볼 수 있습니다.

실행하기 전에 모든 것이 정상적으로 보입니다. 내가 시작 주소에서 덤프 경우, 나는 (I이 위의 프로그램에 대한 기계 코드임을 확인할 수)해야 정확하게 볼 다음 세그먼트 폴트 후

(gdb) x/9xb 0x401000 
0x401000: 0xb8 0x04 0x00 0x00 0x00 0x83 0xc0 0x05 
0x401008: 0xc3 
(gdb) run 
Starting program: /media/sf_Sandbox/math1.exe 

Program received signal SIGSEGV, Segmentation fault. 
0x00401002 in ??() 

, 동일한 주소에서 덤프, 메모리는있다 나는 이런 일이 뭔가를 만들 것 알고 싶어

(gdb) x/9xb 0x401000 
0x401000: 0x4d 0x5a 0x80 0x00 0x01 0x00 0x00 0x00 
0x401008: 0x04 
(gdb) info all-registers 
eax   0x0 0 
ecx   0x81394e8 135501032 
edx   0x64656d2f 1684368687 
ebx   0x8139548 135501128 
esp   0xbfffe5a0 0xbfffe5a0 
ebp   0xffffffff 0xffffffff 
esi   0x81394e8 135501032 
edi   0x2f7ff4 3112948 
eip   0x401002 0x401002 
eflags   0x210296 [ PF AF SF IF RF ID ] 
cs    0x73 115 
ss    0x7b 123 
ds    0x7b 123 
es    0x7b 123 
fs    0x0 0 
gs    0x0 0 
...more registers... 

을, 내가 할 수있을 것 : 완전히 레지스터 덤프에서, 변경하고, 그 첫 번째 명령 적 실행되는 것을 표시되지 않습니다 그것을 해결하기 위해. 나는 스택 프레임을 설정하는 데 사용하는 코드가 조금은 있을지도 모른다고 의심하고 있지만, 그게 원인인지 알 수있는 방법을 모르겠습니다. 나는 이것이 정말로 특정한 질문이라는 것을 알고 있지만 누군가가 나에게 조언을 해줄 수 있기를 바라고 있습니다.

+0

mmap : ed 메모리에 실행 권한이 있습니까? –

+0

@ JensBjörnhager 보호 기능이 매핑됩니다. 'PROT_READ | PROT_EXEC'와 플래그'MAP_PRIVATE | MAP_FIXED | MAP_DENYWRITE'. 그것은 내가 말할 수있는 한 ELF 로더가하는 것과 같은 방식입니다. – nosuchthingasstars

+2

'4d 5a ...'는 의심스럽게 MS-DOS 헤더처럼 보입니다. 실수로 그걸 어떻게 든 매핑하지 않았습니까? – atomicinf

답변

0

오류는 내 파트의 잘못된 페이지 정렬로 인해 발생했으며, 신비한 16 진 덤프 내용은 사실 문제가되는 PE 파일의 MS-DOS 헤더였습니다. 페이지가 정렬되지 않은 섹션에서 오류가 발생하지 않도록 do_mmap 대신 kernel_readcopy_to_user을 사용하여 수정했습니다.

관련 문제