BOF원정대 2012.11.18 19:52

[0x02] gremlin

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


 gate와 별로 다른 점은 없지만, 버퍼의 크기가 16Byte라는 차이점이 있다. 현존하는 Shellcode(RTL은 제외) 중에 16Byte보다 작은 크기의 Shellcode는 없다. 결국, Shellcode를 저장할 곳이 Buffer가 아니어야 한다는 것이다. 즉, 버퍼가 아닌 쉘코드 저장 장소를 찾는 것이 이번 문제의 목적이다. 그 장소는 환경 변수가 있는 곳일수도 있고, argv[1]일 수도 있고 argv[2] 일 수도 있고... 어디에 Shellcode를 저장할지는 푸는 사람 마음대로다. Shellcode를 저장하는데 성공했다면 그 이후는 말할 것도 없다. 다만 주의할 점은, 환경 변수의 위치나 argv[1], argv[2] 등의 주소는 무언가에 따라 조금씩 달라진다는 점이다(이는 프로그램 실행시마다 Segment마다 할당된 주소가 Random이 되는 ASLR과는 다르다). 그 규칙을 알아내는 것이 결정타.

Hint: export, env, getenv(), argc, argv

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


티스토리 툴바