2014-09-14 4 views
-1

모두에게 감사드립니다.엔트리 포인트 및 리턴 포인트 찾기

지난 2 일 동안이 C 프로그램의 코드에 대한 엔트리와 리턴 값을 찾기 위해 애써 왔습니다. 기본적으로 나는 C에서 strcpy 함수를 사용하여 버퍼 오버 플로우를 이해하려고 노력하고있다. 누군가가 나를 도울 수 있다면 정말로 감사 할 것이다. C 프로그램은 : 나는 내성 디버거에서 열 때

#include<stdio.h> 
    #include<string.h> 
    #include<stdlib.h> 
    int main(int argc, char *argv[]) // PROGRAM START 
    { char buf[64];    // Define buf var. 
    // if(argc>1)    // Avoided it to make assembly code short 
     strcpy(buf,argv[1]);  // Copy the argument to buf var 
     printf("%s",buf); 
     return(0);     // EXIT RETURN 

    // system("PAUSE");   // PAUSE THE PROGRAM, Again commented it 
    } 

지금, 그것은 코드의 지옥이다. 나는 (아마 내가 올바른 부분을 떠날거야, 메모리에 메모리 및 문자열로드에서 프로그램 로딩을 떠나.) 아래의 코드를 게시하고 여기에

00401226 . C70424 0100000>MOV DWORD PTR SS:[ESP],1 
0040122D . FF15 D0504000 CALL DWORD PTR DS:[<&msvcrt.__set_app_ty>; msvcrt.__set_app_type 
004. E8 C8FEFFFF CALL buff1.00401100 
004. 90    NOP 
004. 8DB426 0000000>LEA ESI,DWORD PTR DS:[ESI] 
00401240 . 55    PUSH EBP 
00401241 . 89E5   MOV EBP,ESP 
00401243 . 83EC 08  SUB ESP,8 
00401246 . C70424 0200000>MOV DWORD PTR SS:[ESP],2 
0040124D . FF15 D0504000 CALL DWORD PTR DS:[<&msvcrt.__set_app_ty>; msvcrt.__set_app_type 
00401253 . E8 A8FEFFFF CALL buff1.00401100 
00401258 . 90    NOP 
00401259 . 8DB426 0000000>LEA ESI,DWORD PTR DS:[ESI] 
00401260 $ 55    PUSH EBP 
00401261 . 8B0D E8504000 MOV ECX,DWORD PTR DS:[<&msvcrt.atexit>] ; msvcrt.atexit 
00401267 . 89E5   MOV EBP,ESP 
00401269 . 5D    POP EBP 
0040126A . FFE1   JMP ECX 
0040126C  8D7426 00  LEA ESI,DWORD PTR DS:[ESI] 
00401270 . 55    PUSH EBP 
00401271 . 8B0D DC504000 MOV ECX,DWORD PTR DS:[<&msvcrt._onexit>] ; msvcrt._onexit 
00401277 . 89E5   MOV EBP,ESP 
00401279 . 5D    POP EBP 
0040127A . FFE1   JMP ECX 
0040127C  90    NOP 
0040127D  90    NOP 
0040127E  90    NOP 
0040127F  90    NOP 
00401280 > 55    PUSH EBP 
00401281 . 89E5   MOV EBP,ESP 
00401283 . 5D    POP EBP 
00401284 . E9 67020000 JMP buff1.004014F0 
00401289  90    NOP 
0040128A  90    NOP 
0040128B  90    NOP 
0040128C  90    NOP 
0040128D  90    NOP 
0040128E  90    NOP 
0040128F  90    NOP 
00401290 /$ 55    PUSH EBP 
00401291 |. 89E5   MOV EBP,ESP 
00401293 |. 83EC 68  SUB ESP,68 
00401296 |. 83E4 F0  AND ESP,FFFFFFF0 
00401299 |. B8 00000000 MOV EAX,0 
0040129E |. 83C0 0F  ADD EAX,0F 
004012A1 |. 83C0 0F  ADD EAX,0F 
004012A4 |. C1E8 04  SHR EAX,4 
004012A7 |. C1E0 04  SHL EAX,4 
004012AA |. 8945 B4  MOV DWORD PTR SS:[EBP-4C],EAX 
004012AD |. 8B45 B4  MOV EAX,DWORD PTR SS:[EBP-4C] 
004012B0 |. E8 7B040000 CALL buff1.00401730 
004012B5 |. E8 16010000 CALL buff1.004013D0 
004012BA |. 8B45 0C  MOV EAX,DWORD PTR SS:[EBP+C]    ; || 
004012BD |. 83C0 04  ADD EAX,4        ; || 
004012C0 |. 8B00   MOV EAX,DWORD PTR DS:[EAX]    ; || 
004012C2 |. 894424 04  MOV DWORD PTR SS:[ESP+4],EAX    ; || 
004012C6 |. 8D45 B8  LEA EAX,DWORD PTR SS:[EBP-48]   ; || 
004012C9 |. 890424   MOV DWORD PTR SS:[ESP],EAX    ; || 
004012CC |. E8 5F050000 CALL <JMP.&msvcrt.strcpy>    ; |\strcpy 
004012D1 |. 8D45 B8  LEA EAX,DWORD PTR SS:[EBP-48]   ; | 
004012D4 |. 894424 04  MOV DWORD PTR SS:[ESP+4],EAX    ; | 
004012D8 |. C70424 0030400>MOV DWORD PTR SS:[ESP],buff1.00403000 ; |ASCII "%s" 
004012DF |. E8 3C050000 CALL <JMP.&msvcrt.printf>    ; \printf 
004012E4 |. B8 00000000 MOV EAX,0 
004012E9 |. C9    LEAVE 
004012EA \. C3    RETN 
004012EB  90    NOP 
004012EC  90    NOP 
004012ED  90    NOP 
004012EE  90    NOP 
004012EF  90    NOP 
004012F0 /$ 55    PUSH EBP 
004012F1 |. B9 F0304000 MOV ECX,buff1.004030F0 
004012F6 |. 89E5   MOV EBP,ESP 
004012F8 |. EB 14   JMP SHORT buff1.0040130E 
004012FA | 8DB6 00000000 LEA ESI,DWORD PTR DS:[ESI] 
00401300 |> 8B51 04  MOV EDX,DWORD PTR DS:[ECX+4] 
00401303 |. 8B01   MOV EAX,DWORD PTR DS:[ECX] 
00401305 |. 83C1 08  ADD ECX,8 
00401308 |. 0182 00004000 ADD DWORD PTR DS:[EDX+400000],EAX 
0040130E |> 81F9 F0304000 CMP ECX,buff1.004030F0 
00401314 |.^72 EA   JB SHORT buff1.00401300 
00401316 |. 5D    POP EBP 
00401317 \. C3    RETN 
00401318  90    NOP 
00401319  90    NOP 
0040131A  90    NOP 
0040131B  90    NOP 
0040131C  90    NOP 
0040131D  90    NOP 
0040131E  90    NOP 
0040131F  90    NOP 
00401320 /$ 55    PUSH EBP 
00401321 |. 89E5   MOV EBP,ESP 
00401323 |. DBE3   FINIT 
00401325 |. 5D    POP EBP 
00401326 \. C3    RETN 
00401327  90    NOP 
00401328  90    NOP 
00401329  90    NOP 
0040132A  90    NOP 
0040132B  90    NOP 
0040132C  90    NOP 
0040132D  90    NOP 
0040132E  90    NOP 
0040132F  90    NOP 
00401330 /. 55    PUSH EBP 
00401331 |. 89E5   MOV EBP,ESP 
00401333 |. 83EC 08  SUB ESP,8 
00401336 |. A1 20204000 MOV EAX,DWORD PTR DS:[402020] 
0040133B |. 8B08   MOV ECX,DWORD PTR DS:[EAX] 
0040133D |. 85C9   TEST ECX,ECX 

이 프로그램에 대한 6 개 호출 기능 (프로그램 이름이 있습니다 buff1를) strcpy 함수가 호출되기 전에. 어느 것이 MAIN 함수의 진입 점인지 이해할 수 없습니다. 그리고 어느 시점부터 되돌아 간다. 이 시간을 살려주에 대한 모든

감사합니다 ...

마크

답변

1

나는 그것이 00401290 생각했다. 스택 포인터 뒤에있는 첫 번째 작업은 스택에 buf을 푸시합니다. RET004012EA에 반환합니다.

1

linux를 사용하는 경우 gdb를 사용하면 많은 문제를 방지 할 수 있습니다.
gdb (gdb <exec_file>)에 프로그램을로드하고 main (disass main)을 디스 어셈블합니다.
gdb가 전체 기능을 덤프 할 때까지 '입력'을 계속 누릅니다.

gdb는 기본적으로 외부에서 혼동되어 gdb 명령을 사용하여 (gdb에서 인텔 표기법 사용) set disassembly-flavor intel을 gdb 명령 프롬프트로 변경하기 위해 AT & T 어셈블리 구문을 사용합니다.

Linux를 사용하지 않는 경우 Visual Studio (Express 버전은 개인적인 용도로는 무료 임) 또는 사용 가능한 좋은 디버거를 사용하는 것이 좋습니다. 나는 정확한 절차가 무엇인지 모르겠지만, 할 수 있다는 것을 알고있다.

어셈블리 덤프에서 함수의 진입 점을 찾는 것은 수동으로하고 싶지 않습니다.

마지막주의 사항, Linux를 사용하고 디버그 기호가있는 어셈블리를 많이 읽는다면 objdump는 매우 유용한 도구입니다.

+0

감사합니다. 나는 GCC, GDB를 먼저 이해해야 만 쉽게 이해할 수있을 것이다. 전에 사용했지만 Windows 응용 프로그램을 사용해보고 싶었습니다. 감사. 내 리눅스 박하가 C 프로그램을 컴파일 할 수없는 이유는 무엇입니까? 컴파일하는 동안 , 헤더 파일에 오류가 발생합니다. 컴파일러에서 무엇을 변경해야합니까? – kriss

관련 문제