저는 Linux 용 PE 프로세스 로더를 사용하고 있습니다. 내 생각에 나는 기초를 털어 놓았다. 내가 사용하는 코드의 대부분은 binfmt_elf.c
과 binfmt_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...
을, 내가 할 수있을 것 : 완전히 레지스터 덤프에서, 변경하고, 그 첫 번째 명령 적 실행되는 것을 표시되지 않습니다 그것을 해결하기 위해. 나는 스택 프레임을 설정하는 데 사용하는 코드가 조금은 있을지도 모른다고 의심하고 있지만, 그게 원인인지 알 수있는 방법을 모르겠습니다. 나는 이것이 정말로 특정한 질문이라는 것을 알고 있지만 누군가가 나에게 조언을 해줄 수 있기를 바라고 있습니다.
mmap : ed 메모리에 실행 권한이 있습니까? –
@ JensBjörnhager 보호 기능이 매핑됩니다. 'PROT_READ | PROT_EXEC'와 플래그'MAP_PRIVATE | MAP_FIXED | MAP_DENYWRITE'. 그것은 내가 말할 수있는 한 ELF 로더가하는 것과 같은 방식입니다. – nosuchthingasstars
'4d 5a ...'는 의심스럽게 MS-DOS 헤더처럼 보입니다. 실수로 그걸 어떻게 든 매핑하지 않았습니까? – atomicinf