BOF원정대 2012.11.17 14:37

[0x01] gate

int main(int argc, char *argv[]){
    char buffer[256];
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
    strcpy(buffer, argv[1]);
    printf("%s\n", buffer);
}

 BOF 계의 printf("Hello, World!\n"); 같은 문제다. BOF 원정대의 기반이 되는 Redhat 6.2에선 생성되는 스택프레임 전후엔 딱히 Dummy같은 것이 없으므로 함수의 지역변수에 필요한 스택의 크기 이후엔 당연히 SFP(Saved Frame Pointer=Saved EBP of caller function)와 RET(Return Address)가 4Byte씩 온다고 생각하면 된다. 

 또한 스택에서 데이터가 실행이 안 된다는 NX(DEP)같은 것도 역시 옛날 리눅스라 그런거 없으니 무시하면 된다. 256Byte의 공간 역시 Shellcode를 넣기엔 충분하다.

 가장 첫 문제니 자잘한 것들을 활용하는 연습을 해야 한다. 원본 실행파일은 gate의 권한으로는 디버깅 할 수 없으므로 gcc로 소스를 gate 권한으로 컴파일 해야하고, 이렇게 컴파일한 프로그램이 segmentation fault를 내면 segmentation fault(core dumped)란 메세지가 나오는데 여기서 core의 중요성에 대해 알아야 한다. core는 프로그램이 비정상적으로 종료되었을 때 메모리의 상태나 레지스터의 값 등을 저장한 일종의 dump 파일로, gdb를 이용해서 비정상적 종료가 일어났을 시점의 메모리의 값이나 레지스터의 값을 볼 수 있다. 이를 이용하여 ret에 채워야 할 주소가 어디인지, eip가 정상적이지 않은 값이 되었는지(ret가 변조되었을 때), 그렇다면 eip가 어떤 값으로 변조되었는지 등을 알 수 있다. core파일을 이용하려면 gdb [실행파일 이름] core 명령어를 이용하면 된다.

Payload

신고

'BOF원정대' 카테고리의 다른 글

[0x03] cobolt  (0) 2012.11.18
[0x02] gremlin  (0) 2012.11.18
[0x01] gate  (0) 2012.11.17
[0x00] 후기  (0) 2012.11.17
VMWare Fusion 5 에서의 부팅 문제  (0) 2012.08.29
1 ... 28 29 30 31 32 33 34 35 36 ... 42


티스토리 툴바