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
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
BOF원정대 2012.11.17 14:26

[0x00] 후기


 2012년 8월 27일에 첫 문제를 푼 것으로 기록되어 있는(첫 문제를 풀고 나서 찍은 스크린샷의 일자가 8월 27일 이다.) Hackerschool BOF 원정대 Redhat을 2012년 11월 17일인 오늘 그 끝을 보게 되었다. 문제들을 풀어가면서 느낀 점은, 첫 술 뜨기가 가장 어렵다는 것과, 절대 해설을 보면서 풀면 안 된다는 것이었다. 해설을 본 순간, 자신이 이 문제를 풀기 위해 스스로 이끌어 내야 하는 어떠한 사고작용도 소용없게 되기 때문이다. 그래서 푸는 동안에 막히는 문제에서 필자 역시 고민이 꽤나 많았다. 그리고 몇몇 문제에서는 정말 리눅스에 대해 많은 것을 체계적으로 알지 못하는 대부분의 사람들의 경우 그 풀이법을 알아낼 확률이 희박한 경우가 많았다(필자도 그 중에 한 사람이다). 

 구글에서 BOF 원정대의 몹 이름만 검색해도 검색되는 풀이가 10개는 족히 되는 마당에 이런 경우엔 누구나 해설에 대한 유혹에 이끌릴 수 밖에 없을 것이다(적어도 그걸 찾아볼 열의는 있는 사람이니까!). 그래서 이 카테고리에 쓰는 풀이들은 힌트 위주로, 정 모르겠으면, 정말 최후의 수단으로 payload의 구조를 제시해주는 수준이 될 것이다(그냥 읽으면 보이지 않도록, 보기 전에 자신이 꼭 이걸 봐야되는가에 대해 한번쯤 생각해보길). 아무쪼록 이후에 BOF 원정대를 풀어볼 다른 사람들에게 내 풀이는 자신의 사고를 제한해버리는 계기가 아닌, 영감이 떠오르도록 해주는 조언으로 다가왔으면 좋겠다.

신고

'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


티스토리 툴바